prev (25) slide 26 / 33 next (27)
performance
perform :: MidiDb.LookupMidiInstrument
→ Instrument.Config → [Event] → ([Midi.WriteMessage], [Warning.Warning])
perform lookup_inst config events = (post_process msgs, warns)
where
inst_addrs = config_to_inst_addrs config lookup_inst
(msgs, warns) = (perform_notes . allot inst_addrs
. channelize inst_addrs) events
channelize :: InstAddrs → [Event] → [(Event, Channel)]
allot :: InstAddrs → [(Event, Channel)] → [(Event, Instrument.Addr)]
perform_notes :: [(Event, Instrument.Addr)]
→ ([Midi.WriteMessage], [Warning.Warning])
post_process :: [Midi.WriteMessage] → [Midi.WriteMessage]
post_process = reorder_control_messages . drop_duplicates
- Nice and functional looking.
- Lots of merging sorted sublists. I tried to write a generic
sort_asc_lists :: [[a]] → [a] but failed.
Fortunately
merge_with :: (Ord k) => (a → k) → [a] → [a] → [a]
is enough for now.
- A single bubblesort pass is lazy and sorts almost-sorted stuff!
prev (25) slide 26 / 33 next (27)