【问题标题】:Has anybody some advice on programming realtime audio synthesis?有人对编程实时音频合成有什么建议吗?
【发布时间】:2011-05-10 10:12:21
【问题描述】:

我目前正在从事一个个人项目:在 Flash 中创建一个用于实时音频合成的库。简而言之:将波发生器、滤波器、混频器等相互连接并为声卡提供原始(实时)数据的工具。像 max/msp 或 Reaktor 之类的东西。

我已经有了一些工作的东西,但我想知道我写的基本设置是否正确。我不想在以后遇到问题,迫使我改变我的应用程序的核心(尽管这总是会发生)。

基本上,我现在所做的是从链的末端开始,在(原始)声音数据“输出”(到声卡)的地方。为此,我需要将字节块(ByteArrays)写入一个对象,并且为了得到那个块,我会询问任何连接到我的“Sound Out”模块的模块给我他的块。该模块对连接到他的输入的模块执行相同的请求,并且一直发生直到到达链的开头。

这是正确的方法吗?我可以想象如果有反馈回路,或者如果有另一个没有输出的模块会遇到问题:如果我要在某处连接频谱分析仪,那将是链中的死胡同(一个没有输出的模块,只有一个输入)。在我目前的设置中,这样的模块不起作用,因为我只从声音输出模块开始计算。

有没有人有这样的编程经验?我会对有关正确方法的一些想法非常感兴趣。 (为了清楚起见:我不是在寻找特定的 Flash 实现,这就是为什么我没有在 flash 或 actionscript 下标记这个问题)

【问题讨论】:

    标签: audio real-time sound-synthesis


    【解决方案1】:

    不久前我做过类似的事情,我使用了与您相同的方法 - 从虚拟线路输出开始,然后将信号跟踪到顶部。我是按样本做的,而不是按缓冲区做的;如果我今天要编写相同的应用程序,我可能会选择 per-buffer,因为我怀疑它的性能会更好。

    光谱仪被设计成一个插入模块,也就是说,它只有在输入和输出都连接的情况下才能工作,并且它将输入不变地传递给输出。

    为了处理反馈,我有一个特殊的帮助模块,它引入了 1 个样本的延迟,并且每个周期只会获取一次它的输入。

    另外,我认为使用浮点数进行所有内部处理,因此将浮点数数组作为缓冲区,这将比字节数组容易得多,并且它会为您节省在整数和浮点数之间转换的额外工作时间.

    【讨论】:

      【解决方案2】:

      在以后的版本中,您网络的不同部分可能有不同的数据包速率。

      一个例子是,如果您扩展它以将数据传输到磁盘或从磁盘传输数据。另一个例子 将是低数据速率控制变量,例如一个控制回声延迟,稍后可能会成为您网络的一部分。您可能不想以与处理音频数据包相同的频率处理控制变量,但它们仍然是“实时的”并且是功能网络的一部分。例如,它们可能需要平滑以避免突然的转换。

      只要您以相同的速率调用所有函数,并且所有函数基本上都在使用恒定时间,那么您的数据提取方法就可以正常工作。这里将 在拉取数据和推送之间几乎没有选择。拉动对于播放音频来说更自然一些,推送对于录制来说更自然一些,但两者都可以工作并最终对底层音频处理函数进行相同的调用。

      • 对于 光谱仪,您有 多个接收器的问题 数据,但这不是问题。 从中引入一个虚拟链接 真正的水槽。虚拟链接可以 导致对数据的请求不是 荣幸。只要虚拟链接知道 它是一个假人,不关心 缺乏数据,一切都会 好的。这是一种将多个接收器或源减少为一个的标准技术。

      • 使用这种网络,您不希望在一次完整更新中执行两次相同的计算。例如,如果您混合了信号的高通和低通版本,您不想对原始信号进行两次评估。您必须执行一些操作,例如为每个缓冲区记录一个计时器刻度值,并在您看到当前刻度值已经存在时停止拉取传播。同样的机制也将保护您免受评估中的反馈循环

      因此,您关心的这两个问题可以在您当前的框架内轻松解决。

      速率匹配 在网络的不同部分存在不同的数据包速率时,当前方法的问题将由此开始。如果您正在将音频写入磁盘,那么为了提高效率,您将希望不经常写入大块。您不希望在这些写入期间阻止对更频繁的小型音频输入和输出处理数据包的服务。单靠单一的利率拉动或推动策略是不够的。

      请接受,在某些时候您可能需要一种比单一费率网络更复杂的更新方式。发生这种情况时,您将需要针对正在运行的不同速率的线程,或者您将编写自己的简单调度程序,可能就像在 n 中调用一次不太频繁评估的函数一样简单,以使速率匹配。您无需为此提前计划。您的音频功能几乎肯定已经将确保其输入缓冲区准备好其他功能的责任委派给其他功能,并且只有那些其他功能需要更改,而不是音频功能本身。

      在这个阶段我建议的一件事是要小心集中音频缓冲区 分配,注意到缓冲区就像栅栏一样。它们不属于音频 功能,它们位于音频功能之间。集中缓冲区分配将便于追溯修改网络不同部分的不同速率的更新策略。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        • 2020-02-14
        • 2011-03-08
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        相关资源
        最近更新 更多