将 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。
我正在使用 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。