@tonejs/midi
Version:
Convert binary midi into JSON
185 lines • 5.84 kB
JavaScript
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.encode = void 0;
var midi_file_1 = require("midi-file");
var Header_1 = require("./Header");
var array_flatten_1 = require("array-flatten");
function encodeNote(note, channel) {
return [{
absoluteTime: note.ticks,
channel: channel,
deltaTime: 0,
noteNumber: note.midi,
type: "noteOn",
velocity: Math.floor(note.velocity * 127),
},
{
absoluteTime: note.ticks + note.durationTicks,
channel: channel,
deltaTime: 0,
noteNumber: note.midi,
type: "noteOff",
velocity: Math.floor(note.noteOffVelocity * 127),
}];
}
function encodeNotes(track) {
return (0, array_flatten_1.flatten)(track.notes.map(function (note) { return encodeNote(note, track.channel); }));
}
function encodeControlChange(cc, channel) {
return {
absoluteTime: cc.ticks,
channel: channel,
controllerType: cc.number,
deltaTime: 0,
type: "controller",
value: Math.floor(cc.value * 127),
};
}
function encodeControlChanges(track) {
var controlChanges = [];
for (var i = 0; i < 127; i++) {
if (track.controlChanges.hasOwnProperty(i)) {
track.controlChanges[i].forEach(function (cc) {
controlChanges.push(encodeControlChange(cc, track.channel));
});
}
}
return controlChanges;
}
function encodePitchBend(pb, channel) {
return {
absoluteTime: pb.ticks,
channel: channel,
deltaTime: 0,
type: "pitchBend",
value: pb.value,
};
}
function encodePitchBends(track) {
var pitchBends = [];
track.pitchBends.forEach(function (pb) {
pitchBends.push(encodePitchBend(pb, track.channel));
});
return pitchBends;
}
function encodeInstrument(track) {
return {
absoluteTime: 0,
channel: track.channel,
deltaTime: 0,
programNumber: track.instrument.number,
type: "programChange",
};
}
function encodeTrackName(name) {
return {
absoluteTime: 0,
deltaTime: 0,
meta: true,
text: name,
type: "trackName",
};
}
function encodeTempo(tempo) {
return {
absoluteTime: tempo.ticks,
deltaTime: 0,
meta: true,
microsecondsPerBeat: Math.floor(60000000 / tempo.bpm),
type: "setTempo",
};
}
function encodeTimeSignature(timeSig) {
return {
absoluteTime: timeSig.ticks,
deltaTime: 0,
denominator: timeSig.timeSignature[1],
meta: true,
metronome: 24,
numerator: timeSig.timeSignature[0],
thirtyseconds: 8,
type: "timeSignature",
};
}
// function encodeMeta(event: )
function encodeKeySignature(keySig) {
var keyIndex = Header_1.keySignatureKeys.indexOf(keySig.key);
return {
absoluteTime: keySig.ticks,
deltaTime: 0,
key: keyIndex + 7,
meta: true,
scale: keySig.scale === "major" ? 0 : 1,
type: "keySignature",
};
}
function encodeText(textEvent) {
return {
absoluteTime: textEvent.ticks,
deltaTime: 0,
meta: true,
text: textEvent.text,
type: textEvent.type,
};
}
/**
* Convert the MIDI object to an array.
*/
function encode(midi) {
var midiData = {
header: {
format: 1,
numTracks: midi.tracks.length + 1,
ticksPerBeat: midi.header.ppq,
},
tracks: __spreadArray([
__spreadArray(__spreadArray(__spreadArray(__spreadArray([
// The name data.
{
absoluteTime: 0,
deltaTime: 0,
meta: true,
text: midi.header.name,
type: "trackName",
}
], midi.header.keySignatures.map(function (keySig) { return encodeKeySignature(keySig); }), true), midi.header.meta.map(function (e) { return encodeText(e); }), true), midi.header.tempos.map(function (tempo) { return encodeTempo(tempo); }), true), midi.header.timeSignatures.map(function (timeSig) { return encodeTimeSignature(timeSig); }), true)
], midi.tracks.map(function (track) {
return __spreadArray(__spreadArray(__spreadArray([
// Add the name
encodeTrackName(track.name),
// the instrument
encodeInstrument(track)
], encodeNotes(track), true), encodeControlChanges(track), true), encodePitchBends(track), true);
}), true),
};
// Sort and set `deltaTime` of all of the tracks.
midiData.tracks = midiData.tracks.map(function (track) {
track = track.sort(function (a, b) { return a.absoluteTime - b.absoluteTime; });
var lastTime = 0;
track.forEach(function (note) {
note.deltaTime = note.absoluteTime - lastTime;
lastTime = note.absoluteTime;
delete note.absoluteTime;
});
// End of track.
track.push({
deltaTime: 0,
meta: true,
type: "endOfTrack",
});
return track;
});
// Rreturn `midiData`.
return new Uint8Array((0, midi_file_1.writeMidi)(midiData));
}
exports.encode = encode;
//# sourceMappingURL=Encode.js.map
;