module Mezzo.Render.Score
(
Attributes (..)
, defAttributes
, getTimeSig
, getKeySig
, score
, section
, setTempo
, setTimeSig
, setKeySig
, setRuleSet
, free
, classical
, strict
)
where
import Mezzo.Model
import Mezzo.Compose.Harmony
import Mezzo.Compose.Builder
import Codec.Midi hiding (key, Key)
import qualified Codec.Midi as CM (key, Key)
import qualified GHC.TypeLits as GT
import Prelude hiding (min)
data Attributes t k r =
(Primitive t, Primitive k, ScoreAtt t, ScoreAtt k)
=> Attributes
{ title :: String
, tempo :: Tempo
, timeSignature :: TimeSig t
, keySignature :: KeyS k
, ruleSet :: r
}
defAttributes :: Attributes 4 (Key C Natural MajorMode) Classical
defAttributes = Attributes
{ title = "Composition"
, tempo = 120
, timeSignature = quadruple
, keySignature = c_maj
, ruleSet = classical
}
score :: Spec (Attributes 4 (Key C Natural MajorMode) Classical)
score = spec defAttributes
section :: AMut String (Attributes t k r)
section atts titl = spec (atts {title = titl})
setTempo :: AMut Tempo (Attributes t k r)
setTempo atts temp = spec (atts {tempo = temp})
setTimeSig :: (Primitive t', ScoreAtt t') => AConv (TimeSig t') (Attributes t k r) (Attributes t' k r)
setTimeSig Attributes{..} ts = spec (Attributes title tempo ts keySignature ruleSet)
setKeySig :: (Primitive k', ScoreAtt k') => AConv (KeyS k') (Attributes t k r) (Attributes t k' r)
setKeySig Attributes{..} ks = spec (Attributes title tempo timeSignature ks ruleSet)
setRuleSet :: AConv r' (Attributes t k r) (Attributes t k r')
setRuleSet Attributes{..} rs = spec (Attributes title tempo timeSignature keySignature rs)
getTimeSig :: Attributes t k r -> Message
getTimeSig Attributes{timeSignature = t} = getAtt t
getKeySig :: Attributes t k r -> Message
getKeySig Attributes{keySignature = k} = getAtt k
free :: Free
free = Free
classical :: Classical
classical = Classical
strict :: Strict
strict = Strict
class ScoreAtt a where
getAtt :: proxy a -> Message
instance ScoreAtt 2 where getAtt t = TimeSignature 2 2 24 8
instance ScoreAtt 3 where getAtt t = TimeSignature 3 2 24 8
instance ScoreAtt 4 where getAtt t = TimeSignature 4 2 24 8
instance ScoreAtt (Key C Flat MajorMode) where getAtt k = KeySignature (7) 0
instance ScoreAtt (Key G Flat MajorMode) where getAtt k = KeySignature (6) 0
instance ScoreAtt (Key D Flat MajorMode) where getAtt k = KeySignature (5) 0
instance ScoreAtt (Key A Flat MajorMode) where getAtt k = KeySignature (4) 0
instance ScoreAtt (Key E Flat MajorMode) where getAtt k = KeySignature (3) 0
instance ScoreAtt (Key B Flat MajorMode) where getAtt k = KeySignature (2) 0
instance ScoreAtt (Key F Natural MajorMode) where getAtt k = KeySignature (1) 0
instance ScoreAtt (Key C Natural MajorMode) where getAtt k = KeySignature 0 0
instance ScoreAtt (Key G Natural MajorMode) where getAtt k = KeySignature 1 0
instance ScoreAtt (Key D Natural MajorMode) where getAtt k = KeySignature 2 0
instance ScoreAtt (Key A Natural MajorMode) where getAtt k = KeySignature 3 0
instance ScoreAtt (Key E Natural MajorMode) where getAtt k = KeySignature 4 0
instance ScoreAtt (Key B Natural MajorMode) where getAtt k = KeySignature 5 0
instance ScoreAtt (Key F Sharp MajorMode) where getAtt k = KeySignature 6 0
instance ScoreAtt (Key C Sharp MajorMode) where getAtt k = KeySignature 7 0
instance ScoreAtt (Key A Flat MinorMode) where getAtt k = KeySignature (7) 1
instance ScoreAtt (Key E Flat MinorMode) where getAtt k = KeySignature (6) 1
instance ScoreAtt (Key B Flat MinorMode) where getAtt k = KeySignature (5) 1
instance ScoreAtt (Key F Natural MinorMode) where getAtt k = KeySignature (4) 1
instance ScoreAtt (Key C Natural MinorMode) where getAtt k = KeySignature (3) 1
instance ScoreAtt (Key G Natural MinorMode) where getAtt k = KeySignature (2) 1
instance ScoreAtt (Key D Natural MinorMode) where getAtt k = KeySignature (1) 1
instance ScoreAtt (Key A Natural MinorMode) where getAtt k = KeySignature 0 1
instance ScoreAtt (Key E Natural MinorMode) where getAtt k = KeySignature 1 1
instance ScoreAtt (Key B Natural MinorMode) where getAtt k = KeySignature 2 1
instance ScoreAtt (Key F Sharp MinorMode) where getAtt k = KeySignature 3 1
instance ScoreAtt (Key C Sharp MinorMode) where getAtt k = KeySignature 4 1
instance ScoreAtt (Key G Sharp MinorMode) where getAtt k = KeySignature 5 1
instance ScoreAtt (Key D Sharp MinorMode) where getAtt k = KeySignature 6 1
instance ScoreAtt (Key A Sharp MinorMode) where getAtt k = KeySignature 7 1
instance GT.TypeError (GT.Text "The key signature is invalid.")
=> ScoreAtt (Key pc acc mode) where
getAtt = undefined