
Installation
npm install @tonejs/midi
Midi makes it straightforward to read and write MIDI files with Javascript. It uses midi-file for parsing and writing.
Import
Node.js:
const { Midi } = require('@tonejs/midi')
Typescript / ES6
import { Midi } from '@tonejs/midi'
Browser
<script src="https://unpkg.com/@tonejs/midi"></script>
const midi = new Midi()
Basic Example
const midi = await Midi.fromUrl("path/to/midi.mid")
const name = midi.name
midi.tracks.forEach(track => {
const notes = track.notes
notes.forEach(note => {
})
track.controlChanges[64]
track.controlChanges.sustain.forEach(cc => {
})
})
Format
The data parsed from the midi file looks like this:
{
header: {
name: String,
tempos: TempoEvent[],
timeSignatures: TimeSignatureEvent[],
PPQ: Number
},
duration: Number,
tracks: [
{
name: String,
channel: Number,
notes: [
{
midi: Number,
time: Number,
ticks: Number,
name: String,
pitch: String,
octave : Number,
velocity: Number,
duration: Number,
}
],
controlChanges: {
'91': [
{
number: Number,
ticks: Number,
time: Number,
value: Number,
}
],
},
instrument: {
number : Number,
family: String,
name : String,
percussion: Boolean,
},
}
]
}
Raw Midi Parsing
If you are using Node.js or have the raw binary string from the midi file, just use the parse method:
const midiData = fs.readFileSync("test.mid")
const midi = new Midi(midiData)
Encoding Midi
You can also create midi files from scratch or by modifying an existing file.
var midi = new Midi()
const track = midi.addTrack()
track.addNote({
midi : 60,
time : 0,
duration: 0.2
})
.addNote({
name : 'C5',
time : 0.3,
duration: 0.1
})
.addCC({
number : 64,
value : 127,
time : 0.2
})
fs.writeFileSync("output.mid", new Buffer(midi.toArray()))
Acknowledgment
Thank you midi-file!