UNPKG

12tet

Version:

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

116 lines (115 loc) 4.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.enharmonicEquivalents = exports.tonesByNote = exports.tones = exports.getNextNaturalNote = exports.getNaturalNoteRoot = exports.noteRegisters = exports.isNoteRegister = exports.notes = exports.isNote = exports.theoreticalNotes = exports.isTheoreticalNote = exports.theoreticalFlatNotes = exports.isTheoreticalFlatNote = exports.theoreticalSharpNotes = exports.isTheoreticalSharpNote = exports.standardNotes = exports.isStandardNote = exports.standardAccentedNotes = exports.isStandardAccentedNote = exports.standardFlatNotes = exports.isStandardFlatNote = exports.standardSharpNotes = exports.isStandardSharpNote = exports.naturalNotes = exports.isNaturalNote = void 0; const utils_1 = require("../utils"); const NATURAL_NOTES = ['C', 'D', 'E', 'F', 'G', 'A', 'B']; function isNaturalNote(note) { return NATURAL_NOTES.includes(note); } exports.isNaturalNote = isNaturalNote; exports.naturalNotes = [...NATURAL_NOTES]; const STANDARD_SHARP_NOTES = ['F#', 'C#', 'G#', 'D#', 'A#', 'E#', 'B#']; function isStandardSharpNote(note) { return STANDARD_SHARP_NOTES.includes(note); } exports.isStandardSharpNote = isStandardSharpNote; exports.standardSharpNotes = [...STANDARD_SHARP_NOTES]; const STANDARD_FLAT_NOTES = ['Bb', 'Eb', 'Ab', 'Db', 'Gb', 'Cb', 'Fb']; function isStandardFlatNote(note) { return STANDARD_FLAT_NOTES.includes(note); } exports.isStandardFlatNote = isStandardFlatNote; exports.standardFlatNotes = [...STANDARD_FLAT_NOTES]; const STANDARD_ACCENTED_NOTES = [...STANDARD_SHARP_NOTES, ...STANDARD_FLAT_NOTES]; function isStandardAccentedNote(note) { return STANDARD_ACCENTED_NOTES.includes(note); } exports.isStandardAccentedNote = isStandardAccentedNote; exports.standardAccentedNotes = [...STANDARD_ACCENTED_NOTES]; const STANDARD_NOTES = [...NATURAL_NOTES, ...STANDARD_SHARP_NOTES, ...STANDARD_FLAT_NOTES]; function isStandardNote(note) { return STANDARD_NOTES.includes(note); } exports.isStandardNote = isStandardNote; exports.standardNotes = (0, utils_1.removeDuplicates)([...STANDARD_NOTES]); const THEORETICAL_SHARP_NOTES = ['C##', 'D##', 'E##', 'F##', 'G##', 'A##', 'B##']; function isTheoreticalSharpNote(note) { return THEORETICAL_SHARP_NOTES.includes(note); } exports.isTheoreticalSharpNote = isTheoreticalSharpNote; exports.theoreticalSharpNotes = [...THEORETICAL_SHARP_NOTES]; const THEORETICAL_FLAT_NOTES = ['Cbb', 'Dbb', 'Ebb', 'Fbb', 'Gbb', 'Abb', 'Bbb']; function isTheoreticalFlatNote(note) { return THEORETICAL_FLAT_NOTES.includes(note); } exports.isTheoreticalFlatNote = isTheoreticalFlatNote; exports.theoreticalFlatNotes = [...THEORETICAL_FLAT_NOTES]; const THEORETICAL_NOTES = [...THEORETICAL_SHARP_NOTES, ...THEORETICAL_FLAT_NOTES]; function isTheoreticalNote(note) { return THEORETICAL_NOTES.includes(note); } exports.isTheoreticalNote = isTheoreticalNote; exports.theoreticalNotes = (0, utils_1.removeDuplicates)([...THEORETICAL_NOTES]); const NOTES = [...STANDARD_NOTES, ...THEORETICAL_NOTES]; function isNote(note) { return NOTES.includes(note); } exports.isNote = isNote; exports.notes = (0, utils_1.removeDuplicates)([...NOTES]); const NOTE_REGISTER = [0, 1, 2, 3, 4, 5, 6, 7, 8]; function isNoteRegister(register) { return NOTE_REGISTER.includes(register); } exports.isNoteRegister = isNoteRegister; exports.noteRegisters = [...NOTE_REGISTER]; function getNaturalNoteRoot(note) { return note[0]; } exports.getNaturalNoteRoot = getNaturalNoteRoot; // Given a note, return the next natural note - i.e. B# => C, Cbb => D function getNextNaturalNote(note) { for (let i = 0; i < NATURAL_NOTES.length; i++) { if (NATURAL_NOTES[i] === note[0]) { return (0, utils_1.getWrappedArrayElement)([...NATURAL_NOTES], i + 1); } } throw TypeError(`Could not find next natural note for note ${note}`); } exports.getNextNaturalNote = getNextNaturalNote; // All 12 tones in order exports.tones = [ ['B#', 'C', 'Dbb'], ['B##', 'C#', 'Db'], ['C##', 'D', 'Ebb'], ['D#', 'Eb', 'Fbb'], ['D##', 'E', 'Fb'], ['E#', 'F', 'Gbb'], ['E##', 'F#', 'Gb'], ['F##', 'G', 'Abb'], ['G#', 'Ab'], ['G##', 'A', 'Bbb'], ['A#', 'Bb', 'Cbb'], ['A##', 'B', 'Cb'] ]; // A record mapping each note to its tone and its tones relative position function getTonesByNote() { const tonesByNote = {}; exports.tones.forEach((tone, index) => { tone.forEach(note => { tonesByNote[note] = { tone, index }; }); }); return tonesByNote; } exports.tonesByNote = getTonesByNote(); function enharmonicEquivalents(note) { const tone = exports.tonesByNote[note].tone; const noteIndex = tone.indexOf(note); if (noteIndex !== -1) { return (0, utils_1.removeArrayElement)(tone, noteIndex); } else { return tone; // This should never happen } } exports.enharmonicEquivalents = enharmonicEquivalents;