通过算法生成乐器声音

时间:2010-05-16 18:00:22

标签: algorithm audio

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

9 个答案:

答案 0 :(得分:9)

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

大多数乐器(特别是风和铜管乐器)产生的波形非常复杂,以至于纯粹的算法综合还不够优化,无法在当前的硬件上运行 - 即使是这样,编写这样的算法的技术复杂性也很大

有趣的网站here

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:5)

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

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

<强> STK 例如,this page链接到合成字符串的C示例,也是用C ++编写的用于协助此工作的声音工具包STK

当我深入挖掘它时,这会让我安静几个星期。

答案 4 :(得分:4)

当然是,并且有很多方法。 Wolfram最近发布了WolframTones,(不出所料,如果你知道Wolfram)使用细胞自动机。有关其运作方式的详细说明是here

答案 5 :(得分: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,最初通电,同时从环中的每个点向外消散能量。可悲的是,它似乎将自己组织成一个基本频率的泛音。

有人可以发布更多算法吗?连续音的算法怎么样?

答案 6 :(得分:2)

除了这里提供的答案之外,还有分析合成框架,其构建输入声音的数学模型(通常基于捕获正弦或噪声分量的轨迹),允许转换和再合成。一些众所周知的框架是:SMS(可通过CLAM C ++项目获得)和Loris。

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

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

答案 7 :(得分:0)

<强>查

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

来做到这一点

适用于MacOS X,Windows和Linux。

答案 8 :(得分:0)

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

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

我将不得不在这方面挖掘一些好的教程。我知道我们在java-gaming.org上讨论过很多,当时我正试图弄清楚,然后在帮助nsigma解决他的FM算法中的一个难题。如果要将多个调制器链接到一个载波上,最主要的是使用相位调制而不是频率调制。

这让我想起了!一种令人惊叹的基于Java的声音生成器,可以检出,允许实时控制地生成多种不同形式的合成: PraxisLIVE