UNPKG

webdaw-modules

Version:

a set of modules for building a web-based DAW

144 lines 5.59 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.removeDoubleEvents = exports.sortMIDIEvents = exports.getNoteNumber = exports.getMidiMessageEvent = exports.getMidiEventDescription = exports.noteNames = exports.PITCH_BEND = exports.CHANNEL_AFTERTOUCH = exports.PROGRAM_CHANGE = exports.CONTROLLER = exports.NOTE_AFTERTOUCH = exports.NOTE_OFF = exports.NOTE_ON = exports.DIVIDED_SYSTEM_EXCLUSIVE = exports.SYSTEM_EXCLUSIVE = exports.SEQUENCER_SPECIFIC = exports.KEY_SIGNATURE = exports.TIME_SIGNATURE = exports.SMPTE_OFFSET = exports.TEMPO = exports.END_OF_TRACK = exports.CHANNEL_PREFIX = exports.CUE_POINT = exports.MARKER = exports.LYRICS = exports.INSTRUMENT_NAME = exports.TRACK_NAME = exports.COPYRIGHT_NOTICE = exports.TEXT = exports.SEQUENCE_NUMBER = void 0; exports.SEQUENCE_NUMBER = "sequence number"; exports.TEXT = "text"; exports.COPYRIGHT_NOTICE = "copyright notice"; exports.TRACK_NAME = "track name"; exports.INSTRUMENT_NAME = "instrument name"; exports.LYRICS = "lyrics"; exports.MARKER = "marker"; exports.CUE_POINT = "cue point"; exports.CHANNEL_PREFIX = "channel prefix"; exports.END_OF_TRACK = "end of track"; exports.TEMPO = "tempo"; exports.SMPTE_OFFSET = "smpte offset"; exports.TIME_SIGNATURE = "time signature"; exports.KEY_SIGNATURE = "key signature"; exports.SEQUENCER_SPECIFIC = "sequencer specific"; exports.SYSTEM_EXCLUSIVE = "system exclusive"; exports.DIVIDED_SYSTEM_EXCLUSIVE = "divided system exclusive"; exports.NOTE_ON = "note on"; exports.NOTE_OFF = "note off"; exports.NOTE_AFTERTOUCH = "note aftertouch"; exports.CONTROLLER = "controller"; exports.PROGRAM_CHANGE = "program change"; exports.CHANNEL_AFTERTOUCH = "channel aftertouch"; exports.PITCH_BEND = "pitch bend"; var descriptions = { 0xff: { 0x00: "sequence number", 0x01: "text", 0x02: "copyright notice", 0x03: "track name", 0x04: "instrument name", 0x05: "lyrics", 0x06: "marker", 0x07: "cue point", 0x20: "channel prefix", 0x2f: "end of track", 0x51: "tempo", 0x54: "smpte offset", 0x58: "time signature", 0x59: "key signature", 0x7f: "sequencer specific", }, 0xf0: "system exclusive", 0xf7: "divided sysex", 0x80: "note on", 0x90: "note off", 0xa0: "note aftertouch", 0xb0: "controller", 0xc0: "program change", 0xd0: "channel aftertouch", 0xe0: "pitch bend", }; exports.noteNames = { sharp: ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"], flat: ["C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb", "B"], "enharmonic-sharp": ["B#", "C#", "C##", "D#", "D##", "E#", "F#", "F##", "G#", "G##", "A#", "A##"], "enharmonic-flat": ["Dbb", "Db", "Ebb", "Eb", "Fb", "Gbb", "Gb", "Abb", "Ab", "Bbb", "Bb", "Cb"], }; exports.getMidiEventDescription = function (type, subType) { if (typeof subType === "undefined") { return descriptions[type]; } return descriptions[type][subType] || "undefined"; }; exports.getMidiMessageEvent = function (event) { switch (event.descr) { case exports.NOTE_ON: return [0x90 + event.channel, event.noteNumber, event.velocity]; case exports.NOTE_OFF: return [0x80 + event.channel, event.noteNumber, event.velocity]; } return [0]; }; exports.getNoteNumber = function (name, octave, mode) { if (mode === void 0) { mode = "sharp"; } // let index = -1; // const modes = Object.getOwnPropertyNames(noteNames); // for (let i = 0, maxi = modes.length; i < maxi; i++) { // const names = modes[i]; // for (let j = 0, maxj = names.length; j < maxj; j++) { // if (mode[j] === name) { // index = i; // break; // } // } // } var index = -1; var modes = Object.values(exports.noteNames); for (var i = 0; i < modes.length; i++) { var names = modes[i]; for (var j = 0; j < names.length; j++) { // console.log(names[j], name); if (names[j] === name) { index = j; break; } } } // console.log(name, octave, index); if (index === -1) { return -1; } //number = (index + 12) + (octave * 12) + 12; // → in Cubase central C = C3 instead of C4 return index + 12 + octave * 12; // → midi standard + scientific naming, see: http://en.wikipedia.org/wiki/Middle_C and http://en.wikipedia.org/wiki/Scientific_pitch_notation }; exports.sortMIDIEvents = function (events) { return events.sort(function (a, b) { if (a.ticks < b.ticks) { return -1; } else if (a.ticks > b.ticks) { return 1; // } else if (a.type === 0x80 && b.type === 0x90) { // // note off before note on // return -1; // } else if (a.type === 0x51 || a.type === 0x58) { // // tempo and time signature events first // return -1; } return 0; }); }; exports.removeDoubleEvents = function (events) { // var i, maxi = events.length, // event, eventId, lastId, // result = []; // events.sort(function (a, b) { // return a.eventNumber - b.eventNumber; // }); // for (i = 0; i < maxi; i++) { // event = events[i]; // eventId = event.id; // if (eventId !== lastId) { // result.push(event); // } // lastId = eventId; // } // return result; return []; }; //# sourceMappingURL=midi.js.map