我正在制作一个使用节拍器播放同步音频循环的应用程序。例如,我可能有 3 个这样的文件:
bass_60bpm.m4a
drums_60bpm.m4a
guitar_60bpm.m4a
还有节拍器声音 tick.m4a
,我用 AKSamplerMetronome
播放它。
我需要以任意速度播放它们,因此我在 AKAudioFile
上使用 AKTimePitcher
(因此以 90bpm 播放,我会播放 bass_60bpm。 m4a
1.5x)。
这几乎可以工作,但是在 3-5 个循环之后,节拍器与音频循环不同步。我想我明白为什么会发生这种情况(audio_sample_length * float_point_number 不等于 AKSamplerMetronome 的节奏计算),但我不知道如何解决它。
我怀疑我需要做的是手动重新实现部分或全部 AKSamplerMetronome
,但根据 AKTimePitcher
的输出播放节拍器滴答声,但我不能从 API、文档和示例中拼凑足够的信息来实现这一目标。
最佳答案
另一种方法可能是使用 AKSequencer 而不是 AKSamplerMetronome。音序器轨道的 MIDI 输出可以发送到 AKCallbackInstrument,音序器的事件可以获取回调函数来触发时间拉伸(stretch)样本和节拍器刻度(作为奖励,您还可以从那里触发同步 UI 事件) 。这将保证它们保持同步。
Apple 的 MusicSequence(AKSequencer 在后台使用的就是它)在调用播放后立即计时有点不稳定,但在那之后就非常稳定了。如果您在其循环点之前启动音序器(即,如果您有一个 1 小节循环,请在第一个小节结束之前的十六分之一音符处启动它),那么您可以在实际循环开始之前通过该片状声音。
关于AudioKit 节拍器与时间音调的音频循环同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51228198/