草庐IT

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

coder 2024-01-22 原文

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

正在开发一个通过触摸生成音符的 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/

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

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  3. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  6. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  7. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  8. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  9. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  10. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

随机推荐