webdaw-modules
Version:
a set of modules for building a web-based DAW
144 lines • 5.59 kB
JavaScript
;
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