AudioKit 节拍器与定时音频循环同步

AudioKit metronome synced with time-pitched audio loops

我正在制作一个应用程序,可以使用节拍器播放同步音频循环。例如,我可能有 3 个这样的文件:

还有一个节拍器声音 tick.m4a,我用它来演奏 AKSamplerMetronome

我需要以任意速度播放它们,所以我在 AKAudioFile 上使用 AKTimePitcher(所以以 90bpm 播放,我会以 1.5x 播放 bass_60bpm.m4a) .

这几乎可以工作,但是在 3-5 个循环之后,节拍器与音频循环不同步。我想我明白为什么会这样(audio_sample_length * floating_point_number 不等同于 AKSamplerMetronome 的速度计算),但我不知道如何解决它。

我怀疑我需要做的是手动重新实现 AKSamplerMetronome 的部分或全部,但根据 AKTimePitcher 的输出播放节拍器滴答声,但我无法拼凑足够的信息来自 API、文档和示例以实现它。

另一种方法可能是使用 AKSequencer 而不是 AKSamplerMetronome。音序器音轨的 MIDI 输出可以发送到 AKCallbackInstrument,音序器的事件可以获得回调函数来触发时间拉伸样本和节拍器滴答声(您还可以从那里触发同步 UI 事件作为奖励)。这将保证它们保持同步。

Apple 的 MusicSequence,也就是 AKSequencer 在后台使用的东西,在您调用播放后立即计时时有点古怪,但在那之后它非常可靠。如果你在它的循环点之前启动音序器(即,如果你有一个 1 小节循环,在第一个小节结束之前的第一个十六分音符开始它)那么你可以在实际循环开始之前通过那个薄片。