gpt4 book ai didi

ios - 同时生成多个正弦波到音频单元的采样缓冲区 (iOS)

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:26:06 26 4
gpt4 key购买 nike

给定一个频率和振幅数组(长度不断变化),我能否在逐个样本的基础上生成一个包含数组中所有音调的音频缓冲区?如果不是,在单个音频单元中生成多个音调的最佳方法是什么?每个音符是否都生成自己的缓冲区,然后将它们相加到输出缓冲区中?这不是一次完成所有操作吗?

正在开发一个通过触摸生成音符的 iOS 应用程序,考虑使用 STK 但不想发送音符关闭消息,而只想为我在数组中保存的音符生成正弦音调。每个音符实际上需要产生两个频率和振幅不同的正弦波。一个音符可能与另一个音符播放相同的频率,因此该频率的音符关闭消息可能会导致问题。最后,我想管理音频单元外每个音符的振幅 (adsr) 包络。我还希望响应时间尽可能快,因此我愿意做一些额外的工作/学习以尽可能降低音频内容的音量。

我一直在研究正弦波单音发生器示例。基本上尝试将其中一个加倍,例如:

缓冲区[帧] = (sin(theta1) + sin(theta2))/2

将 theta1/theta2 增加 frequency1/frequency2 超过采样率,(我意识到这不是最有效的调用 sin() )但会产生混叠效果。除了从文件中读取音频外,我还没有找到具有多个频率或数据源的示例。

有什么建议/例子吗?我最初让每个音符都生成自己的音频单元,但这给了我太多从触摸到音符发声的延迟(而且似乎也很低效)。我对这个级别的编程比一般的数字音频还新,所以如果我遗漏了一些明显的东西,请多多包涵。

最佳答案

当然可以,您可以在渲染回调中做任何您喜欢的事情。当您重新设置此调用时,您可以传递一个指向对象的指针。

该对象可以包含每个音调的开关状态。事实上,该对象可能包含一个负责填充缓冲区的方法。 (只要确保对象是非原子的,如果它是一个属性——否则你会因为锁定问题而得到人工制品)

你到底想达到什么目的?您真的需要即时生成吗?

如果是这样,您将面临使 remoteIO 音频单元的渲染回调过载的风险,这会给您带来故障和伪像

您可能会在模拟器上侥幸逃脱,然后将其移至设备,然后神秘地发现它不再工作了,因为您运行的处理器数量减少了 50 倍,并且一个回调无法在下一个回调之前完成到达

话虽如此,你可以逃脱很多

我制作了一个 12 音调播放器,可以同时播放任意数量的单独音调

我所做的就是为每个音调设置一个环形缓冲区(我使用的是相当复杂的波形,所以这需要很多时间,事实上我实际上是在应用程序第一次运行时计算它,然后从文件中加载它) ,并为每个环维护一个读头和一个启用标志。

然后我将所有内容添加到渲染回调中,这在设备上处理得很好,即使所有 12 个都在玩。我知道文档告诉你不要这样做,它建议只使用这个回调来从另一个缓冲区填充一个缓冲区,但你可以逃脱很多,而且它是一个 PITA 来编写某种缓冲系统来计算在不同的线程上。

关于ios - 同时生成多个正弦波到音频单元的采样缓冲区 (iOS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6770977/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com