将 MusicTimeStamp (AudioToolbox) 转换为毫秒

Convert MusicTimeStamp (AudioToolbox) to Milliseconds

我正在使用 MIKMIDI framework and this is using the AudioToolbox 类型 MusicTimeStamp

如何将此时间戳转换为毫秒?

MusicTimeStamp 是原始节拍计数,您需要知道您正在处理的音乐的速度(和速度图,速度不是不变的)才能将其转换为毫秒.

MusicSequence 之外,无法将 MTS 映射到墙上时间。

编辑: 如果有帮助,可以将 CoreMedia CMTime 转换为挂钟时间。

MIKMIDI 中为此新增了 API。在我写这篇文章时它在一个分支 (1.8) 中,但应该很快合并,并在 1.8 版本中发布。它可以更轻松地进行您所询问的转换。

在序列的上下文中,执行:

let seconds = sequence.timeInSeconds(forMusicTimeStamp: musicTimeStamp)

还有一种反方向转换的方法。 MIKMIDISequencer 具有非常相似但更复杂(考虑到循环、速度覆盖等)的方法来执行相同类型的转换。

如果 MIKMIDI 中没有这个新的 API,您仍然可以使用 MusicSequenceGetSecondsForBeats()。您可以使用 musicSequence 属性:

获取 MIKMIDISequence 的基础 MusicSequence
var timeInSeconds = Float64(0)
MusicSequenceGetSecondsForBeats(sequence, musicTimeStamp, &timeInSeconds)

据我所知,即使您使用 MusicPlayer API 进行循环,这也没有考虑循环,而且如果设置在 MIKMIDISequencer,所以如果可能,你应该更喜欢上面的 MIKMIDI 的 API。