使用 AudioKit 定期播放纯音

Play pure tones periodically with AudioKit

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

例如:播放 400Hz 的简单正弦波 50 毫秒,然后静音 100 毫秒,然后播放 600Hz 50 毫秒……

我有一个金属视图,我在其中呈现一些视觉刺激。我的目的是使用基本的 AKOscillator 和 CADisplayLink 的渲染功能来 play/stop 某些帧的声音。

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

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

我想要随时使用任何频率的灵活性。我怎样才能做类似于第一种方法的事情?将振荡器包裹在 midi 乐器中是可行的方法吗?

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

我成功实现可靠的亚毫秒级精确实时任意频率音频合成的唯一方法是在音频单元中放置一个正弦波振荡器(或波形发生器或 table 查找)回调(RemoteIO for iOS),并对样本进行计数,然后将所需正弦波(或其他波形)的 stop/start 动态插入回调缓冲区,从正确的样本缓冲区偏移索引开始。

起初,我预先生成正弦波查找tables;但后来做了一些分析;并发现仅以音频采样率调用具有旋转相位的 sin() 函数,在任何当代 iOS 设备上花费的时间几乎占 CPU 百分比的一小部分。如果您确实使用递增相位,请确保将相位保持在合理的数值范围内,偶尔 adding/subtracting 2*pi 的倍数。