audiokit - AudioKit 节拍器与时间音调的音频循环同步
问题描述
我正在制作一个使用节拍器播放同步音频循环的应用程序。例如,我可能有 3 个这样的文件:
bass_60bpm.m4a
drums_60bpm.m4a
guitar_60bpm.m4a
还有一个节拍器的声音tick.m4a
,我用它来演奏AKSamplerMetronome
。
我需要以任意速度播放它们,所以我AKTimePitcher
在AKAudioFile
s 上使用(所以以 90bpm 播放,我会bass_60bpm.m4a
以 1.5x 播放)。
这几乎可以工作,但是在 3-5 个循环之后,节拍器与音频循环不同步。我想我理解为什么会发生这种情况(audio_sample_length * floating_point_number 不等于 AKSamplerMetronome 的速度计算),但我不知道如何解决它。
我怀疑我需要做的是手动重新实现部分或全部AKSamplerMetronome
,但根据AKTimePitcher
的输出播放节拍器刻度,但我无法从 API、文档和示例中拼凑足够的信息来实现它。
解决方案
另一种方法可能是使用 AKSequencer 而不是 AKSamplerMetronome。音序器轨道的 midi 输出可以发送到 AKCallbackInstrument,并且音序器的事件可以获取回调函数来触发时间拉伸样本和节拍器滴答声(您还可以从那里触发同步 UI 事件作为奖励) . 这将保证它们保持同步。
Apple 的 MusicSequence 是 AKSequencer 在引擎盖下使用的,它在你调用 play 后立即显示它的时间有点不稳定,但在那之后它就相当稳定了。如果您在它的循环点之前启动音序器(即,如果您有一个 1 小节的循环,则在第一个小节结束之前启动它的十六分之一音符),那么您可以在实际循环开始之前通过该片状。
推荐阅读
- rx-java - RxJava: how to make "generate" operator emit infinite stream lazily to downstream "concatMap"
- web-chat - How to debug Webchat in iPhone Simulator
- python - sending email using smtplib and SSL but receiver is no receiving it
- php - Inherit @IsGranted("ROLE_ADMIN") from parent route or controller
- javascript - 如何将 item.id 传递给 swipeButtons?
- amp-html - 在 AMP 页面中无需用户交互即可改变 DOM 对象
- typescript - 使用 glob 获取文件并要求
- javascript - Javascript/node.js 在服务器和客户端之间发送数据
- spring-boot - SpringBoot 不同的身份验证(MS AD 和 JWT)到一个控制器
- arrays - 从两个向量的笛卡尔积构造 Matlab 矩阵