UNPKG

@tonejs/midi

Version:

Convert binary midi into JSON

185 lines 5.84 kB
"use strict"; 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