module Temporal.Music.Notation.Note(
Note(..), absNote, Drum(..), absDrum,
bnr, wnr, hnr, qnr, enr, snr, tnr,
dbnr, dwnr, dhnr, dqnr, denr, dsnr, dtnr,
bn, wn, hn, qn, en, sn, tn,
dbn, dwn, dhn, dqn, den, dsn, dtn,
bd, wd, hd, qd, ed, sd, td,
dbd, dwd, dhd, dqd, ded, dsd, dtd
)
where
import Temporal.Music.Notation.Seg
import Temporal.Music.Notation.Pitch
import Temporal.Music.Notation.Volume
import Temporal.Music.Notation.Score (Dur, Score, note, rest, dot)
import Temporal.Music.Notation.Scales(eqts)
data Note nVol nPch a = Note
{ noteVolume :: Volume nVol
, notePitch :: Pitch nPch
, noteParam :: Maybe a
} deriving (Show, Eq)
instance (Seg nVol, Seg nPch)
=> VolumeFunctor (Note nVol nPch a) where
mapVolume f n = n{ noteVolume = f $ noteVolume n }
instance (Seg nVol, Seg nPch)
=> LevelFunctor (Note nVol nPch a) where
mapLevel f n = n{ noteVolume = mapLevel f $ noteVolume n }
instance (Seg nVol, Seg nPch)
=> PitchFunctor (Note nVol nPch a) where
mapPitch f n = n{ notePitch = f $ notePitch n }
instance (Seg nVol, Seg nPch)
=> ToneFunctor (Note nVol nPch a) where
mapTone f n = n{ notePitch = mapTone f $ notePitch n }
absNote :: (Seg nVol, Seg nPch)
=> Note nVol nPch a -> (Amplitude, Frequency)
absNote (Note v p _) = (absVolume v, absPitch p)
data Drum n a = Drum
{ drumVolume :: Volume n
, drumParam :: Maybe a
} deriving (Show, Eq)
instance Seg nVol => VolumeFunctor (Drum nVol a) where
mapVolume f n = n{ drumVolume = f $ drumVolume n }
instance Seg nVol=> LevelFunctor (Drum nVol a) where
mapLevel f n = n{ drumVolume = mapLevel f $ drumVolume n }
absDrum :: (Seg nVol)
=> Drum nVol a -> Amplitude
absDrum = absVolume . drumVolume
n :: (Vol nVol, Pch nPch)
=> Dur -> Tone nPch -> Score (Note nVol nPch a)
n dt t = note dt $ Note (volume mediumLevel) (pitch t) Nothing
bn, wn, hn, en, sn, tn, dbn, dwn, dhn, den, dsn, dtn ::
(Vol nVol, Pch nPch)
=> Tone nPch -> Score (Note nVol nPch a)
bn = n 2
wn = n 1
hn = n 0.5
qn = n 0.25
en = n 0.125
sn = n 0.0625
tn = n 0.03125
dbn = dot . bn
dwn = dot . wn
dhn = dot . hn
dqn = dot . qn
den = dot . en
dsn = dot . sn
dtn = dot . tn
d :: (Vol nVol)
=> Dur -> Accent -> Score (Drum nVol a)
d dt a = note dt $ Drum (setAccent a $ volume mediumLevel) Nothing
bd, wd, hd, ed, sd, td, dbd, dwd, dhd, ded, dsd, dtd ::
(Vol nVol)
=> Accent -> Score (Drum nVol a)
bd = d 2
wd = d 1
hd = d 0.5
qd = d 0.25
ed = d 0.125
sd = d 0.0625
td = d 0.03125
dbd = dot . bd
dwd = dot . wd
dhd = dot . hd
dqd = dot . qd
ded = dot . ed
dsd = dot . sd
dtd = dot . td
bnr, wnr, hnr, qnr, enr, snr, tnr,
dbnr, dwnr, dhnr, dqnr, denr, dsnr, dtnr :: Score a
bnr = rest 2
wnr = rest 1
hnr = rest 0.5
qnr = rest 0.25
enr = rest 0.125
snr = rest 0.0625
tnr = rest 0.03125
dbnr = dot $ bnr
dwnr = dot $ wnr
dhnr = dot $ hnr
dqnr = dot $ qnr
denr = dot $ enr
dsnr = dot $ snr
dtnr = dot $ tnr