Skip to content

MIDI Class

spessasus edited this page May 25, 2024 · 34 revisions

MIDI Class

This is the module responsible for parsing MIDI files into objects readable by Sequencer class.

Importing

import {MIDI} from "./spessasynth_lib/midi_parser/midi_loader.js";

Initialization

const parsedMIDI = new MIDI(arrayBuffer);
  • arrayBuffer - an arrayBuffer anstance of the midi file.

Properties

tracksAmount

The amount of tracks in the file.

console.log(`this file has ${parsedMIDI.tracksAmount}`);

timeDivision

The time division of the midi file. Used by the Sequencer class

console.log(`this sequence's time division is ${parsedMIDI.timeDivision}`);

midiName

The sequence's name. The first track's Track Name's event text.

console.log(`This sequence is named "${parsedMIDI.midiName}"`);

copyright

The decoded copyright and description of the file. Also includes the Sound Canvas display messages.

console.log(`Midi file description: ${parsedMIDI.copyright}`);

tempoChanges

Ordered from last to first, all the tempo changes in the file. Will always contain at least 1 tempo (the default 120BPM).

[
   {
       tempo: /* tempo in BPM */,
       ticks: /* absolute amount of MIDI Ticks from the start */
   },

   /*...*/

   {
       tempo: 120,
       ticks: 0
   }
];

loop

The points of the loop detected in the MIDI file in ticks. If there's nothing detected, the loop will start from the first NoteOn event and end will be the tick length of the file. Current looping detection is: CC 2/4, 116/117 and "start", "loopStart" and "loopEnd" markers.

console.log(parsedMIDI.loop); // {start: 1294, end: 49573}

firstNoteOn

The tick number of the first noteOn event in the sequence. Can be used to skip the initial silence.

console.log(parsedMIDI.firstNoteOn); // 1294

tracks

The actual MIDI sequence data. Go here to learn more.

How the file is stored

The file is stored as an array of tracks, accesible via parsedMIDI.tracks. Each track is an array of events. Each event is a MidiMessage class, which is defined as follows;

class MidiMessage
{
    constructor(ticks, byte, data) {
        this.ticks = ticks;
        this.messageStatusByte = byte;
        this.messageData = data;
    }
}
  • ticks - absolute amount of MIDI Ticks from the start of the track.
  • messageStatusByte - the status byte of the message as a number from 0 to 255. Learn more here and here. Note that for Meta Events, the status byte is the SECOND status byte, not the 0xFF!
  • messageData - a ShiftableByteArray instance of the event's data.