MidiConvert
MidiConvert makes it straightforward to work with MIDI files in Javascript. It uses midi-file-parser to decode MIDI files and jsmidgen to encode MIDI files.
MidiConvert.load("path/to/midi.mid", function(midi) {
console.log(midi)
})
Format
The data parsed from the midi file looks like this:
{
header: {
name: String,
bpm: Number,
timeSignature: [Number, Number],
PPQ: Number
},
startTime: Number,
duration: Number,
tracks: [
{
id: Number,
name: String,
notes: [
{
midi: Number,
time: Number,
note: String,
velocity: Number,
duration: Number,
}
],
startTime: Number,
duration: Number,
controlChanges: {
'91': [
{
number: Number,
time: Number,
value: Number,
}
],
},
isPercussion: Boolean,
channelNumber: Number,
instrumentNumber: Number,
instrumentFamily: String,
instrument: String,
}
]
}
Raw Midi Parsing
If you are using Node.js or have the raw binary string from the midi file, just use the parse
method:
fs.readFile("test.mid", "binary", function(err, midiBlob) {
if (!err) {
var midi = MidiConvert.parse(midiBlob)
}
})
Encoding Midi
You can also create midi files from scratch or by modifying an existing file.
var midi = MidiConvert.create()
midi.track()
.patch(32)
.note(60, 0, 2)
.note(63, 1, 2)
.note(60, 2, 2)
fs.writeFileSync("output.mid", midi.encode(), "binary")
Tone.Part
The note data can be easily passed into Tone.Part
var synth = new Tone.PolySynth(8).toMaster()
MidiConvert.load("path/to/midi.mid", function(midi) {
Tone.Transport.bpm.value = midi.header.bpm
var midiPart = new Tone.Part(function(time, note) {
synth.triggerAttackRelease(note.name, note.duration, time, note.velocity)
}, midi.tracks[0].notes).start()
Tone.Transport.start()
})
Acknowledgment
MidiConvert uses midi-file-parser which is ported from jasmid for decoding MIDI data and and jsmidgen for encoding MIDI data.