From 3618430364b04d4283a8e01590cae5476255fc30 Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Thu, 3 Dec 2015 05:35:10 -0500 Subject: store midi event history in a simple list --- midi-dump.hs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'midi-dump.hs') diff --git a/midi-dump.hs b/midi-dump.hs index 0f714ed..a5a3d9c 100644 --- a/midi-dump.hs +++ b/midi-dump.hs @@ -2,26 +2,32 @@ import AlsaSeq import Control.Concurrent (threadDelay) import qualified Sound.ALSA.Exception as AlsaExc import qualified Data.Set as Set +import qualified Haskore.Basic.Pitch as Pitch +import qualified Sound.ALSA.Sequencer.Event as Event main = main' `AlsaExc.catch` handler where handler e = putStrLn $ "alsa_exception: " ++ AlsaExc.show e +data State = State { + keysDown :: MidiPitchSet, + inputHistory :: [Maybe Event.T] +} + main' = withAlsaInit $ \h public private q publicAddr privateAddr -> do cmdlineAlsaConnect h public let forwardNOW = forwardNoteEvent h q publicAddr - go keysDown = do - keysDown' <- parseAlsaEvents h keysDown (\ev -> do forwardNOW ev; hook ev) - if (keysDown == keysDown') then + go state = do + (events, keysDown') <- parseAlsaEvents' h (keysDown state) forwardNOW + if ((keysDown state) == keysDown') then threadDelay 15000 -- 15ms. Seems like a lot, but it sounds OK. Cuts CPU down to 2%. else do + let newHistory = if (Set.null $ keysDown state) then Nothing:newEvents else newEvents + newEvents = map Just events printChordLn keysDown' - go keysDown' + go (state { keysDown = keysDown', inputHistory = newHistory ++ inputHistory state }) putStrLn "Rock on!" - go Set.empty - -hook :: MidiHook -hook ev = return () + go (State Set.empty []) -- cgit v1.2.3