我正在制作一个可以播放节拍器同步音频循环的应用。例如,我可能有3个这样的文件:
bass_60bpm.m4a
drums_60bpm.m4a
guitar_60bpm.m4a
还有我用tick.m4a
演奏的节拍器声音AKSamplerMetronome
。
我需要以任意速度播放它们,因此我在AKTimePitcher
上使用AKAudioFile
(因此,以90bpm的速度播放,我将以{1.5x的速度播放bass_60bpm.m4a
)。 / p>
这几乎可行,但是在3-5次循环之后,节拍器与音频循环不同步。我想我理解为什么会发生这种情况(audio_sample_length * float_point_number不等于AKSamplerMetronome的速度计算),但我不知道如何解决。
我怀疑我需要做的是手动重新实现AKSamplerMetronome
的部分或全部,但是根据AKTimePitcher
的输出播放节拍器滴答声,但是我无法从API,文档和实现该目标的示例。
答案 0 :(得分:3)
另一种方法可能是使用AKSequencer代替AKSamplerMetronome。音序器的轨道的midi输出可以发送到AKCallbackInstrument,并且音序器的事件可以获取回调函数来触发时间拉伸的采样和节拍器滴答声(您还可以从那里触发同步的UI事件作为奖励) 。这样可以保证它们保持同步。
Apple的MusicSequence(这是AKSequencer在引擎盖下使用的)在调用播放器后立即具有定时功能,但是在此之后非常稳定。如果您在音序器的循环点之前启动音序器(即,如果您有一个1 bar的循环,请在第一个小节的结尾之前以十六分音符的顺序启动它),那么您可以在实际循环开始之前传递那种脆弱感。 >