使用AudioKit定期播放纯音调

5
我想使用AudioKit振荡器播放特定频率的基本声音。
例如:播放400Hz的简单正弦波50毫秒,然后100毫秒的静音,然后播放600Hz 50ms...
我有一个Metal视图,在其中渲染一些视觉刺激。我的意图是使用基本的AKOscillator和CADisplayLink的render函数在某些帧上播放/停止声音。
我尝试使用oscillator.play()oscillator.stop()或使用oscillator.amplitude = 0oscillator.amplitude = 1更改幅度,但两种情况的结果都是10ms左右的抖动。
如果我先创建.wav文件,然后使用AKPlayer.play()播放它们,则时间定时是正确的。
我想要在任何时候使用任何频率的灵活性。如何做类似于第一种方法的事情?用midi乐器包装振荡器是正确的方法吗?

你尝试过将rampTime(在开发分支中的rampDuration)设置为零吗? - Aurelius Prochazka
是的,rampTime被设置为零。我正在使用示波器测量屏幕和声音的变化,所以目前我没有关注爆炸声和噼啪声。屏幕的表现非常准确,误差小于1毫秒,但声音不行。 - bienqueda
1个回答

3
CADisplayLink运行在UI线程中,因此会有一些子帧时间抖动,因为UI线程的优先级低于音频(和可能其他操作系统)线程。
我成功地实现了可靠的亚毫秒精度实时合成任意频率音频的唯一方法是将正弦波振荡器(或波形发生器或查找表)放入Audio Unit回调(iOS的RemoteIO),并计算样本,然后在正确的样本缓冲区偏移索引处动态插入所需正弦波(或其他波形)的停止/启动。
起初,我预先生成了正弦波查找表;但后来进行了一些分析;并发现仅在音频采样率下调用具有旋转相位的sin()函数占用了当代任何iOS设备CPU时间的几乎可以忽略不计的一小部分。如果您使用递增相位,请确保通过添加/减去2 * pi的倍数使相位保持在合理的数字范围内。

哇,我不知道它会如此复杂。我认为我在Core Audio或音频处理方面的知识不足,所以我需要更多地研究这个主题。有哪些文档或代码示例可以推荐阅读?先谢谢了。 - bienqueda
这个在Github上的Swift iOS示例代码可以播放指定长度的音调样本,可能可以适应精确的开始/停止时间:https://github.com/hotpaw2/auv3test5 - hotpaw2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接