Mu declares music. It provides a simple type for representing music and combinators to define and compose it.
Music values are interpreted by renderers. Mu has built-in support for rendering music values to MIDI files.
mumu.playerMu_player Play MIDI music (temporary hack).mu.tportaudio and mu.tportmidiTportaudio Thin bindings to the portaudio library.Tportmidi Thin bindings to the portmidi library.`Lazy case to music values and switch to Stdlib.Seq instead of lists in a few places. However reading HSoM 8.3.1, it seem finiteness is a good property in the end, e.g. for timing correctness. But it's useful, for e.g. repeating a pattern as much as needed. We should likely add a M.loop ~dur m combinator. Also infinite parallel is not that useful, maybe simply add a Stdlib.Seq.t case.Mu.Music.Ctrl.t is a good candidate, this would allow clients to define custom music annotations. What about Mu.Instrument.t and Mu.Percussion.t ?