parse-midi
TypeScript icon, indicating that this package has built-in type declarations

2.0.2 • Public • Published

parse-midi

Netlify Status

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);
}

Readme

Keywords

none

Package Sidebar

Install

npm i parse-midi

Weekly Downloads

6

Version

2.0.2

License

MIT

Unpacked Size

41.2 kB

Total Files

11

Last publish

Collaborators

  • dlevs