A MIDI player which sends MIDI messages to connected devices.
npm install midi-playerA MIDI player which sends MIDI messages to connected devices.

This module provides a player which sends MIDI messages to connected devices. It schedules the messages with a look ahead of about 500 milliseconds. It does not directly rely on the Web MIDI API but expects a MIDIOutput to be passed as constructor argument. But theoretically that could be anything which implements the same interface.
midi-player is published on npm and can be installed as usual.
``shell`
npm install midi-player
The only exported function is a factory method to create new player instances.
`js
import { create } from 'midi-player';
// This is a JSON object which represents a MIDI file.
const json = {
division: 480,
format: 1,
tracks: [
{ channel: 0, delta: 0, noteOn: { noteNumber: 36, velocity: 100 } },
{ channel: 0, delta: 240, noteOff: { noteNumber: 36, velocity: 64 } },
{ delta: 0, endOfTrack: true }
]
};
// This is a quick & dirty approach to grab the first known MIDI output.
const midiAccess = await navigator.requestMIDIAccess();
const midiOutput = Array.from(midiAccess.outputs)[0];
const midiPlayer = create({ json, midiOutput });
`
By default all status events will be sent. But it's possible to provide a custom filter function. The following player will only send note off and note on events.
`js`
const midiPlayer = create({
filterMidiMessage: (event) => 'noteOff' in event || 'noteOn' in event
// ... other options as described above
});
If you want to play a binary MIDI file you can use the midi-json-parser package to transform it into a compatible JSON representation.
The position is set to the current position in milliseconds.
`js`
midiPlayer.position;
The state property will either be set to 'paused', 'playing', or 'stopped'.
`js`
midiPlayer.state;
Calling play() will initiate the playback from the start.
`js`
midiPlayer.play().then(() => {
// All MIDI messages have been sent when the promise returned by play() resolves.
});
It can only be called when the state of the player is 'stopped'.
Calling pause() will pause the playback at the current position.
`js`
midiPlayer.pause();
It can only be called when the state of the player is 'playing'.
Calling resume() will resume a previously paused playback at the current position.
`js`
midiPlayer.resume().then(() => {
// All MIDI messages have been sent when the promise returned by resume() resolves.
});
It can only be called when the state of the player is 'paused'.
Calling stop() will stop the player.
`js`
midiPlayer.stop();
It can only be called when the state of the player is not 'stopped'`.
Most of the features of this package have been originally developed by @infojunkie who maintains a midi-player fork (infojunkie/midi-player) with even more functionality.