UNPKG

12tet

Version:

Music theory library for generating and working with chords, modes, intervals, etc.

527 lines (526 loc) 26.1 kB
"use strict"; 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;