23

我发现了一些使用 Web Audio API 进行乐器合成的库。

其中之一(Band.js)使用createOscillator(), 与振荡器类型(正弦,正方形,...)结合使用,请参阅 source

但这听起来太合成了(听的例子)我想要一些听起来更真实的东西,但我不想使用任何预编译的声音字体,所以应该合成它。它也应该在移动设备上工作。

所以我找到了另一个库(musical.js),它使用前 32 个谐波作为矩阵并结合了createPeriodicWave see source。音色很棒,可以听听

正如在源代码的注释中所写的那样,谐波取自这个钢琴样本文件。还有更多其他乐器的示例文件。我试图更换谐波,甚至所有 2000,但它听起来总是像钢琴。

还有一些值可以调整和插入谐波和 ADSR 值。也许它们只针对钢琴声音进行了优化?

然后我找到了另一个库(吉他合成器),它的吉他音色非常好,听听。但是这个库不使用任何createPeriodicWaveAPI。相反,它使用createScriptProcessorgetChannelData结合了一些“简单”计算,但与其他库中的谐波完全不同,请参阅源代码

所以我的主要问题

可以移植吉他合成器以使用createPeriodicWaveAPI 吗?我想在musicjs中使用吉他音色。这样我就可以在钢琴音色和吉他音色之间切换。

顺便说一句:找到另一个合成声音乐器的库。这是演示,这里是源代码。声音也不错,但 music.js 库的音色更优美。但它看起来也使用了类似的东西,比如getChannelData编码为 WAVE。它也不适用于我的 Android 移动设备。

4

1 回答 1

3

这不是答案,只是关于该主题的一些想法和注释。

这个问题本身对我来说很有趣,我正在弹吉他,但从来没有机会(直到现在)接触代码中的音乐。我阅读了一些理论并使用了 music.js,但我觉得我离解决方案还很远。

这里有一些笔记,希望它们有用:

1)我把从 musicial.js 中提取的代码的简化示例放在一起,请参阅web-audio-test.jsweb-audio.html

如果我没记错的话,musical.js 的音频节点设置是这样的:

有一个“尾巴”部分,它对所有节点都是通用的,并且永久保留,而“头”部分 - 为播放每个音符而创建的一组节点

| ------ HEAD (for each note)------ | --- TAIL (for all notes)----------- |
|                                   |                                     |
[ |Oscillator|->|Biquad|->|Gain|-> ] [|Gain|->|Dynamics  |->|Destination| ]
  | Periodic |  |Filter|  |ADSR|              |Compressor|
  | Wave     |

注意:第一个振荡器可以被另一个振荡器加倍以播放音符频率 + 音色失谐。

所以我们创建一个(或两个)振荡器+滤波器+ADSR增益来播放每个音符。这样我们就创建了很多音频节点。Musicial.js 通过创建一个音符队列来处理这个问题,并且只将一组有限的音符传递给 Web 音频 API。

吉他合成器设置看起来要容易得多,而且它只是一个|Script Processor| -> | Output |. 吉他声音样本由代码生成并馈送到充当声源的 ScriptProcessor 节点(就像从文件中加载样本一样)。不确定,但也许 music.js 也可以使用这种方法来简化代码。

2)我在 musicial.js 中使用了不同的参数,但一切听起来都像钢琴。

当我应用波表示例中的贝司或吉他系数时,听起来不同,但仍然像钢琴(尤其是高音)。

ADSR 设置不会改变这种“钢琴”的声音,但我认为它们实际上不能将一种乐器的声音变成另一种乐器的声音。

用于将实数/图像中的谐波插入更高频率的multfreq数组可能更重要,但如果我们将它们保持为空(无插值),乐器听起来仍然像钢琴。

实际上需要改变什么来调整声音对我来说仍然是一个难题。

我看到了你在github上发布的问题,希望 musicial.js 的作者至少能够给出一些提示。

3) 有用的链接/工具

Google 音频样本不包含我们在此处需要的任何内容。最接近的是波表合成器示例,您可以在其中切换不同的波表。

Firefox 有一个“网络音频编辑器”,您可以在其中看到音频节点的图表,非常方便学习音频设置。

4)实用的解决方案。

您可能已经想到了这一点,目前我会同时使用 musicial.js 和吉他合成器。

一个简单的包装器可以统一接口并提供钢琴和吉他乐器。

于 2016-01-18T11:01:28.910 回答