WebAudio - Oscillator setPeridiocWave

时间:2016-05-08 17:49:39

标签: javascript html5 audio signal-processing web-audio

我使用SO上的code创建三个不同的线性啁啾。使用其他一些代码片段,我将这三个声音保存为单独的.wav文件。到目前为止这是有效的。

现在我想在同一时间播放这三种声音。所以我想我可以使用WebAudio API,用我从上面的代码中获得的float数组提供三个振荡器节点。 但我没有至少有一个振荡器节点来播放它的声音。

到目前为止我的代码(缩小为一个振荡器)

var osc = audioCtx.createOscillator();
var sineData = linearChirp(freq, (freq + signalLength), signalLength, audioCtx.sampleRate); // linearChirp from link above
// sine values; add 0 at the front because the docs states that the first value is ignored
var imag = Float32Array.from(sineData.unshift(0));  
var real = new Float32Array(imag.length); // cos values
var customWave = audioCtx.createPeriodicWave(real, imag);
osc.setPeriodicWave(customWave);
osc.start();

目前我认为我不太了解peridioc波背后的整个数学。

同时播放三种声音的代码有效(振荡器节点中有简单的sin值),所以我认为问题是我的peridioc波。

另一个问题:有不同的方式吗?也许比如使用链接到我的三个.wav文件的三个MediaElementAudioSourceNode。我没有看到在同一时间播放它们的方法。

1 个答案:

答案 0 :(得分:1)

PeriodicWave不是"在这里粘贴一个波形,它将用作单个振荡"特征 - 它通过指定各种谐波的相对强度来构建波形。请注意,在您指向的代码中,它们创建一个BufferSource节点并将其.buffer指向linearchirp()的结果。你也可以这样做 - 只需使用BufferSource节点来播放linearshirp()输出,(我认为?)只是正弦波? (如果是这样,你可以使用一个振荡器并跳过整个凌乱的#34;创建一个缓冲区"位。)

如果您只想播放已创建的缓冲区,请使用BufferSource。如果要创建复杂的谐波,请使用PeriodicWave。如果您已创建单周期波形并且想要将其作为源波形播放,请使用BufferSource并将其循环。