Skip to content

Instantly share code, notes, and snippets.

@mohayonao
Created July 23, 2015 11:36
Show Gist options
  • Select an option

  • Save mohayonao/29bfe2dae78ad110fc57 to your computer and use it in GitHub Desktop.

Select an option

Save mohayonao/29bfe2dae78ad110fc57 to your computer and use it in GitHub Desktop.
import fs from "fs";
import path from "path";
import midiConverter from "midi-converter";
let name = "clair-de-lune";
let file = fs.readFileSync(path.join(__dirname, `${name}.mid`), "binary");
let json = midiConverter.midiToJson(file);
let ticksPerBeat = json.header.ticksPerBeat;
let tracks = [];
json.tracks = json.tracks.forEach((track, i) => {
let time = 0;
let memo = [];
tracks[i] = [];
track.forEach((items, j) => {
time += items.deltaTime;
if (items.subtype === "noteOn") {
let note = {};
note.time = time;
note.track = i;
note.noteNumber = items.noteNumber,
note.velocity = items.velocity;
if (!memo[items.noteNumber]) {
memo[items.noteNumber] = [];
}
memo[items.noteNumber].push(note);
tracks[i].push(note);
}
if (items.subtype === "noteOff") {
if (!memo[items.noteNumber]) {
console.log([ i, j, time ], items.noteNumber + " NOT exists?")
} else {
memo[items.noteNumber][0].duration = time - memo[items.noteNumber][0].time;
memo[items.noteNumber].shift();
}
}
});
});
let events = tracks.reduce((a, b) => a.concat(b), []);
events.sort((a, b) => a.time - b.time);
fs.writeFileSync(`${name}.json`, JSON.stringify({
name, ticksPerBeat, tempo: 120, events
}, null, 2));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment