16.4. MIDI file parser
Module strudel_midi
16.4.1. Enumerations
- MidiEventKind
- Values:
midi_note_off = 0 - Note released.
midi_note_on = 1 - Note pressed (velocity > 0) or released (velocity == 0).
midi_control_change = 2 - Controller value change (CC). data1 = controller number, data2 = value.
midi_program_change = 3 - Instrument/program change. data1 = program number.
midi_pitch_bend = 4 - Pitch bend. data1 = LSB, data2 = MSB (14-bit value, 8192 = center).
midi_tempo = 5 - Tempo change (meta event). tempo field = microseconds per quarter note.
midi_end_of_track = 6 - End of track marker.
midi_other = 7 - Unrecognized or unsupported MIDI event.
16.4.2. Structures
- MidiEvent
- Fields:
tick : int - Absolute tick position within the track.
kind : MidiEventKind - Event type.
channel : int - MIDI channel (0-15).
data1 : int - First data byte (note number, controller number, or program number).
data2 : int - Second data byte (velocity, controller value, or pitch bend MSB).
tempo : int - Microseconds per quarter note (only valid for midi_tempo events).
seq : int - Sequence number for stable sort ordering.
- MidiTrack
struct MidiTrack
- MidiFile
- Fields:
format : int - MIDI format (0 = single track, 1 = multi-track synchronous, 2 = multi-track asynchronous).
ticks_per_qn : int - Ticks per quarter note (time resolution).
tracks : array< MidiTrack> - Array of tracks.
16.4.3. Parsing
- load_midi(path: string): MidiFile
Load and parse a MIDI file from disk.
- Arguments:
path : string
- parse_midi(data: array<uint8>): MidiFile
Parse MIDI data from a byte array into a MidiFile structure.
- Arguments:
data : array<uint8>
- parse_midi_track(data: array<uint8>; cursor: int&): MidiTrack
Parse a single MTrk chunk starting at cursor, returning the track with all events.
- Arguments:
data : array<uint8>
cursor : int&
16.4.4. Track operations
- merge_tracks(midi: MidiFile): array<MidiEvent>
Merge all tracks into a single sorted event list for sequential playback.
- Arguments:
midi : MidiFile
16.4.5. Binary readers
- read_byte(data: array<uint8>; cursor: int&): int
Read a single byte from data at cursor, advancing cursor. Returns -1 on EOF.
- Arguments:
data : array<uint8>
cursor : int&
- read_u16(data: array<uint8>; cursor: int&): int
Read a big-endian 16-bit unsigned integer. Returns -1 on EOF.
- Arguments:
data : array<uint8>
cursor : int&
- read_u32(data: array<uint8>; cursor: int&): int
Read a big-endian 32-bit unsigned integer. Returns -1 on EOF.
- Arguments:
data : array<uint8>
cursor : int&
- read_vlq(data: array<uint8>; cursor: int&): int
Read a MIDI variable-length quantity (up to 4 bytes). Returns -1 on EOF.
- Arguments:
data : array<uint8>
cursor : int&