UNPKG

moment-of-symmetry

Version:

Moment of Symmetry (MOS) musical scale generation and analysis for Javascript

140 lines 4.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.modeName = exports.tamnamsInfo = void 0; const TAMNAMS_MOS_NAMES = require('./tamnams.json'); const MODE_NAMES = require('./modes.json'); function isRootScale(countL, countS) { if (countL + countS <= 10) { return true; } if (countL === countS && countL <= 10) { return true; } return `${countL}L ${countS}s` in TAMNAMS_MOS_NAMES; } function tamnamsInfo(patternOrLarge, numberOfSmallSteps) { let numberOfLargeSteps; let pattern; if (typeof patternOrLarge === 'string') { pattern = patternOrLarge; numberOfLargeSteps = parseInt(pattern.split('L')[0]); numberOfSmallSteps = parseInt(pattern.split('L')[1].slice(1, -1)); } else { pattern = `${patternOrLarge}L ${numberOfSmallSteps}s`; numberOfLargeSteps = patternOrLarge; } if (numberOfLargeSteps < 1 || numberOfSmallSteps < 1) { return undefined; } if (pattern in TAMNAMS_MOS_NAMES) { const result = TAMNAMS_MOS_NAMES[pattern]; if (!('abbreviation' in result) && 'prefix' in result) { result.abbreviation = result.prefix; } if (!('familyPrefix' in result) && 'prefix' in result) { result.familyPrefix = result.prefix; } return result; } if (numberOfLargeSteps === numberOfSmallSteps) { return { name: `${numberOfLargeSteps}-wood` }; } const parentCountL = Math.min(numberOfLargeSteps, numberOfSmallSteps); const parentCountS = Math.abs(numberOfLargeSteps - numberOfSmallSteps); if (isRootScale(parentCountL, parentCountS)) { const parentInfo = tamnamsInfo(parentCountL, parentCountS); if (numberOfLargeSteps > numberOfSmallSteps) { return { name: 'm-chro ' + parentInfo.name }; } else { return { name: 'p-chro ' + parentInfo.name }; } } const grandparentCountL = Math.min(parentCountL, parentCountS); const grandparentCountS = Math.abs(parentCountL - parentCountS); if (isRootScale(grandparentCountL, grandparentCountS)) { const grandparentInfo = tamnamsInfo(grandparentCountL, grandparentCountS); const name = grandparentInfo.name; if (parentCountL > parentCountS) { if (numberOfLargeSteps > numberOfSmallSteps) { return { name: 'm-enhar ' + name }; } else { return { name: 'f-enhar ' + name }; } } else { if (numberOfLargeSteps > numberOfSmallSteps) { return { name: 'p-enhar ' + name }; } else { return { name: 's-enhar ' + name }; } } } const greatGrandparentCountL = Math.min(grandparentCountL, grandparentCountS); const greatGrandparentCountS = Math.abs(grandparentCountL - grandparentCountS); if (isRootScale(greatGrandparentCountL, greatGrandparentCountS)) { const greatGrandparentInfo = tamnamsInfo(greatGrandparentCountL, greatGrandparentCountS); const name = greatGrandparentInfo.name; if (grandparentCountL > grandparentCountS) { if (parentCountL > parentCountS) { if (numberOfLargeSteps > numberOfSmallSteps) { return { name: 'quso-' + name }; } else { return { name: 'miso-' + name }; } } else { if (numberOfLargeSteps > numberOfSmallSteps) { return { name: 'paso-' + name }; } else { return { name: 'uso-' + name }; } } } else { if (parentCountL > parentCountS) { if (numberOfLargeSteps > numberOfSmallSteps) { return { name: 'quha-' + name }; } else { return { name: 'miha-' + name }; } } else { if (numberOfLargeSteps > numberOfSmallSteps) { return { name: 'paha-' + name }; } else { return { name: 'uha-' + name }; } } } } return undefined; } exports.tamnamsInfo = tamnamsInfo; /** * Retrieve the name for a MOS mode. * @param mode Mode in step pattern format such as "LLsLLLs". * @param extra If true adds extra mode names in parenthesis such as Ionian (Major). * @returns Name of the mode. */ function modeName(mode, extra = false) { let name = MODE_NAMES[mode]; if (extra) { if (mode === 'LLsLLLs') { name = name + ' (Major)'; } else if (mode === 'LsLLsLL') { name = name + ' (Minor)'; } } return name; } exports.modeName = modeName; //# sourceMappingURL=names.js.map