module Haskore.Interface.MIDI.Play (play, playSimple, ) where
import Haskore.RealTime.ShellPipe (launch)
import Haskore.RealTime.Utility (catchCtrlC, )
import qualified Haskore.Music.GeneralMIDI as MidiMusic
import qualified Haskore.Music.Rhythmic as RhyMusic
import qualified Haskore.Performance.Context as Context
import qualified Haskore.Interface.MIDI.InstrumentMap as InstrMap
import qualified Haskore.Interface.MIDI.Write as WriteMidi
import qualified Haskore.Interface.MIDI.Render as Render
import qualified Sound.MIDI.File.Save as SaveMidi
import qualified Data.ByteString.Lazy as B
import qualified System.IO as IO
import qualified Numeric.NonNegative.Class as NonNeg
play ::
(Ord instr, Ord drum,
NonNeg.C time, RealFrac time, Fractional time, RealFrac dyn) =>
(InstrMap.ChannelProgramPitchTable drum,
InstrMap.ChannelProgramTable instr,
Context.T time dyn (RhyMusic.Note drum instr),
RhyMusic.T drum instr)
-> IO ()
play = playRaw [] . SaveMidi.toByteString . WriteMidi.fromRhythmicMusicMixed
playSimple :: MidiMusic.T -> IO ()
playSimple = playRaw [] . SaveMidi.toByteString . Render.mixedGeneralMidi
playRaw :: [String] -> B.ByteString -> IO ()
playRaw args stream =
do
catchCtrlC
(input,_,_) <- launch "timidity"
(["timidity", "-B", "8,9"] ++ args ++ ["-"])
B.hPutStr input stream
IO.hClose input