【发布时间】:2010-05-16 18:00:22
【问题描述】:
是否可以仅使用算法生成乐器的声音?还是只能通过预先录制的声音样本来完成?
【问题讨论】:
是否可以仅使用算法生成乐器的声音?还是只能通过预先录制的声音样本来完成?
【问题讨论】:
【讨论】:
完全有可能——这是synthesizers 所做的事情之一。
有可能并不意味着它很简单。合成器通常很昂贵,而且使用的算法数量也很复杂——我之前链接的维基百科页面有其中一些的链接。
预先录制的声音使用起来更简单、成本更低,但它们也有其局限性——例如,它们听起来更“重复”。
【讨论】:
几年前,Sound on Sound 杂志推出了一个名为“Synth Secrets”的优秀系列,现在可以免费使用viewed online。它们很好地介绍了硬件合成器(模拟和数字)中使用的技术类型,并包括一些讨论复制某些真实世界乐器声音的困难的文章,例如弹拨和弓弦、铜管乐器、军鼓、原声钢琴等等
【讨论】:
确实如此,而且有很多方法。 Wolfram 最近发布了WolframTones,它(如果您知道 Wolfram,这不足为奇)使用元胞自动机。其功能的详细描述是here。
【讨论】:
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,最初是通电的,同时能量从环中的每个点向外消散。神奇的是,它似乎将自己组织成基本频率的泛音。
谁能发布更多算法?连续音的算法怎么样?
【讨论】:
查克
This PDF 详细介绍了 SMule 如何为 iPhone 制作陶笛(我相信每个人都看过广告)。他们通过移植Chuck - Strongly-timed, Concurrent, and On-the-fly Audio Programming Language
做到了这适用于 MacOS X、Windows 和 Linux。
【讨论】:
我在 FM 合成方面取得了很多成功和乐趣。它是一种轻量级计算方法,是 1980 年代大量流行合成器声音的来源(是无处不在的 Yamaha DX-7 的基础)。
我确实使用它来即时生成声音,而不是使用录音。可以从http://philfrei.itch.io/referencenotekeyboard 获得一个即时生成的弦乐合成器声音的简单示例(免费下载,Win64)。同一程序中的风琴合成器是一个简单的加法合成算法。
我必须四处寻找一些关于这方面的好教程。我知道我们在 java-gaming.org 上讨论了很多,当时我试图弄清楚,然后帮助 nsigma 解决他的 FM 算法中的一个扭结。如果要将多个调制器链接到载波,主要是使用相位而不是频率调制。
这让我想起了!一种令人惊叹的基于 java 的声音生成器,可以生成多种不同形式的合成,并具有实时控制: PraxisLIVE
【讨论】: