2.0.2 • Published 4 years ago

parse-midi v2.0.2

Weekly downloads
5
License
MIT
Repository
github
Last release
4 years ago

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

4 years ago

2.0.1

4 years ago

2.0.0

4 years ago

1.0.9

4 years ago

1.0.8

5 years ago

1.0.7

5 years ago

1.0.6

6 years ago

1.0.5

6 years ago

1.0.4

6 years ago

1.0.3

6 years ago

1.0.2

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago

0.0.1

6 years ago