{"version":3,"sources":["../data.ts","../index.ts"],"sourcesContent":["// source: https://en.wikipedia.org/wiki/Note_value\nconst DATA: [number, string, string[]][] = [\n  [\n    0.125,\n    \"dl\",\n    [\"large\", \"duplex longa\", \"maxima\", \"octuple\", \"octuple whole\"],\n  ],\n  [0.25, \"l\", [\"long\", \"longa\"]],\n  [0.5, \"d\", [\"double whole\", \"double\", \"breve\"]],\n  [1, \"w\", [\"whole\", \"semibreve\"]],\n  [2, \"h\", [\"half\", \"minim\"]],\n  [4, \"q\", [\"quarter\", \"crotchet\"]],\n  [8, \"e\", [\"eighth\", \"quaver\"]],\n  [16, \"s\", [\"sixteenth\", \"semiquaver\"]],\n  [32, \"t\", [\"thirty-second\", \"demisemiquaver\"]],\n  [64, \"sf\", [\"sixty-fourth\", \"hemidemisemiquaver\"]],\n  [128, \"h\", [\"hundred twenty-eighth\"]],\n  [256, \"th\", [\"two hundred fifty-sixth\"]],\n];\n\nexport default DATA;\n","import DATA from \"./data\";\n\ntype Fraction = [number, number];\n\nconst VALUES: DurationValue[] = [];\n\nDATA.forEach(([denominator, shorthand, names]) =>\n  add(denominator, shorthand, names),\n);\n\nexport interface DurationValue {\n  empty: boolean;\n  value: number;\n  name: string;\n  fraction: Fraction;\n  shorthand: string;\n  dots: string;\n  names: string[];\n}\n\nconst NoDuration: DurationValue = {\n  empty: true,\n  name: \"\",\n  value: 0,\n  fraction: [0, 0],\n  shorthand: \"\",\n  dots: \"\",\n  names: [],\n};\n\nexport function names(): string[] {\n  return VALUES.reduce((names, duration) => {\n    duration.names.forEach((name) => names.push(name));\n    return names;\n  }, [] as string[]);\n}\n\nexport function shorthands(): string[] {\n  return VALUES.map((dur) => dur.shorthand);\n}\n\nconst REGEX = /^([^.]+)(\\.*)$/;\n\nexport function get(name: string): DurationValue {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  const [_, simple, dots] = REGEX.exec(name) || [];\n  const base = VALUES.find(\n    (dur) => dur.shorthand === simple || dur.names.includes(simple),\n  );\n  if (!base) {\n    return NoDuration;\n  }\n\n  const fraction = calcDots(base.fraction, dots.length);\n  const value = fraction[0] / fraction[1];\n\n  return { ...base, name, dots, value, fraction };\n}\n\nexport const value = (name: string) => get(name).value;\nexport const fraction = (name: string) => get(name).fraction;\n\n/** @deprecated */\nexport default { names, shorthands, get, value, fraction };\n\n//// PRIVATE ////\n\nfunction add(denominator: number, shorthand: string, names: string[]) {\n  VALUES.push({\n    empty: false,\n    dots: \"\",\n    name: \"\",\n    value: 1 / denominator,\n    fraction: denominator < 1 ? [1 / denominator, 1] : [1, denominator],\n    shorthand,\n    names,\n  });\n}\n\nfunction calcDots(fraction: Fraction, dots: number): Fraction {\n  const pow = Math.pow(2, dots);\n\n  let numerator = fraction[0] * pow;\n  let denominator = fraction[1] * pow;\n  const base = numerator;\n\n  // add fractions\n  for (let i = 0; i < dots; i++) {\n    numerator += base / Math.pow(2, i + 1);\n  }\n\n  // simplify\n  while (numerator % 2 === 0 && denominator % 2 === 0) {\n    numerator /= 2;\n    denominator /= 2;\n  }\n  return [numerator, denominator];\n}\n"],"mappings":"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","names":["names","fraction","value"]}