【问题标题】:Generate musical instrument sounds algorithmically通过算法生成乐器声音
【发布时间】:2010-05-16 18:00:22
【问题描述】:

是否可以仅使用算法生成乐器的声音?还是只能通过预先录制的声音样本来完成?

【问题讨论】:

    标签: algorithm audio


    【解决方案1】:

    Wavetable 合成 (PDF) 是真实乐器合成中最现实的方法,因为它会采样并稍微改变它们(例如添加颤音、表情等)。

    大多数乐器(尤其是管乐器和铜管乐器)生成的波形非常复杂,以至于纯算法合成尚未优化到足以在当前硬件上运行 - 即使是这样,编写这种算法的技术复杂性也很大.

    有趣的网站here

    【讨论】:

    • 网上有教程说明如何生成特定乐器的特定音符的声音吗?例如。钢琴上的 A4 (440Hz) 包含所有方程式和变量的分步指南...
    • @LaSha:从页面@Andy 链接到:“最终,使用加法合成效率不高。在实践中,您必须添加大量频率才能使声音逼真。我已经接近了在添加近百个频率分量后重现原声钢琴的音符。具有尖锐起音包络的乐器,如锤子撞击钢琴,需要许多频率才能使尖锐的开头听起来正确。”
    • @ergrunin:确实需要添加许多频率分量,但是有诸如 FM(频率调制)之类的合成技术允许添加许多频率分量,而只需要几个正弦曲线即可生成它们。因此,加法合成不一定是低效的。
    【解决方案2】:

    完全有可能——这是synthesizers 所做的事情之一。

    有可能并不意味着它很简单。合成器通常很昂贵,而且使用的算法数量也很复杂——我之前链接的维基百科页面有其中一些的链接。

    预先录制的声音使用起来更简单、成本更低,但它们也有其局限性——例如,它们听起来更“重复”。

    【讨论】:

      【解决方案3】:

      几年前,Sound on Sound 杂志推出了一个名为“Synth Secrets”的优秀系列,现在可以免费使用viewed online。它们很好地介绍了硬件合成器(模拟和数字)中使用的技术类型,并包括一些讨论复制某些真实世界乐器声音的困难的文章,例如弹拨和弓弦、铜管乐器、军鼓、原声钢琴等等

      【讨论】:

        【解决方案4】:

        经过几天的狩猎,这是我找到的最好的资源:@​​987654321@

        这是合成声音主题的宝库。

        STK 例如,this page 链接到一个合成字符串的 C 示例,还有一个用 C++ 编写的声音工具包STK 来协助这项工作。

        这会让我在研究它的时候保持安静几个星期。

        【讨论】:

          【解决方案5】:

          确实如此,而且有很多方法。 Wolfram 最近发布了WolframTones,它(如果您知道 Wolfram,这不足为奇)使用元胞自动机。其功能的详细描述是here

          【讨论】:

            【解决方案6】:

            Karplus 强算法可以很好地合成弹拨弦。它也可以用几行 C 来编码。你创建一个浮点的循环缓冲区(长度与波长成比例,即 1/f),并在 -1 和 1 之间填充随机噪声。

            然后循环:每个循环,将当前索引处的值替换为前两个值的平均值,并发出这个新值。

            index = (index+1) % bufSize; 
            outVal = buf[index] = decay * 0.5 * ( buf[index-1] + buf[index-2] );
            

            生成的字节流为您提供声音。当然,这可以进行大量优化。

            为了让你的声波在一秒后衰减到原始强度的 0.15,你可以这样设置衰减:

            #define DECAY_1S =.15
            Float32 decay = pow(DECAY_1S, 1.0f / freq);
            

            注意:您需要调整原始缓冲区的大小,使其包含一个完整的波形。因此,如果您希望生成 441Hz 的声音,并且您的采样率为 44.1KHz,那么您需要在缓冲区中分配 100 个元素。

            你可以把它想象成一个共振室,它的基本频率是 441Hz,最初是通电的,同时能量从环中的每个点向外消散。神奇的是,它似乎将自己组织成基本频率的泛音。

            谁能发布更多算法?连续音的算法怎么样?

            【讨论】:

            【解决方案7】:

            除了此处提供的答案之外,还有分析合成框架可以构建输入声音的数学模型(通常基于捕获正弦或噪声分量的轨迹),从而允许转换和重新合成。一些著名的框架是:SMS(可通过CLAM C++ 项目获得)和 Loris。

            乐器的物理模型也是一种选择 - 它们模拟乐器的物理特性,例如簧片刚度、气孔孔径、按键声,并且通常通过结合非线性效应(如过度吹气)来产生逼真的效果。 STK 是 C++ 中的这些框架之一。

            这些框架通常比波表合成选项更重,但可以提供更多参数进行操作。

            【讨论】:

              【解决方案8】:

              查克

              This PDF 详细介绍了 SMule 如何为 iPhone 制作陶笛(我相信每个人都看过广告)。他们通过移植Chuck - Strongly-timed, Concurrent, and On-the-fly Audio Programming Language

              做到了

              这适用于 MacOS X、Windows 和 Linux。

              【讨论】:

                【解决方案9】:

                我在 FM 合成方面取得了很多成功和乐趣。它是一种轻量级计算方法,是 1980 年代大量流行合成器声音的来源(是无处不在的 Yamaha DX-7 的基础)。

                我确实使用它来即时生成声音,而不是使用录音。可以从http://philfrei.itch.io/referencenotekeyboard 获得一个即时生成的弦乐合成器声音的简单示例(免费下载,Win64)。同一程序中的风琴合成器是一个简单的加法合成算法。

                我必须四处寻找一些关于这方面的好教程。我知道我们在 java-gaming.org 上讨论了很多,当时我试图弄清楚,然后帮助 nsigma 解决他的 FM 算法中的一个扭结。如果要将多个调制器链接到载波,主要是使用相位而不是频率调制。

                这让我想起了!一种令人惊叹的基于 java 的声音生成器,可以生成多种不同形式的合成,并具有实时控制: PraxisLIVE

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2014-06-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多