File size: 1,358 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import Track, { isTimeSignatureEvent } from "../track"
import { Measure } from "./Measure"

export function getMeasureAt(tick: number, measures: Measure[]): Measure {
  let lastMeasure: Measure = {
    startTick: 0,
    measure: 0,
    denominator: 4,
    numerator: 4,
  }
  for (const m of measures) {
    if (m.startTick > tick) {
      break
    }
    lastMeasure = m
  }
  return lastMeasure
}

export function getMeasuresFromConductorTrack(
  conductorTrack: Track,
  timebase: number,
): Measure[] {
  const events = conductorTrack.events
    .filter(isTimeSignatureEvent)
    .slice()
    .sort((a, b) => a.tick - b.tick)

  if (events.length === 0) {
    return [
      {
        startTick: 0,
        measure: 0,
        denominator: 4,
        numerator: 4,
      },
    ]
  } else {
    let lastMeasure = 0
    return events.map((e, i) => {
      let measure = 0
      if (i > 0) {
        const lastEvent = events[i - 1]
        const ticksPerBeat = (timebase * 4) / lastEvent.denominator
        const measureDelta = Math.floor(
          (e.tick - lastEvent.tick) / ticksPerBeat / lastEvent.numerator,
        )
        measure = lastMeasure + measureDelta
        lastMeasure = measure
      }
      return {
        startTick: e.tick,
        measure,
        numerator: e.numerator,
        denominator: e.denominator,
      }
    })
  }
}