hmt-0.12: Music/Theory/Tempo_Marking.hs
-- | Common music notation tempo indications.
module Music.Theory.Tempo_Marking where
import Music.Theory.Duration
import Music.Theory.Duration.RQ
import Music.Theory.Time_Signature
-- | A tempo marking is in terms of a common music notation 'Duration'.
type Tempo_Marking = (Duration,Rational)
-- | Duration of a RQ value, in seconds, given indicated tempo.
--
-- > rq_to_seconds (quarter_note,90) 1 == 60/90
rq_to_seconds :: Tempo_Marking -> RQ -> Rational
rq_to_seconds (d,n) x =
let d' = duration_to_rq d
s = 60 / n
in (x * s) / d'
-- | The duration, in seconds, of a pulse at the indicated time
-- signature and tempo marking.
--
-- > import Music.Theory.Duration.Name
-- > pulse_duration (6,8) (quarter_note,60) == 1/2
pulse_duration :: Time_Signature -> Tempo_Marking -> Rational
pulse_duration t (x,i) =
let j = recip (ts_duration_pulses t x)
s = 60 / i
in j * s
-- | The duration, in seconds, of a measure at the indicated time
-- signaure and tempo marking.
--
-- > measure_duration (3,4) (quarter_note,90) == 2
-- > measure_duration (6,8) (quarter_note,120) == 3/2
measure_duration :: Time_Signature -> Tempo_Marking -> Rational
measure_duration (n,d) t = pulse_duration (n,d) t * fromIntegral n
-- | 'Fractional' variant of 'measure_duration'.
measure_duration_f :: Fractional c => Time_Signature -> Tempo_Marking -> c
measure_duration_f ts = fromRational . measure_duration ts