我找到了一些用Web Audio API进行仪器合成的库。
其中一个(Band.js)使用createOscillator()
,结合振荡器类型(正弦,方形,......)see source。
但听起来太合成了(example to listen) 我想要一些听起来更真实的东西,但我不想使用任何预编译的声音字体,所以它应该被合成。它也适用于移动设备。
所以我找到了另一个库(musical.js),它使用前32个谐波作为矩阵并结合createPeriodicWave
see source。音色很棒,你可以listen to it
正如源代码的注释中所写,谐波来自此piano sample file。还有更多其他乐器的示例文件。我试图取代谐波,甚至整个2000年,但它听起来总是像钢琴。
还有一些值可以调整和插入谐波和ADSR值。也许它们只针对钢琴声音进行了优化?
然后我发现另一个库(吉他合成器),它有一个非常好的吉他音色,listen to it。但是这个库不使用任何createPeriodicWave
API。相反,它会将createScriptProcessor
和getChannelData
与一些"简单"结合使用。计算,但没有像其他图书馆的谐波,see source
可以移植吉他合成器以使用createPeriodicWave
API吗?
我想在musicaljs中使用吉他音色。这样我就可以在钢琴音色和吉他音色之间切换。
getChannelData
的东西,只是编码为WAVE。它也无法在我的移动设备上使用Android。
答案 0 :(得分:3)
这不是一个答案,只是关于这个主题的一些想法和注释。
问题本身对我很有意思,我正在弹吉他,但从来没有机会(直到现在)用代码触摸音乐。 我阅读了一些理论并与music.js一起演奏,我觉得我离解决方案还很远。
这里有一些注释,希望它们有用:
1)我将reduced example of code extracted from musicial.js放在一起,见web-audio-test.js
和web-audio.html
。
如果我没有弄错的话,为musicial.js设置的音频节点是:
有一个"尾巴"部分,这对所有节点都是通用的,并永久保留,并且#34; head" - 为播放每个音符而创建的节点集
| ------ 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节点,该节点充当声源(如果您从文件加载样本)。
不确定,但也许musical.js也可以使用这种方法来简化代码。
2)我在musicial.js中使用了不同的参数,但仍然听起来像钢琴。
当我从wave tables examples应用低音或吉他系数时,听起来不一样,但仍然像钢琴(特别是高音)。
ADSR设置不会改变这个"钢琴"声音,但我认为它们实际上无法将一种乐器的声音转换为另一种乐器的声音。
mult
和freq
数组用于将实数/图像中的谐波插值到更高的频率可能更重要,但如果我们将它们保持为空(无插值),则仪器仍然是听起来像钢琴。
实际上需要改变以调整声音对我来说仍然是一个难题。
我在github上看到了您发布的问题,希望musicial.js作者能够至少提供一些提示。
3)有用的链接/工具
Google音频示例并未包含我们在此处所需的任何内容。 最接近的是wavetable synth example,您可以在其中切换不同的波表。
Firefox有"Web Audio Editor",您可以在其中查看音频节点图,非常方便学习音频设置。
4)实用的解决方案。
你可能已经知道了,目前我会同时使用musicial.js和guitar-synth。
一个简单的包装器可以统一界面并提供钢琴和吉他乐器。