首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时产生多个正弦波到音频单元的采样缓冲区(iOS)

问同时产生多个正弦波到音频单元的采样缓冲区(iOS)
EN

Stack Overflow用户
提问于 2011-07-21 11:36:30
回答 1查看 1.7K关注 0票数 2

给定一个频率和振幅的数组(长度不断变化),我可以在逐个采样的基础上生成一个包含数组中所有音调的音频缓冲区吗?如果没有,在一个音频单元中生成多个音调的最佳方法是什么?让每个音符生成自己的缓冲区,然后将它们相加到输出缓冲区中?这不就等同于一次做完所有的事情吗?

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

我一直在使用正弦波单音发生器的例子。尝试将其中一个加倍,如下所示:

Bufferframe = (sin(theta1) + sin(theta2))/2

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

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

EN

回答 1

Stack Overflow用户

发布于 2011-07-27 07:47:27

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

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

你到底想要达到什么目的?你真的需要动态生成吗?

如果是这样的话,您将冒着重载remoteIO音频单元的呈现回调的风险,这将给您带来毛刺和伪像

您可能会在模拟器上使用它,然后将其移动到设备上,然后发现奇怪的是,它不再工作了,因为您运行的处理器减少了50倍,并且一个回调无法在下一个回调到达之前完成

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

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6770977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档