From 8f46e826f188ce7716a87cf98ace41829725f10c Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Sat, 5 Dec 2015 01:50:29 -0500 Subject: Implement delayed output This just sets the time field on the ALSA packet. It works! I had planned to do something much more complicated but if this works out, everything is easy. --- midi-dump.hs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/midi-dump.hs b/midi-dump.hs index 146ac5d..90a1bae 100644 --- a/midi-dump.hs +++ b/midi-dump.hs @@ -28,6 +28,8 @@ import qualified Sound.ALSA.Sequencer import qualified Sound.ALSA.Sequencer.Address import qualified Sound.ALSA.Sequencer.Port import qualified Sound.ALSA.Sequencer.Queue +import qualified Sound.ALSA.Sequencer.Time as Time +import qualified Sound.ALSA.Sequencer.RealTime as RealTime verbose :: Bool verbose = False @@ -131,11 +133,14 @@ _playNote noteOn note = playNoteEv $ Event.NoteEv onoff note where onoff = if noteOn then Event.NoteOn else Event.NoteOff +delayEvent :: Event.T -> Integer -> Event.T +delayEvent evt nanosecs = evt {Event.time = Time.consRel $ Time.Real (RealTime.fromInteger nanosecs)} + playNoteEv :: Event.Data -> RWST LoopEnv () LoopState IO () playNoteEv nevdata = do ms <- getMidiSender publicAddr <- asks _publicAddr - liftIO $ ms $ Event.simple publicAddr nevdata + liftIO $ ms $ Event.simple publicAddr nevdata `delayEvent` (10 * 10^(9::Int)) _whenFlag :: forall (m :: * -> *) s. MonadState s m => (s -> Bool) -> m () -> m () _whenFlag flag f = gets flag >>= flip when f -- cgit v1.2.3