module Music.Typesetting.Model where
import Music.Theory.Duration
import Music.Theory.Key
import Music.Theory.Pitch
data Dynamic_Mark_T = PPPPP | PPPP | PPP | PP | P | MP
| MF | F | FF | FFF | FFFF | FFFFF
| FP | SF | SFP | SFPP | SFZ | SFFZ
deriving (Eq,Ord,Bounded,Show)
data Articulation_T = Accent
| Staccato
| Tenuto
deriving (Eq,Ord,Show)
data Clef_T = Bass | Tenor | Alto | Treble | Percussion
deriving (Eq,Ord,Show)
type Time_Signature_T = (Integer,Integer)
data Placement_T = Above | Below
deriving (Eq,Ord,Show)
type Tuplet_T = (Integer,Duration,Integer,Duration)
type Tempo_Marking_T = (Duration,Integer)
data N_Annotation = N_Grace | N_Chord
| N_Pitch Pitch | N_Unpitched
| N_Rest
| N_Begin_Slur | N_End_Slur
| N_Begin_Tied | N_End_Tied
| N_Begin_Tuplet (Maybe Tuplet_T) | N_End_Tuplet
| N_Stem_Tremolo Integer
| N_Articulation Articulation_T
| N_Dynamic_Mark Dynamic_Mark_T
| N_Crescendo | N_Diminuendo | N_End_Hairpin
| N_Voice Integer
| N_Backup [Duration]
| N_Natural_Harmonic
deriving (Eq,Ord,Show)
data Note = Note {n_duration :: Duration
,n_annotations :: [N_Annotation]}
deriving (Eq,Show)
data M_Annotation = M_Division Integer
| M_Key Note_T (Maybe Alteration_T) Mode_T
| M_Tempo_Marking Tempo_Marking_T
| M_Time_Signature Time_Signature_T
| M_Clef Clef_T Integer
deriving (Eq,Ord,Show)
data Measure = Measure { m_annotations :: [M_Annotation]
, m_notes :: [Note] }
deriving (Eq,Show)
type Name = (String,String)
data Group_Symbol_T = None
| Brace
| Line
| Bracket
deriving (Eq,Show)
data P_Annotation = P_Name Name
deriving (Eq,Show)
data G_Annotation = G_Name Name
| G_Symbol Group_Symbol_T
deriving (Eq,Show)
type ID = Integer
data Part = Part (Maybe ID) [P_Annotation] [Measure]
| Group (Maybe ID) [G_Annotation] [Part]
deriving (Eq,Show)
data Score = Score [Part]
deriving (Eq,Show)