12tet
Version:
Music theory library for generating and working with chords, modes, intervals, etc.
527 lines (526 loc) • 26.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.lydianStandardTonics = exports.isLydianStandardTonic = exports.phrygianTonics = exports.isPhrygianTonic = exports.phrygianTheoreticalTonics = exports.isPhrygianTheoreticalTonic = exports.phrygianStandardTonics = exports.isPhrygianStandardTonic = exports.dorianTonics = exports.isDorianTonic = exports.dorianTheoreticalTonics = exports.isDorianTheoreticalTonic = exports.dorianStandardTonics = exports.isDorianStandardTonic = exports.ionianTonics = exports.isIonianTonic = exports.ionianTheoreticalTonics = exports.isIonianTheoreticalTonic = exports.ionianStandardTonics = exports.isIonianStandardTonic = exports.modeDegreeNames = exports.isModeDegreeName = exports.modeDegrees = exports.isModeDegree = exports.alteredModeDegrees = exports.isAlteredModeDegree = exports.standardModeDegrees = exports.isStandardModeDegree = exports.modeKeySignatures = exports.isModeKeySignature = exports.theoreticalModeKeySignatures = exports.isTheoreticalModeKeySignature = exports.standardModeKeySignatures = exports.isStandardModeKeySignature = exports.flatModeKeySignatures = exports.isFlatModeKeySignature = exports.theoreticalFlatModeKeySignatures = exports.isTheoreticalFlatModeKeySignature = exports.standardFlatModeKeySignatures = exports.isStandardFlatModeKeySignature = exports.sharpModeKeySignatures = exports.isSharpModeKeySignature = exports.theoreticalSharpModeKeySignatures = exports.isTheoreticalSharpModeKeySignature = exports.standardSharpModeKeySignatures = exports.isStandardSharpModeKeySignature = exports.neutralModeKeySignatures = exports.isNeutralModeKeySignature = exports.modeNames = exports.isModeName = void 0;
exports.mode = exports.modeByName = exports.locrianMode = exports.aeolianMode = exports.mixolydianMode = exports.lydianMode = exports.phrygianMode = exports.dorianMode = exports.ionianMode = exports.intervalByDegree = exports.modeBaseByName = exports.isModeTonicByModeName = exports.tonics = exports.isTonic = exports.theoreticalTonics = exports.isTheoreticalTonic = exports.standardTonics = exports.isStandardTonic = exports.locrianTonics = exports.isLocrianTonic = exports.locrianTheoreticalTonics = exports.isLocrianTheoreticalTonic = exports.locrianStandardTonics = exports.isLocrianStandardTonic = exports.aeolianTonics = exports.isAeolianTonic = exports.aeolianTheoreticalTonics = exports.isAeolianTheoreticalTonic = exports.aeolianStandardTonics = exports.isAeolianStandardTonic = exports.mixolydianTonics = exports.isMixolydianTonic = exports.mixolydianTheoreticalTonics = exports.isMixolydianTheoreticalTonic = exports.mixolydianStandardTonics = exports.isMixolydianStandardTonic = exports.lydianTonics = exports.isLydianTonic = exports.lydianTheoreticalTonics = exports.isLydianTheoreticalTonic = void 0;
const interval_1 = require("../interval");
const key_1 = require("../key");
const utils_1 = require("../utils");
const MODE_NAMES = ['Ionian', 'Dorian', 'Phrygian', 'Lydian', 'Mixolydian', 'Aeolian', 'Locrian'];
function isModeName(name) {
return MODE_NAMES.includes(name);
}
exports.isModeName = isModeName;
exports.modeNames = [...MODE_NAMES];
const NEUTRAL_MODE_KEY_SIGNATURES = [''];
function isNeutralModeKeySignature(signature) {
return NEUTRAL_MODE_KEY_SIGNATURES.includes(signature);
}
exports.isNeutralModeKeySignature = isNeutralModeKeySignature;
exports.neutralModeKeySignatures = [...NEUTRAL_MODE_KEY_SIGNATURES];
const STANDARD_SHARP_MODE_KEY_SIGNATURES = ['1#', '2#', '3#', '4#', '5#', '6#', '7#'];
function isStandardSharpModeKeySignature(signature) {
return STANDARD_SHARP_MODE_KEY_SIGNATURES.includes(signature);
}
exports.isStandardSharpModeKeySignature = isStandardSharpModeKeySignature;
exports.standardSharpModeKeySignatures = [...STANDARD_SHARP_MODE_KEY_SIGNATURES];
const THEORETICAL_SHARP_MODE_KEY_SIGNATURES = ['8#', '9#', '10#', '11#', '12#', '13#', '14#'];
function isTheoreticalSharpModeKeySignature(signature) {
return THEORETICAL_SHARP_MODE_KEY_SIGNATURES.includes(signature);
}
exports.isTheoreticalSharpModeKeySignature = isTheoreticalSharpModeKeySignature;
exports.theoreticalSharpModeKeySignatures = [...THEORETICAL_SHARP_MODE_KEY_SIGNATURES];
const SHARP_MODE_KEY_SIGNATURES = [...STANDARD_SHARP_MODE_KEY_SIGNATURES, ...THEORETICAL_SHARP_MODE_KEY_SIGNATURES];
function isSharpModeKeySignature(signature) {
return SHARP_MODE_KEY_SIGNATURES.includes(signature);
}
exports.isSharpModeKeySignature = isSharpModeKeySignature;
exports.sharpModeKeySignatures = [...SHARP_MODE_KEY_SIGNATURES];
const STANDARD_FLAT_MODE_KEY_SIGNATURES = ['7b', '6b', '5b', '4b', '3b', '2b', '1b'];
function isStandardFlatModeKeySignature(signature) {
return STANDARD_FLAT_MODE_KEY_SIGNATURES.includes(signature);
}
exports.isStandardFlatModeKeySignature = isStandardFlatModeKeySignature;
exports.standardFlatModeKeySignatures = [...STANDARD_FLAT_MODE_KEY_SIGNATURES];
const THEORETICAL_FLAT_MODE_KEY_SIGNATURES = ['14b', '13b', '12b', '11b', '10b', '9b', '8b'];
function isTheoreticalFlatModeKeySignature(signature) {
return THEORETICAL_FLAT_MODE_KEY_SIGNATURES.includes(signature);
}
exports.isTheoreticalFlatModeKeySignature = isTheoreticalFlatModeKeySignature;
exports.theoreticalFlatModeKeySignatures = [...THEORETICAL_FLAT_MODE_KEY_SIGNATURES];
const FLAT_MODE_KEY_SIGNATURES = [...THEORETICAL_FLAT_MODE_KEY_SIGNATURES, ...STANDARD_FLAT_MODE_KEY_SIGNATURES];
function isFlatModeKeySignature(signature) {
return FLAT_MODE_KEY_SIGNATURES.includes(signature);
}
exports.isFlatModeKeySignature = isFlatModeKeySignature;
exports.flatModeKeySignatures = [...FLAT_MODE_KEY_SIGNATURES];
const STANDARD_MODE_KEY_SIGNATURES = [...NEUTRAL_MODE_KEY_SIGNATURES, ...STANDARD_SHARP_MODE_KEY_SIGNATURES, ...STANDARD_FLAT_MODE_KEY_SIGNATURES];
function isStandardModeKeySignature(signature) {
return STANDARD_MODE_KEY_SIGNATURES.includes(signature);
}
exports.isStandardModeKeySignature = isStandardModeKeySignature;
exports.standardModeKeySignatures = [...STANDARD_MODE_KEY_SIGNATURES];
const THEORETICAL_MODE_KEY_SIGNATURES = [...THEORETICAL_SHARP_MODE_KEY_SIGNATURES, ...THEORETICAL_FLAT_MODE_KEY_SIGNATURES];
function isTheoreticalModeKeySignature(signature) {
return THEORETICAL_MODE_KEY_SIGNATURES.includes(signature);
}
exports.isTheoreticalModeKeySignature = isTheoreticalModeKeySignature;
exports.theoreticalModeKeySignatures = [...THEORETICAL_MODE_KEY_SIGNATURES];
const MODE_KEY_SIGNATURES = [...NEUTRAL_MODE_KEY_SIGNATURES, ...SHARP_MODE_KEY_SIGNATURES, ...FLAT_MODE_KEY_SIGNATURES];
function isModeKeySignature(signature) {
return MODE_KEY_SIGNATURES.includes(signature);
}
exports.isModeKeySignature = isModeKeySignature;
exports.modeKeySignatures = [...MODE_KEY_SIGNATURES];
const STANDARD_MODE_DEGREES = ['1', '2', '3', '4', '5', '6', '7'];
function isStandardModeDegree(degree) {
return STANDARD_MODE_DEGREES.includes(degree);
}
exports.isStandardModeDegree = isStandardModeDegree;
exports.standardModeDegrees = [...STANDARD_MODE_DEGREES];
const ALTERED_MODE_DEGREES = ['b1', '#1', 'b2', '#2', 'b3', '#3', 'b4', '#4', 'b5', '#5', 'b6', '#6', 'b7', '#7'];
function isAlteredModeDegree(degree) {
return ALTERED_MODE_DEGREES.includes(degree);
}
exports.isAlteredModeDegree = isAlteredModeDegree;
exports.alteredModeDegrees = [...ALTERED_MODE_DEGREES];
const MODE_DEGREES = [...STANDARD_MODE_DEGREES, ...ALTERED_MODE_DEGREES];
function isModeDegree(degree) {
return MODE_DEGREES.includes(degree);
}
exports.isModeDegree = isModeDegree;
exports.modeDegrees = [...MODE_DEGREES];
const MODE_DEGREE_NAMES = ['Tonic', 'Supertonic', 'Mediant', 'Subdominant', 'Dominant', 'Submediant', 'Subtonic', 'Leading Tone'];
function isModeDegreeName(degreeName) {
return MODE_DEGREE_NAMES.includes(degreeName);
}
exports.isModeDegreeName = isModeDegreeName;
exports.modeDegreeNames = [...MODE_DEGREE_NAMES];
const IONIAN_STANDARD_TONICS = ['C', 'G', 'D', 'A', 'E', 'B', 'F#', 'C#', 'Cb', 'Gb', 'Db', 'Ab', 'Eb', 'Bb', 'F'];
function isIonianStandardTonic(note) {
return IONIAN_STANDARD_TONICS.includes(note);
}
exports.isIonianStandardTonic = isIonianStandardTonic;
exports.ionianStandardTonics = [...IONIAN_STANDARD_TONICS];
const IONIAN_THEORETICAL_TONICS = ['G#', 'D#', 'A#', 'E#', 'B#', 'F##', 'C##', 'Cbb', 'Gbb', 'Dbb', 'Abb', 'Ebb', 'Bbb', 'Fb'];
function isIonianTheoreticalTonic(note) {
return IONIAN_THEORETICAL_TONICS.includes(note);
}
exports.isIonianTheoreticalTonic = isIonianTheoreticalTonic;
exports.ionianTheoreticalTonics = [...IONIAN_THEORETICAL_TONICS];
const IONIAN_TONICS = [...IONIAN_STANDARD_TONICS, ...IONIAN_THEORETICAL_TONICS];
function isIonianTonic(note) {
return IONIAN_TONICS.includes(note);
}
exports.isIonianTonic = isIonianTonic;
exports.ionianTonics = [...IONIAN_TONICS];
const DORIAN_STANDARD_TONICS = ['D', 'A', 'E', 'B', 'F#', 'C#', 'G#', 'D#', 'Db', 'Ab', 'Eb', 'Bb', 'F', 'C', 'G'];
function isDorianStandardTonic(note) {
return DORIAN_STANDARD_TONICS.includes(note);
}
exports.isDorianStandardTonic = isDorianStandardTonic;
exports.dorianStandardTonics = [...DORIAN_STANDARD_TONICS];
const DORIAN_THEORETICAL_TONICS = ['A#', 'E#', 'B#', 'F##', 'C##', 'G##', 'D##', 'Dbb', 'Abb', 'Ebb', 'Bbb', 'Fb', 'Cb', 'Gb'];
function isDorianTheoreticalTonic(note) {
return DORIAN_THEORETICAL_TONICS.includes(note);
}
exports.isDorianTheoreticalTonic = isDorianTheoreticalTonic;
exports.dorianTheoreticalTonics = [...DORIAN_THEORETICAL_TONICS];
const DORIAN_TONICS = [...DORIAN_STANDARD_TONICS, ...DORIAN_THEORETICAL_TONICS];
function isDorianTonic(note) {
return DORIAN_TONICS.includes(note);
}
exports.isDorianTonic = isDorianTonic;
exports.dorianTonics = [...DORIAN_TONICS];
const PHRYGIAN_STANDARD_TONICS = ['E', 'B', 'F#', 'C#', 'G#', 'D#', 'A#', 'E#', 'Eb', 'Bb', 'F', 'C', 'G', 'D', 'A'];
function isPhrygianStandardTonic(note) {
return PHRYGIAN_STANDARD_TONICS.includes(note);
}
exports.isPhrygianStandardTonic = isPhrygianStandardTonic;
exports.phrygianStandardTonics = [...PHRYGIAN_STANDARD_TONICS];
const PHRYGIAN_THEORETICAL_TONICS = ['B#', 'F##', 'C##', 'G##', 'D##', 'A##', 'E##', 'Ebb', 'Bbb', 'Fb', 'Cb', 'Gb', 'Db', 'Ab'];
function isPhrygianTheoreticalTonic(note) {
return PHRYGIAN_THEORETICAL_TONICS.includes(note);
}
exports.isPhrygianTheoreticalTonic = isPhrygianTheoreticalTonic;
exports.phrygianTheoreticalTonics = [...PHRYGIAN_THEORETICAL_TONICS];
const PHRYGIAN_TONICS = [...PHRYGIAN_STANDARD_TONICS, ...PHRYGIAN_THEORETICAL_TONICS];
function isPhrygianTonic(note) {
return PHRYGIAN_TONICS.includes(note);
}
exports.isPhrygianTonic = isPhrygianTonic;
exports.phrygianTonics = [...PHRYGIAN_TONICS];
const LYDIAN_STANDARD_TONICS = ['F', 'C', 'G', 'D', 'A', 'E', 'B', 'F#', 'Fb', 'Cb', 'Gb', 'Db', 'Ab', 'Eb', 'Bb'];
function isLydianStandardTonic(note) {
return LYDIAN_STANDARD_TONICS.includes(note);
}
exports.isLydianStandardTonic = isLydianStandardTonic;
exports.lydianStandardTonics = [...LYDIAN_STANDARD_TONICS];
const LYDIAN_THEORETICAL_TONICS = ['C#', 'G#', 'D#', 'A#', 'E#', 'B#', 'F##', 'Fbb', 'Cbb', 'Gbb', 'Dbb', 'Abb', 'Ebb', 'Bbb'];
function isLydianTheoreticalTonic(note) {
return LYDIAN_THEORETICAL_TONICS.includes(note);
}
exports.isLydianTheoreticalTonic = isLydianTheoreticalTonic;
exports.lydianTheoreticalTonics = [...LYDIAN_THEORETICAL_TONICS];
const LYDIAN_TONICS = [...LYDIAN_STANDARD_TONICS, ...LYDIAN_THEORETICAL_TONICS];
function isLydianTonic(note) {
return LYDIAN_TONICS.includes(note);
}
exports.isLydianTonic = isLydianTonic;
exports.lydianTonics = [...LYDIAN_TONICS];
const MIXOLYDIAN_STANDARD_TONICS = ['G', 'D', 'A', 'E', 'B', 'F#', 'C#', 'G#', 'Gb', 'Db', 'Ab', 'Eb', 'Bb', 'F', 'C'];
function isMixolydianStandardTonic(note) {
return MIXOLYDIAN_STANDARD_TONICS.includes(note);
}
exports.isMixolydianStandardTonic = isMixolydianStandardTonic;
exports.mixolydianStandardTonics = [...MIXOLYDIAN_STANDARD_TONICS];
const MIXOLYDIAN_THEORETICAL_TONICS = ['D#', 'A#', 'E#', 'B#', 'F##', 'C##', 'G##', 'Gbb', 'Dbb', 'Abb', 'Ebb', 'Bbb', 'Fb', 'Cb'];
function isMixolydianTheoreticalTonic(note) {
return MIXOLYDIAN_THEORETICAL_TONICS.includes(note);
}
exports.isMixolydianTheoreticalTonic = isMixolydianTheoreticalTonic;
exports.mixolydianTheoreticalTonics = [...MIXOLYDIAN_THEORETICAL_TONICS];
const MIXOLYDIAN_TONICS = [...MIXOLYDIAN_STANDARD_TONICS, ...MIXOLYDIAN_THEORETICAL_TONICS];
function isMixolydianTonic(note) {
return MIXOLYDIAN_TONICS.includes(note);
}
exports.isMixolydianTonic = isMixolydianTonic;
exports.mixolydianTonics = [...MIXOLYDIAN_TONICS];
const AEOLIAN_STANDARD_TONICS = ['A', 'E', 'B', 'F#', 'C#', 'G#', 'D#', 'A#', 'Ab', 'Eb', 'Bb', 'F', 'C', 'G', 'D'];
function isAeolianStandardTonic(note) {
return AEOLIAN_STANDARD_TONICS.includes(note);
}
exports.isAeolianStandardTonic = isAeolianStandardTonic;
exports.aeolianStandardTonics = [...AEOLIAN_STANDARD_TONICS];
const AEOLIAN_THEORETICAL_TONICS = ['E#', 'B#', 'F##', 'C##', 'G##', 'D##', 'A##', 'Abb', 'Ebb', 'Bbb', 'Fb', 'Cb', 'Gb', 'Db'];
function isAeolianTheoreticalTonic(note) {
return AEOLIAN_THEORETICAL_TONICS.includes(note);
}
exports.isAeolianTheoreticalTonic = isAeolianTheoreticalTonic;
exports.aeolianTheoreticalTonics = [...AEOLIAN_THEORETICAL_TONICS];
const AEOLIAN_TONICS = [...AEOLIAN_STANDARD_TONICS, ...AEOLIAN_THEORETICAL_TONICS];
function isAeolianTonic(note) {
return AEOLIAN_TONICS.includes(note);
}
exports.isAeolianTonic = isAeolianTonic;
exports.aeolianTonics = [...AEOLIAN_TONICS];
const LOCRIAN_STANDARD_TONICS = ['B', 'F#', 'C#', 'G#', 'D#', 'A#', 'E#', 'B#', 'Bb', 'F', 'C', 'G', 'D', 'A', 'E'];
function isLocrianStandardTonic(note) {
return LOCRIAN_STANDARD_TONICS.includes(note);
}
exports.isLocrianStandardTonic = isLocrianStandardTonic;
exports.locrianStandardTonics = [...LOCRIAN_STANDARD_TONICS];
const LOCRIAN_THEORETICAL_TONICS = ['F##', 'C##', 'G##', 'D##', 'A##', 'E##', 'B##', 'Bbb', 'Fb', 'Cb', 'Gb', 'Db', 'Ab', 'Eb'];
function isLocrianTheoreticalTonic(note) {
return LOCRIAN_THEORETICAL_TONICS.includes(note);
}
exports.isLocrianTheoreticalTonic = isLocrianTheoreticalTonic;
exports.locrianTheoreticalTonics = [...LOCRIAN_THEORETICAL_TONICS];
const LOCRIAN_TONICS = [...LOCRIAN_STANDARD_TONICS, ...LOCRIAN_THEORETICAL_TONICS];
function isLocrianTonic(note) {
return LOCRIAN_TONICS.includes(note);
}
exports.isLocrianTonic = isLocrianTonic;
exports.locrianTonics = [...LOCRIAN_TONICS];
const STANDARD_TONICS = [...IONIAN_STANDARD_TONICS, ...DORIAN_STANDARD_TONICS, ...PHRYGIAN_STANDARD_TONICS, ...LYDIAN_STANDARD_TONICS, ...MIXOLYDIAN_STANDARD_TONICS, ...AEOLIAN_STANDARD_TONICS, ...LOCRIAN_STANDARD_TONICS];
function isStandardTonic(note) {
return STANDARD_TONICS.includes(note);
}
exports.isStandardTonic = isStandardTonic;
exports.standardTonics = (0, utils_1.removeDuplicates)([...STANDARD_TONICS]);
const THEORETICAL_TONICS = [...IONIAN_THEORETICAL_TONICS, ...DORIAN_THEORETICAL_TONICS, ...PHRYGIAN_THEORETICAL_TONICS, ...LYDIAN_THEORETICAL_TONICS, ...MIXOLYDIAN_THEORETICAL_TONICS, ...AEOLIAN_THEORETICAL_TONICS, ...LOCRIAN_THEORETICAL_TONICS];
function isTheoreticalTonic(note) {
return THEORETICAL_TONICS.includes(note);
}
exports.isTheoreticalTonic = isTheoreticalTonic;
exports.theoreticalTonics = (0, utils_1.removeDuplicates)([...THEORETICAL_TONICS]);
const TONICS = [...STANDARD_TONICS, ...THEORETICAL_TONICS];
function isTonic(note) {
return TONICS.includes(note);
}
exports.isTonic = isTonic;
exports.tonics = (0, utils_1.removeDuplicates)([...TONICS]);
// Maps mode names to the associated isModeTonic type guard
exports.isModeTonicByModeName = {
Ionian: isIonianTonic,
Dorian: isDorianTonic,
Phrygian: isPhrygianTonic,
Lydian: isLydianTonic,
Mixolydian: isMixolydianTonic,
Aeolian: isAeolianTonic,
Locrian: isLocrianTonic
};
exports.modeBaseByName = {
Ionian: {
name: 'Ionian',
alternateName: 'Major',
chordNumerals: ['I', 'ii', 'iii', 'IV', 'V', 'vi', 'vii\u2070'],
chordBases: ['maj', 'min', 'min', 'maj', 'maj', 'min', 'dim'],
semitoneStructure: [2, 2, 1, 2, 2, 2, 1],
intervals: ['P1', 'M2', 'M3', 'P4', 'P5', 'M6', 'M7', 'P8'],
degreeAdjustmentFromIonian: [0, 0, 0, 0, 0, 0, 0]
},
Dorian: {
name: 'Dorian',
chordNumerals: ['i', 'ii', '\u1d47III', 'IV', 'v', 'vi\u2070', '\u1d47VII'],
chordBases: ['min', 'min', 'maj', 'maj', 'min', 'dim', 'maj'],
semitoneStructure: [2, 1, 2, 2, 2, 1, 2],
intervals: ['P1', 'M2', 'm3', 'P4', 'P5', 'M6', 'm7', 'P8'],
degreeAdjustmentFromIonian: [0, 0, -1, 0, 0, 0, -1],
},
Phrygian: {
name: 'Phrygian',
chordNumerals: ['i', '\u1d47II', '\u1d47III', 'iv', 'v\u2070', '\u1d47VI', '\u1d47vii'],
chordBases: ['min', 'maj', 'maj', 'min', 'dim', 'maj', 'min'],
semitoneStructure: [1, 2, 2, 2, 1, 2, 2],
intervals: ['P1', 'm2', 'm3', 'P4', 'P5', 'm6', 'm7'],
degreeAdjustmentFromIonian: [0, -1, -1, 0, 0, -1, -1],
},
Lydian: {
name: 'Lydian',
chordNumerals: ['I', 'II', 'iii', '#iv\u2070', 'V', 'vi', 'vii'],
chordBases: ['maj', 'maj', 'min', 'dim', 'maj', 'min', 'min'],
semitoneStructure: [2, 2, 2, 1, 2, 2, 1],
intervals: ['P1', 'M2', 'M3', 'TT', 'P5', 'M6', 'M7'],
degreeAdjustmentFromIonian: [0, 0, 0, 1, 0, 0, 0],
},
Mixolydian: {
name: 'Mixolydian',
chordNumerals: ['I', 'ii', 'iii\u2070', 'IV', 'v', 'vi', '\u1d47VII'],
chordBases: ['maj', 'min', 'dim', 'maj', 'min', 'min', 'maj'],
semitoneStructure: [2, 2, 1, 2, 2, 1, 2],
intervals: ['P1', 'M2', 'M3', 'P4', 'P5', 'M6', 'm7'],
degreeAdjustmentFromIonian: [0, 0, 0, 0, 0, 0, -1],
},
Aeolian: {
name: 'Aeolian',
alternateName: 'Minor',
chordNumerals: ['i', 'ii\u2070', '\u1d47III', 'iv', 'v', '\u1d47VI', '\u1d47VII'],
chordBases: ['min', 'dim', 'maj', 'min', 'min', 'maj', 'maj'],
semitoneStructure: [2, 1, 2, 2, 1, 2, 2],
intervals: ['P1', 'M2', 'm3', 'P4', 'P5', 'm6', 'm7'],
degreeAdjustmentFromIonian: [0, 0, -1, 0, 0, -1, -1],
},
Locrian: {
name: 'Locrian',
chordNumerals: ['i\u2070', '\u1d47II', '\u1d47iii', 'iv', '\u1d47V', '\u1d47VI', '\u1d47vii'],
chordBases: ['dim', 'maj', 'min', 'min', 'maj', 'maj', 'min'],
semitoneStructure: [1, 2, 2, 1, 2, 2, 2],
intervals: ['P1', 'm2', 'm3', 'P4', 'TT', 'm6', 'm7'],
degreeAdjustmentFromIonian: [0, -1, -1, 0, -1, -1, -1],
}
};
function keyByTonic(modeName) {
const keyByTonic = {};
switch (modeName) {
case 'Ionian':
IONIAN_TONICS.forEach(tonic => {
keyByTonic[tonic] = (0, key_1.ionianKey)(tonic);
});
return keyByTonic;
case 'Dorian':
DORIAN_TONICS.forEach(tonic => {
keyByTonic[tonic] = (0, key_1.dorianKey)(tonic);
});
return keyByTonic;
case 'Phrygian':
PHRYGIAN_TONICS.forEach(tonic => {
keyByTonic[tonic] = (0, key_1.phrygianKey)(tonic);
});
return keyByTonic;
case 'Lydian':
LYDIAN_TONICS.forEach(tonic => {
keyByTonic[tonic] = (0, key_1.lydianKey)(tonic);
});
return keyByTonic;
case 'Mixolydian':
MIXOLYDIAN_TONICS.forEach(tonic => {
keyByTonic[tonic] = (0, key_1.mixolydianKey)(tonic);
});
return keyByTonic;
case 'Aeolian':
AEOLIAN_TONICS.forEach(tonic => {
keyByTonic[tonic] = (0, key_1.aeolianKey)(tonic);
});
return keyByTonic;
case 'Locrian':
LOCRIAN_TONICS.forEach(tonic => {
keyByTonic[tonic] = (0, key_1.locrianKey)(tonic);
});
return keyByTonic;
}
}
function keyBySignature(modeName) {
const keyBySignature = {};
switch (modeName) {
case 'Ionian':
IONIAN_TONICS.forEach(tonic => {
const key = (0, key_1.ionianKey)(tonic);
keyBySignature[key.signature] = key;
});
return keyBySignature;
case 'Dorian':
DORIAN_TONICS.forEach(tonic => {
const key = (0, key_1.dorianKey)(tonic);
keyBySignature[key.signature] = key;
});
return keyBySignature;
case 'Phrygian':
PHRYGIAN_TONICS.forEach(tonic => {
const key = (0, key_1.phrygianKey)(tonic);
keyBySignature[key.signature] = key;
});
return keyBySignature;
case 'Lydian':
LYDIAN_TONICS.forEach(tonic => {
const key = (0, key_1.lydianKey)(tonic);
keyBySignature[key.signature] = key;
});
return keyBySignature;
case 'Mixolydian':
MIXOLYDIAN_TONICS.forEach(tonic => {
const key = (0, key_1.mixolydianKey)(tonic);
keyBySignature[key.signature] = key;
});
return keyBySignature;
case 'Aeolian':
AEOLIAN_TONICS.forEach(tonic => {
const key = (0, key_1.aeolianKey)(tonic);
keyBySignature[key.signature] = key;
});
return keyBySignature;
case 'Locrian':
LOCRIAN_TONICS.forEach(tonic => {
const key = (0, key_1.locrianKey)(tonic);
keyBySignature[key.signature] = key;
});
return keyBySignature;
}
}
function intervalByDegree(modeName) {
const intervalByDegree = {};
exports.modeBaseByName[modeName].intervals.forEach((intervalShortName, index) => {
if (index === 7) {
return;
}
const neutralInterval = (0, interval_1.interval)(intervalShortName);
const sharpInterval = (0, interval_1.interval)((0, utils_1.wrapValue)(neutralInterval.length + 1, 13)); // 13 because we want perfect octaves on #7
const flatInterval = (0, interval_1.interval)((0, utils_1.wrapValue)(neutralInterval.length - 1, 12));
intervalByDegree[`${index + 1}`] = neutralInterval;
intervalByDegree[`#${index + 1}`] = sharpInterval;
intervalByDegree[`b${index + 1}`] = flatInterval;
});
return intervalByDegree;
}
exports.intervalByDegree = intervalByDegree;
function ionianMode() {
return {
...exports.modeBaseByName['Ionian'],
standardTonics: IONIAN_STANDARD_TONICS,
theoreticalTonics: IONIAN_THEORETICAL_TONICS,
tonics: IONIAN_TONICS,
intervalByDegree: intervalByDegree('Ionian'),
keyByTonic: keyByTonic('Ionian'),
keyBySignature: keyBySignature('Ionian')
};
}
exports.ionianMode = ionianMode;
function dorianMode() {
return {
...exports.modeBaseByName['Dorian'],
standardTonics: DORIAN_STANDARD_TONICS,
theoreticalTonics: DORIAN_THEORETICAL_TONICS,
tonics: DORIAN_TONICS,
intervalByDegree: intervalByDegree('Dorian'),
keyByTonic: keyByTonic('Dorian'),
keyBySignature: keyBySignature('Dorian')
};
}
exports.dorianMode = dorianMode;
function phrygianMode() {
return {
...exports.modeBaseByName['Phrygian'],
standardTonics: PHRYGIAN_STANDARD_TONICS,
theoreticalTonics: PHRYGIAN_THEORETICAL_TONICS,
tonics: PHRYGIAN_TONICS,
intervalByDegree: intervalByDegree('Phrygian'),
keyByTonic: keyByTonic('Phrygian'),
keyBySignature: keyBySignature('Phrygian')
};
}
exports.phrygianMode = phrygianMode;
function lydianMode() {
return {
...exports.modeBaseByName['Lydian'],
standardTonics: LYDIAN_STANDARD_TONICS,
theoreticalTonics: LYDIAN_THEORETICAL_TONICS,
tonics: LYDIAN_TONICS,
intervalByDegree: intervalByDegree('Lydian'),
keyByTonic: keyByTonic('Lydian'),
keyBySignature: keyBySignature('Lydian')
};
}
exports.lydianMode = lydianMode;
function mixolydianMode() {
return {
...exports.modeBaseByName['Mixolydian'],
standardTonics: MIXOLYDIAN_STANDARD_TONICS,
theoreticalTonics: MIXOLYDIAN_THEORETICAL_TONICS,
tonics: MIXOLYDIAN_TONICS,
intervalByDegree: intervalByDegree('Mixolydian'),
keyByTonic: keyByTonic('Mixolydian'),
keyBySignature: keyBySignature('Mixolydian')
};
}
exports.mixolydianMode = mixolydianMode;
function aeolianMode() {
return {
...exports.modeBaseByName['Aeolian'],
standardTonics: AEOLIAN_STANDARD_TONICS,
theoreticalTonics: AEOLIAN_THEORETICAL_TONICS,
tonics: AEOLIAN_TONICS,
intervalByDegree: intervalByDegree('Aeolian'),
keyByTonic: keyByTonic('Aeolian'),
keyBySignature: keyBySignature('Aeolian')
};
}
exports.aeolianMode = aeolianMode;
function locrianMode() {
return {
...exports.modeBaseByName['Locrian'],
standardTonics: LOCRIAN_STANDARD_TONICS,
theoreticalTonics: LOCRIAN_THEORETICAL_TONICS,
tonics: LOCRIAN_TONICS,
intervalByDegree: intervalByDegree('Locrian'),
keyByTonic: keyByTonic('Locrian'),
keyBySignature: keyBySignature('Locrian')
};
}
exports.locrianMode = locrianMode;
exports.modeByName = {
Ionian: ionianMode(),
Dorian: dorianMode(),
Phrygian: phrygianMode(),
Lydian: lydianMode(),
Mixolydian: mixolydianMode(),
Aeolian: aeolianMode(),
Locrian: locrianMode()
};
function mode(modeName) {
switch (modeName) {
case 'Ionian':
return ionianMode();
case 'Dorian':
return dorianMode();
case 'Phrygian':
return phrygianMode();
case 'Lydian':
return lydianMode();
case 'Mixolydian':
return mixolydianMode();
case 'Aeolian':
return aeolianMode();
case 'Locrian':
return locrianMode();
}
}
exports.mode = mode;