Spaces:
Running
Running
File size: 1,270 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 |
import { SynthEvent } from "@ryohey/wavelet"
import Song from "../song"
const tickToMillisec = (tick: number, bpm: number, timebase: number) =>
(tick / (timebase / 60) / bpm) * 1000
interface Keyframe {
tick: number
bpm: number
timestamp: number
}
export const songToSynthEvents = (
song: Song,
sampleRate: number,
): SynthEvent[] => {
const events = [...song.allEvents].sort((a, b) => a.tick - b.tick)
let keyframe: Keyframe = {
tick: 0,
bpm: 120,
timestamp: 0,
}
const synthEvents: SynthEvent[] = []
// channel γ€γγ³γγ MIDI Output γ«ιδΏ‘
// Send Channel Event to MIDI OUTPUT
for (const e of events) {
const timestamp =
tickToMillisec(e.tick - keyframe.tick, keyframe.bpm, song.timebase) +
keyframe.timestamp
const delayTime = (timestamp / 1000) * sampleRate
switch (e.type) {
case "channel":
synthEvents.push({
type: "midi",
midi: e,
delayTime,
})
case "meta":
switch (e.subtype) {
case "setTempo":
keyframe = {
tick: e.tick,
bpm: (60 * 1000000) / e.microsecondsPerBeat,
timestamp,
}
break
}
}
}
return synthEvents
}
|