parse-midi
v2.0.2
Published
A small parser for MIDI messages.
Downloads
53
Readme
parse-midi
A small parser for MIDI messages.
The parser follows midi.org's MIDI 1.0 specification, meaning it:
- Identifies the channel and message type (
"noteon"
,"noteoff"
,"controlchange"
...) of a MIDI message - Provides human-readable strings corresponding to the default mapping for every control change message (
"volume"
,"pan"
,"effect1"
...) - Provides human-readable strings for each channel mode message (
"allnotesoff"
,"resetallcontrollers"
,"polymodeon"
...)
Installation
npm install parse-midi
Usage
Basic usage
import parseMidi from 'parse-midi';
parseMidi([144, 60, 62]);
// { messageType: 'noteon', key: 60, velocity: 62, channel: 1, messageCode: 144 }
Responding to MIDI messages in the browser
In browsers that support MIDIAccess, the parser can be used on event data:
navigator.requestMIDIAccess().then(access => {
Array.from(access.inputs.values()).forEach(input => {
input.addEventListener('midimessage', (event) => {
const midiMessage = parseMidi(event.data);
console.log(midiMessage);
});
});
});
See the demo for a working example.
Return values
The parseMidi
function returns an object which always has at least these properties:
{
messageCode: 0-240,
channel: 1-16,
}
In addition, specific properties exist for each messageType
:
{
messageType: 'noteoff',
key: 0-127,
velocity: 0-127,
}
{
messageType: 'noteon',
key: 0-127,
velocity: 1-127,
}
{
messageType: 'keypressure',
key: 0-127,
pressure: 0-127,
}
{
messageType: 'controlchange',
controlFunction: string, // e.g. 'volume'
controlNumber: 0-127,
controlValue: 0-127,
}
{
messageType: 'channelmodechange',
channelModeMessage: string, // e.g. 'allnotesoff'
controlNumber: 0-127,
controlValue: 0-127,
}
{
messageType: 'programchange',
program: 0-127,
}
{
messageType: 'channelpressure',
pressure: 0-127,
}
{
messageType: 'pitchbendchange',
pitchBend: 0-16383,
pitchBendMultiplier: -1 - 1,
}
{
messageType: 'unknown',
data1: 0-127,
data2: 0-127,
}
TypeScript
With TypeScript, type safety and intellisense can be achieved by refining the type of the return object:
const midiMessage = parseMidi([144, 60, 62]);
// Bad - won't compile
console.log(midiMessage.key);
// Good
if (midiMessage.messageType === 'noteon') {
console.log(midiMessage.key);
}