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