使用AudioKit定期播放纯音

时间:2018-05-17 10:40:49

标签: ios swift audio audiokit

我想在给定频率下使用AudioKit振荡器播放非常基本的声音。

例如:在400Hz下播放一个简单的正弦波50毫秒,然后100毫秒的静音,然后播放600Hz达50ms ...

我有一个金属视图,我在那里渲染一些视觉刺激。我的目的是使用基本的AKOscillator和CADisplayLink的渲染功能来播放/停止某些帧的声音。

我尝试使用oscillator.play()oscillator.stop()或使用oscillator.amplitude = 0oscillator.amplitude = 1更改幅度,但两种情况下的结果都是大约10毫秒的抖动。

如果我首先创建.wav文件然后使用AKPlayer.play()播放它们,那么时机是正确的。

我希望可以随时灵活地使用任何频率。我该如何做与第一种方法类似的事情?将振荡器包装在midi乐器中是可行的方法吗?

1 个答案:

答案 0 :(得分:3)

CADisplayLink在UI线程中运行,因此会有一些子帧时间抖动,因为UI线程的优先级低于音频(可能还有其他OS)线程。

我成功实现任意频率音频的可靠亚毫秒精确实时合成的唯一方法是在音频单元回调中放入正弦波振荡器(或波形发生器或表查找)(适用于iOS的RemoteIO) ,在从正确的样本缓冲区偏移索引开始,动态地将所需正弦波(或其他波形)的停止/开始插入回调缓冲区之前计数样本。

首先,我预先生成了正弦波查找表;但后来做了一些剖析;并且发现只是以音频采样率调用带有旋转相位的sin()函数,在任何现代iOS设备上占用的CPU时间百分比几乎没有。如果您使用递增阶段,请确保通过偶尔添加/减去2 * pi的倍数来将相位保持在合理的数值范围内。