如何使用 createPeriodicWave 代替 createScriptProcessor 和 getChannelData

How to use createPeriodicWave instead of createScriptProcessor and getChannelData

我找到了一些用网络音频进行乐器合成的库 API。

其中之一 (Band.js) 使用 createOscillator(),结合振荡器类型(正弦波、方波、...)see source

不过听起来太合成了(example to listen) 我想要听起来更真实的东西,但我不想使用任何预编译的声音字体,所以应该合成它。它也应该适用于移动设备。

所以我找到了另一个库 (musical.js),它使用前 32 个谐波作为矩阵并结合 createPeriodicWave see source. The timbre is awesome, you can listen to it

如源码注释中所写,谐波取自此piano sample file。其他仪器的示例文件更多。我试过把泛音换掉,连2000都换了,但听起来总是像钢琴

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

然后我找到了另一个库 (guitar-synth),它的吉他音色非常好,listen to it. But this library don't use any createPeriodicWave API. Instead it uses createScriptProcessor and getChannelData in combination with some "simple" calculations, but nothing like the harmonics at the other library, see source

所以我的主要问题

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

顺便说一句:找到了另一个合成声音乐器的库。这里是demo and here the source。声音也不错,但 musical.js 音色库的音色更优美。但它看起来也像使用类似 getChannelData 的东西,只是编码为 WAVE。它也不适用于我的 Android.

移动设备

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

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

这里做一些笔记,希望对你有用:

1) 我将 reduced example of code extracted from musicial.js 放在一起,参见 web-audio-test.jsweb-audio.html

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

有一个 "tail" 部分,它对所有节点都是通用的并且永久保留 "head" - 为播放每个音符而创建的节点集

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

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

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

guitar-synth 设置看起来简单多了,它只是一个 |Script Processor| -> | Output |。 吉他声音样本由代码生成,并送入充当声源的 ScriptProcessor 节点(就像您从文件中加载样本一样)。 不确定,但也许 musical.js 也可以使用这种方法来简化代码。

2) 我在 musicial.js 中使用了不同的参数进行演奏,但仍然听起来像钢琴。

当我从 wave tables examples 应用贝司或吉他系数时,它听起来不同,但仍然像钢琴(尤其是高音)。

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

用于将real/imag中的谐波插值到更高频率的multfreq数组可能更重要,但如果我们将它们留空(不插值),乐器听起来仍然像钢琴。

调音到底需要改什么,对我来说还是个迷。

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

3) 有用的链接/工具

Google 音频示例不包含我们在这里需要的任何内容。 最接近的是 wavetable synth example,您可以在其中切换不同的波表。

Firefox 有一个 "Web Audio Editor" 可以看到音频节点图,非常方便学习音频设置。

4) 实用的解决方案。

你可能已经想到了这一点,目前我会同时使用 musicial.js 和 guitar-synth。

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