Batteries-included Erlang MIDI.
Blocked: currently waiting on
- midiio 0.1.0 release (NIF for minimidio)
- midilib 0.6.0 refactor
midi is the front door to the erlsci MIDI family. It wires realtime device I/O
(midiio) to message and file codecs
(midilib) behind one ergonomic API, so
the same {midi, ...} message terms flow through live playback and Standard
MIDI File reading/writing.
Outbound, you send message terms and midi encodes them to the wire for you;
inbound, raw bytes from a device arrive already decoded into terms. You depend
on one library and get the whole stack:
midi:send(Device, midimsg:note_on(...)) %% term ─► midibin:encode ─► midiio (out)
%% midiio (in) ─► midibin:decode ─► {midi, ...}
midi
(one batteries-included API)
│
┌───────────┴────────────┐
midiio midilib
(transport: raw bytes (codec + Standard MIDI
⇄ OS ports; a NIF) Files; pure Erlang)
│
minimidio.h
(vendored C library;
the OS MIDI backends)
Read top-down as "is built on": midi combines midiio (I/O) and midilib
(codec) behind one API; midiio wraps the vendored minimidio.h; midilib is
independent, pure Erlang. midiio is codec-free and does not depend on
midilib.
| Library | Layer | Native build? |
|---|---|---|
| midilib | message codec + Standard MIDI File read/write | no (pure Erlang) |
| midiio | realtime device I/O (NIF over minimidio) | yes |
| midi | the whole enchilada: codec + I/O behind one API | yes (via midiio) |
Need just file/codec work with no native build? Depend on midilib alone.
Need raw realtime bytes and your own representation? Depend on midiio alone.
Want everything? Depend on midi.
Early placeholder — 0.0.1. The unified API is under active development and
will change. Published to Hex to reserve the name.
$ rebar3 compile