【问题标题】:Play pure tones periodically with AudioKit使用 AudioKit 定期播放纯音
【发布时间】:2018-10-27 14:27:55
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 你试过将rampTime(开发分支中的rampDuration)设置为零吗?
  • 是的,rampTime 设置为零。我正在用示波器测量屏幕的变化和声音的变化,所以目前我没有注意爆裂声和咔嗒声。屏幕表现非常准确,误差小于 1 毫秒,但声音不是。

标签: ios swift audio audiokit


【解决方案1】:

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

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

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

【讨论】:

  • 哇,我不知道它会这么复杂。我认为我在 Core Audio 或音频处理方面没有足够的知识,所以我需要更多地学习这个主题。有什么推荐的文档或代码示例来阅读更多相关信息吗?提前致谢。
  • github 上的这个 Swift iOS 示例代码在样本中播放精确长度的音调,可能适合精确的开始/停止时间:github.com/hotpaw2/auv3test5
猜你喜欢
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多