module Temporal.Music.Western(
Dynamics(..),
ppp', pp', p', mp', mf', f', ff', fff',
dim, cresc,
rondo, reprise,
Tempo,
lento, largo, larghetto, grave, adagio, adagietto,
andante, andantino, moderato, allegretto,
allegro, vivace, presto, prestissimo,
NoteW, DrumW,
Note(..), Drum,
absNote, absDrum,
bnr, wnr, qnr, hnr, enr, snr, tnr,
dbnr, dwnr, dqnr, dhnr, 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
import Temporal.Music.Notation.Note(Note(..), Drum,
absNote, absDrum,
bnr, wnr, qnr, hnr, enr, snr, tnr,
dbnr, dwnr, dqnr, dhnr, denr, dsnr, dtnr)
import qualified Temporal.Music.Notation.Note as N
data Dynamics = PPP | PP | P | MP | MF | F | FF | FFF
deriving (Show, Eq, Enum, Bounded)
instance Seg Dynamics
instance Vol Dynamics where
volume = Volume (1e-5, 1)
ppp', pp', p', mp', mf', f', ff', fff' :: LevelFunctor a => a -> a
ppp' = setLevel PPP
pp' = setLevel PP
p' = setLevel P
mp' = setLevel MP
mf' = setLevel MF
f' = setLevel F
ff' = setLevel FF
fff' = setLevel FFF
dim :: LevelFunctor a => Accent -> Score a -> Score a
dim v = dynamics ((v) *)
cresc :: LevelFunctor a => Accent -> Score a -> Score a
cresc v = dynamics (v * )
rondo :: Score a -> Score a -> Score a -> Score a
rondo a b c = line [a, b, a, c, a]
reprise :: Score a -> Score a -> Score a -> Score a
reprise a b c = line [a, b, a, c]
type Tempo = Double
largoRange, larghettoRange,
adagioRange, adagiettoRange,
andanteRange, andantinoRange,
moderatoRange, allegroRange,
allegrettoRange, vivaceRange,
prestoRange, prestissimoRange :: (Double, Double)
largoRange = ( 40, 60)
larghettoRange = ( 60, 66)
adagioRange = ( 66, 76)
adagiettoRange = ( 70, 80)
andanteRange = ( 76, 80)
andantinoRange = ( 80,100)
moderatoRange = (101,110)
allegrettoRange = (115,125)
allegroRange = (120,139)
vivaceRange = (135,160)
prestoRange = (168,200)
prestissimoRange = (200,230)
getTempo :: (Tempo, Tempo) -> Double -> Tempo
getTempo (a, b) x = a + (b a) * x
lento :: Double -> Tempo
lento = largo
largo :: Double -> Tempo
largo = getTempo largoRange
larghetto :: Double -> Tempo
larghetto = getTempo larghettoRange
grave :: Double -> Tempo
grave = larghetto
adagio :: Double -> Tempo
adagio = getTempo adagioRange
adagietto :: Double -> Tempo
adagietto = getTempo adagiettoRange
andante :: Double -> Tempo
andante = getTempo andanteRange
andantino :: Double -> Tempo
andantino = getTempo andantinoRange
moderato :: Double -> Tempo
moderato = getTempo moderatoRange
allegretto :: Double -> Tempo
allegretto = getTempo allegrettoRange
allegro :: Double -> Tempo
allegro = getTempo allegroRange
vivace :: Double -> Tempo
vivace = getTempo vivaceRange
presto :: Double -> Tempo
presto = getTempo prestoRange
prestissimo :: Double -> Tempo
prestissimo = getTempo prestissimoRange
type NoteW p a = Note Dynamics p a
type DrumW a = Drum Dynamics a
bn, wn, hn, qn, en, sn, tn,
dbn, dwn, dhn, dqn, den, dsn, dtn ::
Pch p => Tone p -> Score (NoteW p a)
bn = N.bn
wn = N.wn
hn = N.hn
qn = N.qn
en = N.en
sn = N.sn
tn = N.tn
dbn = N.dbn
dwn = N.dwn
dhn = N.dhn
dqn = N.dqn
den = N.den
dsn = N.dsn
dtn = N.dtn
bd, wd, hd, qd, ed, sd, td,
dbd, dwd, dhd, dqd, ded, dsd, dtd ::
Accent -> Score (DrumW a)
bd = N.bd
wd = N.wd
hd = N.hd
qd = N.qd
ed = N.ed
sd = N.sd
td = N.td
dbd = N.dbd
dwd = N.dwd
dhd = N.dhd
dqd = N.dqd
ded = N.ded
dsd = N.dsd
dtd = N.dtd