我正在使用MIKMIDI框架,这是使用AudioToolbox类型MusicTimeStamp
如何将此时间戳转换为毫秒?
这MusicTimeStamp
是一个原始节拍计数,您需要知道您正在使用的音乐的速度(和速度图,速度不是不变的),以便将其转换为毫秒。
MTS之外的MusicSequence
时间不能映射到墙上时间。
编辑:如果有帮助,可以将CoreMediaCMTime
转换为挂墙时间。
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进行循环,也不会考虑循环,如果设置为 on MIKMIDISequencer
,当然也不会被覆盖,所以如果可能的话,您应该更喜欢上面的 MIKMIDI 的 API。