module MelodyToMicroMidi (tomicromidi) where
--import qualified Melody as Mel
import Melody
import qualified MicroMidi
import qualified Duration
import qualified Midi
import Data.Ratio ((%))
import qualified Pitch

tomicromidi' channel previousrest [] = ([],0)
tomicromidi' channel previousrest (n:ns) =
    let (micromidi,restduration) = duratednotetomicromidi channel previousrest n
        (micromidi2,restduration2) = tomicromidi' channel restduration ns
    in (micromidi ++ micromidi2, restduration2)

tomicromidi channel unitduration (Melody melody) =
    fst (tomicromidi' channel 0 (Duration.quantize unitduration melody))

duratednotetomicromidi channel previousrest (duration,Note pitch velocity)
    = ([(previousrest,MicroMidi.NoteOn channel pitch velocity)
       ,(duration,MicroMidi.NoteOff channel pitch velocity)
       ]
      ,0)
duratednotetomicromidi channel previousrest (duration,Rest)
    = ([],previousrest+duration)

testmelody::Melody Rational Rational
testmelody = Melody
             [(1%1,Note (1%1) 64)
             ,(1%1,Note (9%8) 64)
             ,(1%1,Rest)
             ,(1%1,Note (5%4) 64)
             ,(1%1,Note (1%1) 64)
             ,(1%1,Note (9%8) 64)
             ,(1%1,Rest)
             ,(1%1,Note (5%4) 64)
             ,(2%1,Note (3%2) 64)
             ,(2%1,Note (27%16) 64)
             ,(2%1,Note (15%8) 64)
             ,(2%1,Note (3%2) 64)
             ]

tomidi channel unitduration melody =
    MicroMidi.tomidi (tomicromidi channel unitduration melody)

test =
    writeFile "test.mid" (Midi.tofile 100 (tomidi 0 100 testmelody))