summaryrefslogtreecommitdiff
path: root/midi-dump.hs
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2014-01-15 11:44:19 -0500
committerAndrew Cady <d@jerkface.net>2014-01-15 11:44:19 -0500
commitff3936a884b56e0777b25aa27092e30a0bc4ec83 (patch)
tree7869ad3afe406e6cc9b2c044a2f41a226ccf8f5a /midi-dump.hs
parent53ee5dfebc44c84c4a67581655686426eef51986 (diff)
factor out new function: forwardNoteEvent
Diffstat (limited to 'midi-dump.hs')
-rw-r--r--midi-dump.hs51
1 files changed, 27 insertions, 24 deletions
diff --git a/midi-dump.hs b/midi-dump.hs
index b94b178..d463750 100644
--- a/midi-dump.hs
+++ b/midi-dump.hs
@@ -38,7 +38,7 @@ pitchWords set = map (showPitch . Event.unPitch) $ Set.toList set
38prettyNote :: Event.Note -> String 38prettyNote :: Event.Note -> String
39prettyNote (Event.Note noteChannel noteNote noteVelocity noteOffVelocity noteDuration) = 39prettyNote (Event.Note noteChannel noteNote noteVelocity noteOffVelocity noteDuration) =
40 let pitch = Event.unPitch noteNote 40 let pitch = Event.unPitch noteNote
41 vlcty = Event.unVelocity noteVelocity 41 vlcty = Event.unVelocity noteVelocity
42 in 42 in
43 printf "%d(%d)" pitch vlcty 43 printf "%d(%d)" pitch vlcty
44 44
@@ -103,26 +103,35 @@ cmdlineAlsaConnect h public = do
103 return () 103 return ()
104 104
105 _ -> do 105 _ -> do
106 showAlsaPorts h 106 showAlsaPorts h
107 IO.hPutStrLn IO.stderr "need arguments: input-port output-port" 107 IO.hPutStrLn IO.stderr "need arguments: input-port output-port"
108 Exit.exitFailure 108 Exit.exitFailure
109 109
110parseAlsaEvents h keysDown immediate = loop keysDown 110parseAlsaEvents h keysDown immediate = loop keysDown
111 where 111 where
112 loop keysDown = do 112 loop keysDown = do
113 pending <- Event.inputPending h True 113 pending <- Event.inputPending h True
114 if (pending == 0) then 114 if (pending == 0) then
115 return keysDown 115 return keysDown
116 else do 116 else do
117 ev <- Event.input h 117 ev <- Event.input h
118 case Event.body ev of 118 case Event.body ev of
119 Event.NoteEv Event.NoteOn n -> do 119 Event.NoteEv Event.NoteOn n -> do
120 immediate Event.NoteEv Event.NoteOn n 120 immediate ev
121 loop (Set.insert (Event.noteNote n) keysDown) 121 loop (Set.insert (Event.noteNote n) keysDown)
122 Event.NoteEv Event.NoteOff n -> do 122 Event.NoteEv Event.NoteOff n -> do
123 immediate Event.NoteEv Event.NoteOff n 123 immediate ev
124 loop (Set.delete (Event.noteNote n) keysDown) 124 loop (Set.delete (Event.noteNote n) keysDown)
125 _ -> loop keysDown 125 _ -> loop keysDown
126
127forwardNoteEvent h q publicAddr ev = do
128 let mkEv e = (Event.simple publicAddr e) { Event.queue = q, Event.time = Time.consAbs $ Time.Real $ RealTime.fromDouble 0 }
129 let immediate = \a b c -> do { Event.output h $ mkEv $ a b c; _ <- Event.drainOutput h; return (); }
130 case Event.body ev of
131 Event.NoteEv Event.NoteOn n -> immediate Event.NoteEv Event.NoteOn n
132 Event.NoteEv Event.NoteOff n -> immediate Event.NoteEv Event.NoteOff n
133 -- TODO: forward other event types?
134 _ -> return ()
126 135
127main :: IO () 136main :: IO ()
128main = (do 137main = (do
@@ -130,20 +139,14 @@ main = (do
130 alsaInit $ \h public private q publicAddr privateAddr -> do 139 alsaInit $ \h public private q publicAddr privateAddr -> do
131 cmdlineAlsaConnect h public 140 cmdlineAlsaConnect h public
132 141
133 let mkEv e =
134 (Event.simple publicAddr e) {
135 Event.queue = q,
136 Event.time = Time.consAbs $ Time.Real $ RealTime.fromDouble 0
137 }
138
139 let 142 let
143 forwardNOW = forwardNoteEvent h q publicAddr
140 go keysDown = do 144 go keysDown = do
141 let immediate = \a b c -> do { Event.output h $ mkEv $ a b c; _ <- Event.drainOutput h; return (); } 145 keysDown' <- parseAlsaEvents h keysDown forwardNOW
142 keysDown' <- parseAlsaEvents h keysDown immediate
143 if (keysDown == keysDown') then 146 if (keysDown == keysDown') then
144 threadDelay 15000 -- 15ms. Seems like a lot, but it sounds OK. Cuts CPU down to 2%. 147 threadDelay 15000 -- 15ms. Seems like a lot, but it sounds OK. Cuts CPU down to 2%.
145 else do 148 else do
146 printWords $ pitchWords keysDown' 149 printWords $ pitchWords keysDown'
147 go keysDown' 150 go keysDown'
148 151
149 putStrLn "Rock on!" 152 putStrLn "Rock on!"