UNPKG

moment-of-symmetry

Version:

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

90 lines 3.49 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getDaughterPatterns = exports.getParentPattern = exports.getAllModes = exports.getModeInfo = void 0; const names_1 = require("../names"); /** * Get information about a mode * @param pattern The MOS pattern * @param options Optional configuration * @returns Information about the mode */ function getModeInfo(pattern, options) { var _a, _b; const info = (_a = (0, names_1.tamnamsInfo)(pattern.pattern)) !== null && _a !== void 0 ? _a : {}; const name = (_b = (0, names_1.modeName)(pattern.pattern, options === null || options === void 0 ? void 0 : options.extraNames)) !== null && _b !== void 0 ? _b : pattern.pattern; return { pattern: pattern.pattern, name, ...info, }; } exports.getModeInfo = getModeInfo; /** * Get all modes for a given pattern * @param pattern The MOS pattern * @param options Optional configuration * @returns Array of mode information */ function getAllModes(pattern, options) { var _a, _b; const modes = []; const patternStr = pattern.pattern; for (let i = 0; i < patternStr.length; i++) { const rotatedPattern = patternStr.slice(i) + patternStr.slice(0, i); const info = (_a = (0, names_1.tamnamsInfo)(rotatedPattern)) !== null && _a !== void 0 ? _a : {}; const name = (_b = (0, names_1.modeName)(rotatedPattern, options === null || options === void 0 ? void 0 : options.extraNames)) !== null && _b !== void 0 ? _b : rotatedPattern; modes.push({ pattern: rotatedPattern, name, ...info, }); } return modes; } exports.getAllModes = getAllModes; /** * Get the parent MOS pattern for a given pattern * @param pattern The MOS pattern to get the parent for * @returns The parent MOS pattern */ function getParentPattern(pattern) { const gcd = (a, b) => (b === 0 ? a : gcd(b, a % b)); const periods = gcd(pattern.largeSteps, pattern.smallSteps); if (periods === 1) { throw new Error('Pattern has no parent (it is already a single-period MOS)'); } const parentLargeSteps = pattern.largeSteps / periods; const parentSmallSteps = pattern.smallSteps / periods; return { pattern: 'L'.repeat(parentLargeSteps) + 's'.repeat(parentSmallSteps), largeSteps: parentLargeSteps, smallSteps: parentSmallSteps, periods: 1, }; } exports.getParentPattern = getParentPattern; /** * Get the daughter MOS pattern(s) for a given pattern * @param pattern The MOS pattern to get the daughter(s) for * @returns Array of daughter MOS patterns */ function getDaughterPatterns(pattern) { const daughters = []; // For each possible number of periods for (let periods = 2; periods <= Math.min(pattern.largeSteps, pattern.smallSteps); periods++) { if (pattern.largeSteps % periods === 0 && pattern.smallSteps % periods === 0) { const daughterLargeSteps = pattern.largeSteps / periods; const daughterSmallSteps = pattern.smallSteps / periods; daughters.push({ pattern: 'L'.repeat(daughterLargeSteps) + 's'.repeat(daughterSmallSteps), largeSteps: daughterLargeSteps, smallSteps: daughterSmallSteps, periods: 1, }); } } return daughters; } exports.getDaughterPatterns = getDaughterPatterns; //# sourceMappingURL=index.js.map