通过算法生成乐器声音

21

是否可能仅使用算法生成乐器声音?或者只能通过预录制的音频样本来实现?

9个回答

9
Wavetable合成(PDF)是最逼真的真实乐器合成方法,它采用样本并稍微修改它们(例如添加颤音、表现等)。
大多数音乐器乐器产生的波形非常复杂,以至于纯算法合成还没有优化到足以在当前硬件上运行-即使是这样,编写这种算法的技术复杂性也非常巨大。
有趣的网站here

有没有网络教程展示如何生成特定乐器的特定音符的声音?例如,钢琴上的A4(440Hz) 一步一步的指南,包括所有方程式和变量... - LaSha
2
@LaSha:从@Andy链接的页面上可以看到:“最终,使用加法合成并不高效。在实践中,您必须添加大量频率才能使声音更加逼真。我已经接近于在添加了近百个频率分量后再现了钢琴音符的音色。像钢琴锤击这样具有尖锐攻击包络的乐器需要许多频率才能使其开始的尖锐部分听起来正确。” - egrunin
2
@ergrunin:确实需要添加许多频率成分,但是有一些合成技术,例如FM(频率调制),可以使用仅几个正弦波来生成许多频率成分。因此,并不一定是加性合成效率低下。 - Michael Chinen

7

完全有可能 - 这是合成器的功能之一。

虽然可以实现,但并不意味着简单。合成器通常价格昂贵,使用的算法数量复杂 - 我之前链接的维基百科页面中有一些相关链接。

预先录制的声音更简单、更便宜,但它们也有其局限性 - 例如声音听起来更“重复”。


5

几年前,声音杂志发表了一个名为“合成器秘诀”的系列文章,现在可以免费在线查看。这些文章很好地介绍了硬件合成器(模拟和数字)中使用的技术类型,并包括一些讨论复制某些真实乐器声音的困难的文章,例如弹拨和弓弦乐器、铜管乐器、军鼓、木琴等。


5

经过几天的搜索,这是我找到的最好的资源:https://ccrma.stanford.edu/~jos/

这是一个关于合成声音主题的宝库。

STK 例如,此页面链接到一个C语言合成字符串的示例,还有一个用于辅助此工作的C++编写的声音工具包STK

在我挖掘这些内容的几周时间里,这将让我保持安静。


4

当然是可以,有很多方法。Wolfram最近发布了WolframTones,如果你了解Wolfram的话,你就不会感到惊讶,它使用元胞自动机。如何运行的详细描述在这里


4
Karplus Strong算法可以很好地合成弹拨弦的声音。它也可以用几行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,最初被激发,并且从环中的每个点同时向外散发能量。神奇的是,它似乎会自行组织成基本频率的泛音。
有人可以发布更多算法吗?如何连续发出声音的算法呢?

Karplus-Strong算法Python实现(2017,约20页),包含描述、图片、代码片段、音频样本和IPython笔记本:5个。 - denis

2
除了这里提供的答案,还有分析合成框架可以构建数学模型(通常基于捕捉正弦或噪声成分的轨迹)的输入声音,从而实现转换和再合成。一些著名的框架包括:SMS(通过C++项目CLAM提供),以及Loris。
乐器的物理模型也是一种选择 - 它们模拟乐器的物理特性,如簧片硬度、吹口孔径、按键点击,并通过结合过吹等非线性效应产生逼真的效果。STK是C++中的其中一个框架。
这些框架通常比波表合成选项更重,但可以提供更多的操作参数。

0

0

我在FM合成方面取得了很多成功和乐趣。它是一种计算量较小的方法,也是20世纪80年代流行合成器声音的巨大来源(作为无处不在的Yamaha DX-7的基础)。

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

我需要找一些关于这方面的好教程。我知道当我试图弄清楚它并帮助nsigma解决他的FM算法问题时,我们在java-gaming.org上讨论了很多。主要的是如果您想将多个调制器链接到载波,则使用相位而不是频率调制。

这提醒我!有一种令人惊叹的基于Java的声音生成器可供检查,允许生成多种不同形式的合成,并进行实时控制:PraxisLIVE


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接