\begin{code}
module Music.Analysis.ABC where
import Data.List
data ABCMusic = ABCMusic ABCMetaData [ABCMusicData]
deriving (Eq)
data ABCMetaData = ABCMetaData ABCIndex ABCTitle ABCMeter ABCKey
ABCL
deriving (Eq)
data ABCIndex = ABCIndex String deriving (Eq)
data ABCTitle = ABCTitle String deriving (Eq)
data ABCMeter = ABCMeter String deriving (Eq)
data ABCKey = ABCKey String deriving (Eq)
data ABCL = ABCL deriving (Eq)
data ABCMusicData = Single ABCNote
| Tuplet Int [ABCMusicData]
| Chord [ABCMusicData]
| Tie ABCMusicData ABCMusicData
| Slur [ABCMusicData]
| Staccato ABCMusicData
| GraceNotes [ABCNote] ABCMusicData
| Symbol String ABCNote
| Bar
deriving (Eq)
data ABCNote = Pitch Pitch Octave Accident Duration Dotted
| Rest Bool Duration
deriving (Eq)
data Pitch = C | D | E | F | G | A | B
deriving (Show, Eq)
data Accident = Accident (Maybe Accidental)
deriving Eq
data Accidental = Sharp Int | Natural | Flat Int
deriving (Eq)
data Dotted = Increase Int | Decrease Int
deriving (Eq)
data Octave = Octave Int
deriving (Eq)
data Duration = Duration (Int, Int)
deriving (Eq)
\end{code}
\begin{code}
instance Show ABCMusic where
show (ABCMusic x xs) = show x ++ unwords (map show xs)
instance Show ABCMetaData where
show (ABCMetaData a b c d e) = unlines [show a, show b, show c, show e, show d]
instance Show ABCIndex where
show (ABCIndex x) = "X:" ++ x
instance Show ABCTitle where
show (ABCTitle t) = "T:" ++ t
instance Show ABCMeter where
show (ABCMeter m) = "M:" ++ m
instance Show ABCKey where
show (ABCKey k) = "K:" ++ k
instance Show ABCL where
show ABCL = "L: 1/4"
instance Show ABCMusicData where
show (Single x) = show x
show (Tuplet n xs) = "(" ++ show n ++ show xs
show (Chord xs) = "[" ++ show xs ++ "]"
show (Tie x y) = show x ++ show y
show (Slur xs) = "(" ++ show xs ++ ")"
show (Staccato x) = "." ++ show x
show (GraceNotes xs y) = "{" ++ show xs ++ "}" ++ show y
show (Symbol _ y) = show y
show (Bar) = "|\n"
instance Show ABCNote where
show (Pitch a b c d e) = show c ++ show a ++ show b ++ show d ++ show e
show (Rest True b) = "z" ++ show b
show (Rest False b) = "x" ++ show b
instance Show Octave where
show (Octave o) | o > 0 = replicate o '\''
| o < 0 = replicate o ','
| otherwise = []
instance Show Accident where
show (Accident (Just x)) = show x
show (Accident Nothing) = []
instance Show Accidental where
show (Sharp n) = replicate n '^'
show (Natural) = "="
show (Flat n) = replicate n '_'
instance Show Dotted where
show (Increase n) | n == 0 = []
| otherwise = ">" ++ show n
show (Decrease n) | n == 0 = []
| otherwise = "<" ++ show n
instance Show Duration where
show (Duration (1,1)) = []
show (Duration (1,n)) = "/" ++ show n
show (Duration (n,1)) = show n
show (Duration (x,y)) = show x ++ "/" ++ show y
\end{code}