将 MIDI 节拍转换为实际播放秒数
Posted
技术标签:
【中文标题】将 MIDI 节拍转换为实际播放秒数【英文标题】:Converting MIDI ticks to actual playback seconds 【发布时间】:2010-01-10 19:43:32 【问题描述】:我想知道如何。
例如,如果 MIDI PPQ(每四分音符的脉冲数)为 1120,我将如何将其转换为真实世界的播放秒数?
【问题讨论】:
我没听懂你...假设我有一首恒定速度为 424 BPM 的音乐...现在我在 PPQ 中有波动的 midi 滴答声..例如 70272,70344,70372 等。 ..现在对于每个 miditick,我希望有一个等效的真实世界播放秒.. 如果我以 145240 PPQ(midi tick)..(从示例 midi 音乐文件中获取的示例 midi tick)为例......那么你公式给了我这个 0.9116185787866357 毫秒数......它转换为 0.0009116185787866358 秒......这让我感到困惑,因为这样的 145240 midi 滴答声是在播放 midi 音乐 1 秒后产生的......请帮助 【参考方案1】:公式为60000 / (BPM * PPQ)
(毫秒)。
其中 BPM 是曲目的节奏(Beats Per Minute)。
(即 120 BPM 轨道的 MIDI 时间为 (60000 / (120 * 192))
或 2.604 毫秒(1 个滴答声)。
如果您不知道 BPM,那么您必须首先确定它。 MIDI 时间完全取决于轨道速度。
【讨论】:
如果这个答案解释了如何计算 BPM,那就太好了。 @Oddthinking:从什么计算? BPM 不是 MIDI 的原生概念。它源自每四分音符的微秒数(来自 SET_TEMPO)和时间签名。有关如何计算的更多详细信息,请参阅this blog post。 我遇到了类似的问题。更糟糕的是,我正在观看的 6 分钟乐曲中有 80 次节奏变化,因此假设节奏不变是另一个危险。 我正在读取一个 MIDI 文件,并试图计算每个事件的相对时间。听起来像原来的问题。仪器的轨道提供事件的刻度数。您还需要在 MIDI 文件的标题中找到 either 每四分音符的滴答声或每秒的滴答声。如果是前者,那么要回答原始问题,您还需要查看提供 0、1 或更多 SET TEMPO 的 Track 0。他们提供微秒/四分音符。如果你想计算 BPM(不是必需的),你可以从那里开始。您不需要任何先验知识。【参考方案2】:你需要两条信息:
PPQ(每四分音符的脉冲数),在 midi 文件的标题中定义一次。 Tempo(以每四分音符微秒为单位),由"Set Tempo" meta events 定义,并且可以在乐曲中改变。Ticks 可以按如下方式转换为播放秒数:
ticks_per_quarter = <PPQ from the header>
µs_per_quarter = <Tempo in latest Set Tempo event>
µs_per_tick = µs_per_quarter / ticks_per_quarter
seconds_per_tick = µs_per_tick / 1.000.000
seconds = ticks * seconds_per_tick
请注意,在上面链接的document 中,PPQ 也称为“除法”或“每四分音符的记号”。
请注意,速度通常以 BPM(频率)表示,但原始 MIDI 以每四分之一微秒(一个周期)表示。
【讨论】:
给定的链接现在是 404s。 您确定Tempo in latest Set Tempo event
用µs_per_quarter
表示,而不用µs_per_beat
表示吗?我可以看到一个Tone.js
MIDI 接口显示(property) IMidiSetTempoEvent.setTempo: microsecondsPerBeat: number;
你在µs_per_quarter
recordingblogs.com/wiki/midi-set-tempo-meta-message 中表达的节奏是正确的,然后Tone.js
界面缺少一些东西。
我找到了 API 并创建了一个问题 github.com/chrisguttandin/midi-json-parser-worker/issues/329以上是关于将 MIDI 节拍转换为实际播放秒数的主要内容,如果未能解决你的问题,请参考以下文章