diff options
author | Andrew Cady <d@jerkface.net> | 2014-01-15 11:44:19 -0500 |
---|---|---|
committer | Andrew Cady <d@jerkface.net> | 2014-01-15 11:44:19 -0500 |
commit | ff3936a884b56e0777b25aa27092e30a0bc4ec83 (patch) | |
tree | 7869ad3afe406e6cc9b2c044a2f41a226ccf8f5a /midi-dump.hs | |
parent | 53ee5dfebc44c84c4a67581655686426eef51986 (diff) |
factor out new function: forwardNoteEvent
Diffstat (limited to 'midi-dump.hs')
-rw-r--r-- | midi-dump.hs | 51 |
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 | |||
38 | prettyNote :: Event.Note -> String | 38 | prettyNote :: Event.Note -> String |
39 | prettyNote (Event.Note noteChannel noteNote noteVelocity noteOffVelocity noteDuration) = | 39 | prettyNote (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 | ||
110 | parseAlsaEvents h keysDown immediate = loop keysDown | 110 | parseAlsaEvents 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 | |||
127 | forwardNoteEvent 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 | ||
127 | main :: IO () | 136 | main :: IO () |
128 | main = (do | 137 | main = (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!" |