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:

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&