UNPKG

@tonaljs/time-signature

Version:

Musical time signatures

65 lines 1.74 kB
// index.ts var NONE = { empty: true, name: "", upper: void 0, lower: void 0, type: void 0, additive: [] }; var NAMES = ["4/4", "3/4", "2/4", "2/2", "12/8", "9/8", "6/8", "3/8"]; function names() { return NAMES.slice(); } var REGEX = /^(\d*\d(?:\+\d)*)\/(\d+)$/; var CACHE = /* @__PURE__ */ new Map(); function get(literal) { const stringifiedLiteral = JSON.stringify(literal); const cached = CACHE.get(stringifiedLiteral); if (cached) { return cached; } const ts = build(parse(literal)); CACHE.set(stringifiedLiteral, ts); return ts; } function parse(literal) { if (typeof literal === "string") { const [_, up2, low] = REGEX.exec(literal) || []; return parse([up2, low]); } const [up, down] = literal; const denominator = +down; if (typeof up === "number") { return [up, denominator]; } const list = up.split("+").map((n) => +n); return list.length === 1 ? [list[0], denominator] : [list, denominator]; } var time_signature_default = { names, parse, get }; var isPowerOfTwo = (x) => Math.log(x) / Math.log(2) % 1 === 0; function build([up, down]) { const upper = Array.isArray(up) ? up.reduce((a, b) => a + b, 0) : up; const lower = down; if (upper === 0 || lower === 0) { return NONE; } const name = Array.isArray(up) ? `${up.join("+")}/${down}` : `${up}/${down}`; const additive = Array.isArray(up) ? up : []; const type = lower === 4 || lower === 2 ? "simple" : lower === 8 && upper % 3 === 0 ? "compound" : isPowerOfTwo(lower) ? "irregular" : "irrational"; return { empty: false, name, type, upper, lower, additive }; } export { time_signature_default as default, get, names, parse }; //# sourceMappingURL=index.mjs.map