MIDI:将 BPM 转换为 FPS 增量时间?

Posted

技术标签:

【中文标题】MIDI:将 BPM 转换为 FPS 增量时间?【英文标题】:MIDI: Convert BPM to FPS delta time? 【发布时间】:2010-07-08 15:26:05 【问题描述】:

给定一个 BPM(每分钟节拍数)MIDI 增量时间(最左边的位关闭),速度为 192:

0x00C0

我想将其转换为 FPS/TPM(每秒帧数/每分钟滴答声)增量时间(最左边的位),但如果您知道我的意思,它应该是相同(或最准确)的速度值.

有关 MIDI Delta Time 的更多信息,请查看 Header Chunk -> Time Division 下的 Midi File Format。

我正在寻找可以在这两种 deltatime 类型之间进行转换的公式。

【问题讨论】:

【参考方案1】:

如果您说 0x00C0 是时间分割字段,那么您所指的不是 192每分钟节拍,而是 192每节拍,完全不同的野兽。 BPM 是通过“Set Tempo”事件间接指定的,以每拍微秒为单位给出(假设以可悲的无处不在的 120 BPM 开头)。这种格式的时间划分的技巧在于,一个节拍的长度会根据歌曲中的节奏变化而增长和缩小。

假设您要转换为的时分以 F 作为每秒帧数(24、25、29.97 或 30),G 作为每帧的刻度(注意 :这不是每分钟滴答声!)。此外,让我们假设当前每拍以微秒为单位的节奏是p。然后将给定持续时间(以 tickold 为单位的给定持续时间转换为 ticknew 的公式(单位分析真的很有帮助!)是:

y = x 节拍old * (1/192) 节拍/节拍old * p μsec/节拍 * (1/106 ) 秒/微秒 * F 帧/秒 * G 滴答声new/frame = ((x * p * F * G)/(192*106)) 滴答声new

【讨论】:

对。每拍的滴答声。顺便说一句,'tick' 大小就像 TimeSpan.TicksPerSecond 等?我是 MIDI 的新手,只是想参与其中。谢谢你的帮助,你的回答确实很复杂,如果你能简化它会有所帮助,否则我将不得不更多地挖掘它...... @Shimmy:尽管概念相似,但它们不是同一个刻度。当 TimeSpacn 指代滴答时,它指的是由操作系统定义的单位,它往往与秒有固定的关系。 MIDI 世界中的记号是由时间划分定义的抽象单位,并且可能与秒或操作系统记号有固定关系,也可能没有固定关系。两个刻度的目的是通过使用整数值有效地表示时间,但要选择足够小的整数之间的时间间隔,以便您可以适度精确地描述时间。

以上是关于MIDI:将 BPM 转换为 FPS 增量时间?的主要内容,如果未能解决你的问题,请参考以下文章

MIDI 文件的分辨率会影响它的速度吗?

music21:读取 MIDI 文件的 BPM 和乐器信息并将其写回文件

将 midi 弯音转换为 0 到 4 对数刻度

我如何知道一个字节何时是代表 MIDI 增量时间的字节序列中的第一个?

将 MIDI 转换为 mp3

将 MIDI 事件转换为 pygame 事件