OggMIDI
Mapping for embedding MIDI data streams in Ogg.
This mapping was designed by Jack Moffitt. See this mailing list post for documentation of his scheme.
= Header packet
OggMIDI streams have a single header packet for codec identification.
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1| Byte +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identifier 'OggMIDI\0' | 0-3 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | 4-7 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | version number | time format | 8-11 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | timebase | 12-13 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The header packet begins with the character sequence 'OggMIDI\0' for codec identification.
This is followed by an 8 bit version field. The version must be 0 for the mapping described here.
The time format field is also 8 bits, and describes the timestamp format used by the midi data. It is interpreted as follows:
- 1 one beat per quarter note
- 24, 25, 29, 30, (50, 59, 60?) corresponding smpte frame
- other values are undefined
The timebase occupies the final 16 bits and gives the number of ticks per time format unit.
= Data packets
The header packet is followed by a series of data packets, each of which contains an integral number of midi events.