@tonaljs/time-signature
Version:
Musical time signatures
65 lines • 1.74 kB
JavaScript
// 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