Scale.hs 750 B

123456789101112131415161718192021222324252627
  1. {-# LANGUAGE ViewPatterns #-}
  2. module Hypsibius.Formats.Scale where
  3. import Data.Adnot
  4. import Data.Sequence (Seq)
  5. import qualified Data.Sequence as S
  6. import Hypsibius.Data (Note(..), Scale(..))
  7. {-
  8. parse :: Text -> Either String (Seq Note)
  9. parse t = case T.lines t of
  10. ((T.takeWhile (/= '#') -> "hypsibius scale"):rs) -> parseLines rs
  11. _ -> Left "Not a valid Hypsibius scale: missing header\n"
  12. parseLines :: [Text] -> Either String (Seq Note)
  13. parseLines [] = pure S.empty
  14. parseLines (l:ls) =
  15. case T.words (T.takeWhile (/= '#') l) of
  16. [] -> parseLines ls
  17. [cents, name] ->
  18. let n = Note (read (T.unpack cents)) name
  19. in (n S.<|) <$> parseLines ls
  20. rs -> Left ("Bad declaration: " ++ show rs)
  21. -}