module Music.Theory.Tuning.Scala.Interval where
import Data.Char
import Data.List
import qualified Music.Theory.Read as T
import qualified Music.Theory.Tuning.Scala as T
type INTERVAL = (Rational,String)
type INTNAM = (Int,[INTERVAL])
intnam_search_ratio :: INTNAM -> Rational -> Maybe INTERVAL
intnam_search_ratio (_,i) x = find ((== x) . fst) i
intnam_search_description_ci :: INTNAM -> String -> [INTERVAL]
intnam_search_description_ci (_,i) x =
let downcase = map toLower
x' = downcase x
in filter (isInfixOf x' . downcase . snd) i
parse_intnam_entry :: [String] -> INTERVAL
parse_intnam_entry w =
case w of
r:w' -> (T.read_ratio_with_div_err r,unwords w')
_ -> error "parse_intnam_entry"
parse_intnam :: [String] -> INTNAM
parse_intnam l =
case l of
_:n:i -> let n' = read n :: Int
i' = map (parse_intnam_entry . words) i
in if n' == length i' then (n',i') else error "parse_intnam"
_ -> error "parse_intnam"
load_intnam :: IO INTNAM
load_intnam = do
l <- T.load_dist_file "intnam.par"
return (parse_intnam (T.filter_comments l))