module Note where pitch :: Char -> Int -> Int -> (Char, Int) pitch char nt oct = (char, nt+oct*12) c,d,e,f,g,a,b :: Int -> (Char, Int) c = pitch 'C' 0 d = pitch 'D' 2 e = pitch 'E' 4 f = pitch 'F' 5 g = pitch 'G' 7 a = pitch 'A' 9 b = pitch 'B' 11 (#) :: (a -> (Char, Int)) -> a -> (Char, Int) noteFunc # oct = ('#', succ $ snd $ noteFunc oct) infixr 5 .:, |: (.:), (|:) :: a -> [(Bool, a)] -> [(Bool, a)] x .: xs = (False,x) : xs x |: xs = (True, x) : xs pitches15, pitches30 :: [(Bool, (Char, Int))] pitches15 = c 0 .: d 0 .: e 0 |: f 0 .: g 0 |: a 0 .: b 0 |: c 1 .: d 1 |: e 1 .: f 1 |: g 1 .: a 1 .: b 1 .: c 2 .: [] pitches30 = c 0 .: d 0 .: g 0 .: a 0 .: b 0 .: c 1 .: d 1 .: e 1 |: f 1 .: f#1 .: g 1 |: g#1 .: a 1 .: a#1 .: b 1 |: c 2 .: c#2 .: d 2 |: d#2 .: e 2 .: f 2 |: f#2 .: g 2 .: g#2 .: a 2 .: a#2 .: b 2 .: c 3 .: d 3 .: e 3 .: []