如何在JavaScript中结合timeDivision将MIDI deltaTime转为毫秒时间戳
MIDI DeltaTime 转毫秒时间戳计算方法
核心逻辑前提
你的MIDI文件timeDivision值为192,代表每1个四分音符对应192个tick,这是MIDI标准里基于音符的时间划分规则。deltaTime存储的是前后两个MIDI事件之间的tick差值,要转成毫秒,必须结合MIDI文件的BPM(每分钟节拍数)——这是MIDI元事件里的速度信息,你需要从解析后的JSON中提取这个值。
具体计算公式
- 计算单个tick的毫秒时长
单tick毫秒数 = (60000 / BPM) / 192
- 60000是每分钟的毫秒总数,除以BPM得到1个四分音符的毫秒时长;再除以192(每四分音符的tick数),就得到单个tick对应的时间。
- 将deltaTime转换为毫秒差值
deltaTime毫秒值 = deltaTime × 单tick毫秒数
示例计算(假设BPM=120)
- 单tick毫秒数 = (60000 / 120) / 192 = 500 / 192 ≈ 2.604ms
- 若某事件的deltaTime=192,对应的毫秒值为 192 × 2.604 ≈ 500ms(正好是1个四分音符的时长)
构建累计时间戳对象
- 初始化一个累计时间变量,比如
current_ms = 0 - 遍历解析后的事件列表:
- 当前事件的毫秒时间戳 = current_ms + 当前deltaTime转换后的毫秒值
- 更新
current_ms为这个时间戳,用于计算下一个事件的时间
- 最终每个事件都会对应一个基于起始点的毫秒时间戳
内容的提问来源于stack exchange,提问作者Adebowale
相关产品推荐
相关产品推荐

