File size: 816 Bytes
f23825d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { calculateMBT, Measure } from "./Measure"
import { getMeasureAt } from "./MeasureList"

export const getMBTString = (
  measures: Measure[],
  tick: number,
  ticksPerBeat: number,
  formatter = defaultMBTFormatter,
): string => formatter(getMBT(measures, tick, ticksPerBeat))

interface Beat {
  measure: number
  beat: number
  tick: number
}

const getMBT = (
  measures: Measure[],
  tick: number,
  ticksPerBeat: number,
): Beat => {
  return calculateMBT(getMeasureAt(tick, measures), tick, ticksPerBeat)
}

const pad = (v: number, digit: number) => {
  const str = v.toString(10)
  return ("0".repeat(digit) + str).slice(-Math.max(digit, str.length))
}

function defaultMBTFormatter(mbt: Beat): string {
  return `${pad(mbt.measure + 1, 4)}:${pad(mbt.beat + 1, 2)}:${pad(
    mbt.tick,
    3,
  )}`
}