给定一个频率和幅度的阵列(长度变化),我可以逐个样本地生成单个音频缓冲区,其中包括阵列中的所有音调吗?如果不是,在单个音频单元中生成多个音调的最佳方法是什么?让每个音符生成它自己的缓冲区然后将它们加到输出缓冲区中吗?这不是一次性做到这一点吗?
使用触摸生成笔记的iOS应用程序,考虑使用STK但不想发送笔记消息,宁愿只为我在数组中保存的笔记生成正弦音。每个音符实际上需要产生两个具有不同频率和幅度的正弦曲线。一个音符可能与不同的音符播放相同的频率,因此该频率的音符关闭消息可能会导致问题。最后,我想管理音频单元外的每个音符的幅度(adsr)包络。我也希望响应时间尽可能快,所以我愿意做一些额外的工作/学习,以保持音频内容尽可能低。
我一直在使用正弦波单音发生器示例。尝试基本上加倍其中一个,如:
缓冲区[frame] =(sin(theta1)+ sin(theta2))/ 2
通过频率1 /频率2在采样率上增加theta1 / theta2,(我意识到这不是最有效的调用sin())但是获得了混叠效果。我还没有找到除了从文件中读取音频之外的多个频率或数据源的示例。
有什么建议/例子吗?我最初让每个音符都生成了自己的音频单元,但这给了我从触摸到音符发声的过多延迟(并且看起来效率也很低)。我对这个级别的编程比一般的数字音频更新,所以如果我遗漏了一些明显的东西,请保持温和。
答案 0 :(得分:2)
是的,你当然可以,你可以在渲染回调中做任何你喜欢的事情。当您重新设置此调用时,可以传入指向对象的指针。
该对象可以包含每个音调的开关状态。实际上,该对象可以包含一个负责填充缓冲区的方法。 (只是确保对象是非原子的,如果它是属性 - 否则你会因锁定问题而得到假象)
你到底想要达到什么目的?你真的需要即时生成吗?
如果是这样,你冒着重载remoteIO音频单元的渲染回调的风险,这将给你带来毛刺和人工痕迹
你可能会在模拟器上侥幸逃脱,然后把它移到一个设备上,发现它神秘地再也无法工作了,因为你运行的处理器少了50倍,而且在下一个处理器之前无法完成一个回调到达
说过,你可以侥幸逃脱
我制作了一款12音调播放器,可以同时播放任意数量的音调
我所做的就是为每个音调设置一个环形缓冲区(我使用了相当复杂的波形,所以这需要花费很多时间,实际上我实际上是在第一次运行应用程序时计算它并随后从文件中加载它) ,并为每个环维护一个读头和一个启用标志。
然后我在渲染回调中添加所有内容,这在设备上处理得很好,即使所有12个正在一起播放。我知道文档告诉你不要这样做,它建议只使用这个回调以便从另一个缓冲区填充一个缓冲区,但是你可以侥幸逃脱,并且它是一个PITA来编写某种缓冲系统来计算在另一个线程上。