moment-of-symmetry
Version:
Moment of Symmetry (MOS) musical scale generation and analysis for Javascript
140 lines • 4.99 kB
JavaScript
;
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