UNPKG

brand-music

Version:

Strongly typed music theory library

481 lines (457 loc) 16.2 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all2) => { for (var name in all2) __defProp(target, name, { get: all2[name], enumerable: true }); }; var __copyProps = (to, from9, except, desc) => { if (from9 && typeof from9 === "object" || typeof from9 === "function") { for (let key of __getOwnPropNames(from9)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from9[key], enumerable: !(desc = __getOwnPropDesc(from9, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod2) => __copyProps(__defProp({}, "__esModule", { value: true }), mod2); // src/index.ts var src_exports = {}; __export(src_exports, { IntervalClass: () => IntervalClass_exports, MidiNoteNumber: () => MidiNoteNumber_exports2, PitchClass: () => PitchClass_exports2, PitchClassSet: () => PitchClassSet_exports, PitchInterval: () => PitchInterval_exports2, PitchIntervalClass: () => PitchIntervalClass_exports2, PitchIntervalClassSet: () => PitchIntervalClassSet_exports, Semitones: () => Semitones_exports2 }); module.exports = __toCommonJS(src_exports); // src/IntervalClass.ts var IntervalClass_exports = {}; __export(IntervalClass_exports, { ALL: () => ALL4, MAX: () => MAX4, MIN: () => MIN5, between: () => icBetweenPc, from: () => from6, fromIntClamp: () => fromIntClamp4, fromIntMod: () => fromIntMod4, fromNum: () => fromNum6, fromPic: () => icFromPic, fromUnknown: () => fromUnknown7, hasShape: () => hasShape6, mark: () => mark6, markNum: () => markNum6, markUnknown: () => markUnknown6 }); // src/internal/utils.ts var mod = (a, n) => (a % n + n) % n; // src/internal/refined/Literal.ts var is = (start, end) => (v) => Number.isSafeInteger(v) && start <= v && v <= end; var clamp = (start, end) => (v) => v < start ? start : v > end ? end : v; var modded = (start, end) => (v) => { const size = end - start + 1; const zero = v - start; const m = mod(zero, size); return m + start; }; var all = (start, end) => ( // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment [...Array(end - start + 1)].map((_, i) => start + i) ); var asInt = (v) => v; // src/internal/MidiNoteNumber.ts var min = 0; var max = 127; var hasShape = is(min, max); var mark = (_v) => true; var markNum = (v) => hasShape(v); var markUnknown = (v) => hasShape(v); var from = (v) => v; var fromNum = (v) => markNum(v) ? v : void 0; var fromIntClamp = (v) => from(clamp(min, max)(v)); var fromIntMod = (v) => from(modded(min, max)(v)); var fromUnknown = (v) => markUnknown(v) ? v : void 0; var const_ = (v) => v; var MIN = const_(min); var MAX = const_(max); var ALL = all(min, max).map(const_); var C_1 = const_(0); var C4 = const_(60); var G9 = const_(127); // src/internal/refined/Int.ts var isInt = (v) => Number.isInteger(v); var fromUnknown2 = (v) => isInt(v) ? v : void 0; var makeChecked = (v) => fromUnknown2(v); var makeRound = (v) => Math.round(v); var makeTrunc = (v) => Math.trunc(v); var add = (a, b) => a + b; var addChecked = (a, b) => makeChecked(a + b); var sub = (a, b) => a - b; var subChecked = (a, b) => makeChecked(a - b); var mul = (a, b) => a * b; var mulChecked = (a, b) => makeChecked(a * b); var mulRound = (a, b) => makeRound(a * b); var mulTrunc = (a, b) => makeTrunc(a * b); var divChecked = (a, b) => makeChecked(a * b); var divRound = (a, b) => makeRound(a * b); var divTrunc = (a, b) => makeTrunc(a * b); // src/internal/PitchClass.ts var min2 = 0; var max2 = 11; var hasShape2 = is(min2, max2); var mark2 = (_v) => true; var markNum2 = (v) => hasShape2(v); var markUnknown2 = (v) => hasShape2(v); var from2 = (v) => v; var fromNum2 = (v) => markNum2(v) ? v : void 0; var fromIntClamp2 = (v) => from2(clamp(min2, max2)(v)); var fromIntMod2 = (v) => from2(modded(min2, max2)(v)); var fromUnknown3 = (v) => is(min2, max2)(v) ? from2(v) : void 0; var const_2 = (value) => value; var MIN2 = const_2(min2); var MAX2 = const_2(max2); var ALL2 = all(min2, max2).map(const_2); var invert = (v, index = 0) => fromIntMod2(sub(asInt(index), asInt(v))); // src/internal/refined/NonNegative.ts var isNonNegative = (v) => typeof v === "number" && v >= 0; function makeAbs(v, edgeCases) { const caseNaN = edgeCases?.NaN ?? 0; if (Number.isNaN(v)) { return caseNaN; } else { return Math.abs(v); } } // src/internal/PitchInterval.ts var hasShape3 = isInt; var mark3 = (_v) => true; var markNum3 = (v) => hasShape3(v); var markUnknown3 = (v) => hasShape3(v); var from3 = (v) => v; var fromNum3 = (v) => markNum3(v) ? v : void 0; var fromNumRound = (v) => from3(makeRound(v)); var fromNumTrunc = (v) => from3(makeTrunc(v)); var fromUnknown4 = (v) => markUnknown3(v) ? v : void 0; var fromUndefinedable = (v) => v != null ? from3(v) : v; var add2 = (a, b) => from3(add(a, b)); var addChecked2 = (a, b) => fromUndefinedable(addChecked(a, b)); var sub2 = (a, b) => from3(sub(a, b)); var subChecked2 = (a, b) => fromUndefinedable(subChecked(a, b)); var mul2 = (a, b) => from3(mul(a, b)); var mulChecked2 = (a, b) => fromUndefinedable(mulChecked(a, b)); var mulRound2 = (a, b) => from3(mulRound(a, b)); var mulTrunc2 = (a, b) => from3(mulTrunc(a, b)); var divChecked2 = (a, b) => fromUndefinedable(divChecked(a, b)); var divRound2 = (a, b) => from3(divRound(a, b)); var divTrunc2 = (a, b) => from3(divTrunc(a, b)); var octaves = (pi) => pi === 0 ? 0 : makeAbs(makeTrunc(pi / 12)); var direction = (pi) => pi < 0 ? -1 : pi > 0 ? 1 : 0; // src/internal/PitchIntervalClass.ts var min3 = 0; var max3 = 11; var hasShape4 = is(min3, max3); var mark4 = (_v) => true; var markNum4 = (v) => hasShape4(v); var markUnknown4 = (v) => hasShape4(v); var from4 = (v) => v; var fromNum4 = (v) => markNum4(v) ? v : void 0; var fromIntClamp3 = (v) => from4(clamp(min3, max3)(v)); var fromIntMod3 = (v) => from4(modded(min3, max3)(v)); var fromUnknown5 = (v) => markUnknown4(v) ? v : void 0; var const_3 = (value) => value; var MIN3 = const_3(min3); var MAX3 = const_3(max3); var ALL3 = all(min3, max3).map(const_3); var invert2 = (v, index = 0) => fromIntMod3(sub(asInt(index), asInt(v))); // src/internal/refined/NonNegativeInt.ts var isNonNegativeInt = (v) => isInt(v) && isNonNegative(v); // src/internal/Semitones.ts var hasShape5 = isNonNegativeInt; var mark5 = (_v) => true; var markNum5 = (v) => hasShape5(v); var markUnknown5 = (v) => hasShape5(v); var from5 = (v) => v; var fromNum5 = (v) => markNum5(v) ? v : void 0; var fromIntAbs = (v) => from5(makeAbs(v)); var fromUnknown6 = (v) => markUnknown5(v) ? v : void 0; var const_4 = (v) => v; var MIN4 = const_4(0); var octaves2 = (st) => st === 0 ? 0 : makeTrunc(st / 12); // src/internal/conversion.ts var icFromPic = (pic) => Math.min(pic, invert2(pic)); var icBetweenPc = (a, b) => icFromPic(picBetweenPc(a, b)); var mnnAdd = (value, interval) => add(asInt(value), asInt(interval)); var mnnTransposeChecked = (value, interval) => fromNum(mnnAdd(value, interval)); var mnnTransposeClamped = (value, interval) => fromIntClamp(mnnAdd(value, interval)); var mnnTransposeModded = (value, interval) => fromIntMod(mnnAdd(value, interval)); var pcTranspose = (value, interval) => fromIntMod2(add(asInt(value), asInt(interval))); var pcFromMnn = (mnn) => fromIntMod2(asInt(mnn)); var piBetweenMnn = (from9, to) => from3(sub(asInt(to), asInt(from9))); var picBetweenPc = (from9, to) => fromIntMod3(sub(asInt(to), asInt(from9))); var picFromPi = (pi) => fromIntMod3(pi); var picFromSemitones = (semitones) => fromIntMod3(semitones); var stFromPi = (pi) => fromIntAbs(pi); var stBetweenMnn = (a, b) => fromIntAbs(sub(asInt(a), asInt(b))); // src/internal/IntervalClass.ts var min4 = 0; var max4 = 6; var hasShape6 = is(min4, max4); var mark6 = (_v) => true; var markNum6 = (v) => hasShape6(v); var markUnknown6 = (v) => hasShape6(v); var from6 = (v) => v; var fromNum6 = (v) => markNum6(v) ? v : void 0; var fromIntClamp4 = (v) => from6(clamp(min4, max4)(v)); var fromIntMod4 = (v) => from6(modded(min4, max4)(v)); var fromUnknown7 = (v) => markUnknown6(v) ? v : void 0; var const_5 = (value) => value; var MIN5 = const_5(min4); var MAX4 = const_5(max4); var ALL4 = all(min4, max4).map(const_5); // src/MidiNoteNumber.ts var MidiNoteNumber_exports2 = {}; __export(MidiNoteNumber_exports2, { ALL: () => ALL, C4: () => C4, C_1: () => C_1, G9: () => G9, MAX: () => MAX, MIN: () => MIN, from: () => from, fromIntClamp: () => fromIntClamp, fromIntMod: () => fromIntMod, fromNum: () => fromNum, fromUnknown: () => fromUnknown, hasShape: () => hasShape, mark: () => mark, markNum: () => markNum, markUnknown: () => markUnknown, pc: () => pcFromMnn, pi: () => piBetweenMnn, semitones: () => stBetweenMnn, transposeChecked: () => mnnTransposeChecked, transposeClamped: () => mnnTransposeClamped, transposeModded: () => mnnTransposeModded }); // src/PitchClass.ts var PitchClass_exports2 = {}; __export(PitchClass_exports2, { ALL: () => ALL2, MAX: () => MAX2, MIN: () => MIN2, from: () => from2, fromIntClamp: () => fromIntClamp2, fromIntMod: () => fromIntMod2, fromMnn: () => pcFromMnn, fromNum: () => fromNum2, fromUnknown: () => fromUnknown3, hasShape: () => hasShape2, ic: () => icBetweenPc, invert: () => invert, mark: () => mark2, markNum: () => markNum2, markUnknown: () => markUnknown2, pic: () => picBetweenPc, transpose: () => pcTranspose }); // src/PitchClassSet.ts var PitchClassSet_exports = {}; __export(PitchClassSet_exports, { ALL: () => ALL6, EMPTY: () => EMPTY2, add: () => add4, difference: () => difference2, from: () => from7, fromRaw: () => fromRaw, fromRawMasked: () => fromRawMasked, fromRawUnknown: () => fromRawUnknown, has: () => has2, hasShape: () => hasShape7, intersection: () => intersection2, isSubset: () => isSubset2, isSuperset: () => isSuperset2, mark: () => mark7, markRaw: () => markRaw, markRawUnknown: () => markRawUnknown, remove: () => remove2, symmetricDifference: () => symmetricDifference2, toggle: () => toggle2, toggleAll: () => toggleAll, union: () => union2, values: () => values2 }); // src/internal/refined/TwelveBits.ts var isTwelveBits = (v) => isNonNegativeInt(v) && v < 1 << 12; var EMPTY = 0; var ALL5 = 4095; var masked = (v) => v & ALL5; var one = (value) => 1 << value; var fromValues = (...values4) => values4.map(one).reduce(union); var values = (a) => all(0, 11).filter((value) => has(a, value)); var complement = (a) => masked(~a); var union = (a, b) => a | b; var intersection = (a, b) => a & b; var symmetricDifference = (a, b) => a ^ b; var difference = (a, b) => intersection(a, complement(b)); var has = (a, value) => Boolean(intersection(a, fromValues(value))); var add3 = (a, value) => union(a, fromValues(value)); var remove = (a, value) => intersection(a, complement(fromValues(value))); var toggle = (a, value) => symmetricDifference(a, fromValues(value)); var isSuperset = (a, of) => !intersection(complement(a), of); var isSubset = (a, of) => isSuperset(of, a); // src/internal/PitchClassSet.ts var hasShape7 = isTwelveBits; var mark7 = (_v) => true; var markRaw = (v) => hasShape7(v); var markRawUnknown = (v) => hasShape7(v); var fromRaw = (v) => v; var fromRawMasked = (v) => fromRaw(masked(v)); var fromRawUnknown = (v) => isTwelveBits(v) ? fromRaw(v) : void 0; var EMPTY2 = fromRaw(EMPTY); var ALL6 = fromRaw(ALL5); var from7 = (...values4) => fromRaw(fromValues(...values4)); var toggleAll = (pcs) => fromRaw(complement(pcs)); var union2 = (a, b) => fromRaw(union(a, b)); var intersection2 = (a, b) => fromRaw(intersection(a, b)); var symmetricDifference2 = (a, b) => fromRaw(symmetricDifference(a, b)); var difference2 = (a, b) => fromRaw(difference(a, b)); var has2 = (pcs, pc) => has(pcs, pc); var add4 = (pcs, pc) => fromRaw(add3(pcs, pc)); var remove2 = (pcs, pc) => fromRaw(remove(pcs, pc)); var toggle2 = (pcs, pc) => fromRaw(toggle(pcs, pc)); var isSuperset2 = (value, of) => isSuperset(value, of); var isSubset2 = (value, of) => isSubset(value, of); var values2 = (pcs) => values(pcs).map(from2); // src/PitchInterval.ts var PitchInterval_exports2 = {}; __export(PitchInterval_exports2, { add: () => add2, addChecked: () => addChecked2, between: () => piBetweenMnn, direction: () => direction, divChecked: () => divChecked2, divRound: () => divRound2, divTrunc: () => divTrunc2, from: () => from3, fromNum: () => fromNum3, fromNumRound: () => fromNumRound, fromNumTrunc: () => fromNumTrunc, fromUnknown: () => fromUnknown4, hasShape: () => hasShape3, mark: () => mark3, markNum: () => markNum3, markUnknown: () => markUnknown3, mul: () => mul2, mulChecked: () => mulChecked2, mulRound: () => mulRound2, mulTrunc: () => mulTrunc2, octaves: () => octaves, pic: () => picFromPi, semitones: () => stFromPi, sub: () => sub2, subChecked: () => subChecked2 }); // src/PitchIntervalClass.ts var PitchIntervalClass_exports2 = {}; __export(PitchIntervalClass_exports2, { ALL: () => ALL3, MAX: () => MAX3, MIN: () => MIN3, between: () => picBetweenPc, from: () => from4, fromIntClamp: () => fromIntClamp3, fromIntMod: () => fromIntMod3, fromNum: () => fromNum4, fromPi: () => picFromPi, fromSemitones: () => picFromSemitones, fromUnknown: () => fromUnknown5, hasShape: () => hasShape4, ic: () => icFromPic, invert: () => invert2, mark: () => mark4, markNum: () => markNum4, markUnknown: () => markUnknown4 }); // src/PitchIntervalClassSet.ts var PitchIntervalClassSet_exports = {}; __export(PitchIntervalClassSet_exports, { ALL: () => ALL7, EMPTY: () => EMPTY3, add: () => add5, difference: () => difference3, from: () => from8, fromRaw: () => fromRaw2, fromRawMasked: () => fromRawMasked2, fromRawUnknown: () => fromRawUnknown2, has: () => has3, hasShape: () => hasShape8, intersection: () => intersection3, isSubset: () => isSubset3, isSuperset: () => isSuperset3, mark: () => mark8, markRaw: () => markRaw2, markRawUnknown: () => markRawUnknown2, remove: () => remove3, symmetricDifference: () => symmetricDifference3, toggle: () => toggle3, toggleAll: () => toggleAll2, union: () => union3, values: () => values3 }); // src/internal/PitchIntervalClassSet.ts var hasShape8 = isTwelveBits; var mark8 = (_v) => true; var markRaw2 = (v) => hasShape8(v); var markRawUnknown2 = (v) => hasShape8(v); var fromRaw2 = (v) => v; var fromRawMasked2 = (v) => fromRaw2(masked(v)); var fromRawUnknown2 = (v) => isTwelveBits(v) ? fromRaw2(v) : void 0; var EMPTY3 = fromRaw2(EMPTY); var ALL7 = fromRaw2(ALL5); var one2 = (pc) => 1 << pc; var from8 = (...values4) => values4.map(one2).reduce(union3); var toggleAll2 = (pcs) => ~pcs & ALL7; var union3 = (a, b) => a | b; var intersection3 = (a, b) => a & b; var symmetricDifference3 = (a, b) => a ^ b; var difference3 = (a, b) => intersection3(a, toggleAll2(b)); var has3 = (pcs, pc) => Boolean(intersection3(pcs, from8(pc))); var add5 = (pcs, pc) => union3(pcs, from8(pc)); var remove3 = (pcs, pc) => intersection3(pcs, toggleAll2(from8(pc))); var toggle3 = (pcs, pc) => symmetricDifference3(pcs, from8(pc)); var isSuperset3 = (value, of) => !intersection3(toggleAll2(value), of); var isSubset3 = (value, of) => isSuperset3(of, value); var values3 = (pics) => values(pics).map(from4); // src/Semitones.ts var Semitones_exports2 = {}; __export(Semitones_exports2, { MIN: () => MIN4, between: () => stBetweenMnn, from: () => from5, fromIntAbs: () => fromIntAbs, fromNum: () => fromNum5, fromPi: () => stFromPi, fromUnknown: () => fromUnknown6, hasShape: () => hasShape5, mark: () => mark5, markNum: () => markNum5, markUnknown: () => markUnknown5, octaves: () => octaves2, pic: () => picFromSemitones }); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { IntervalClass, MidiNoteNumber, PitchClass, PitchClassSet, PitchInterval, PitchIntervalClass, PitchIntervalClassSet, Semitones }); //# sourceMappingURL=index.cjs.map