WebAudio - 振荡器 setPeridiocWave

Posted

技术标签:

【中文标题】WebAudio - 振荡器 setPeridiocWave【英文标题】:WebAudio - Oscillator setPeridiocWave 【发布时间】:2016-05-08 17:49:38 【问题描述】:

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

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

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

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();

目前我想我不太了解周期波背后的全部数学原理。

同时播放三种声音的代码有效(在振荡器节点中使用简单的 sin 值),所以我认为问题出在我的周期波上。

另一个问题:有不同的方法吗?也许就像使用三个链接到我的三个 .wav 文件的 MediaElementAudiosourceNode。我没有办法同时播放它们。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢。现在我正在使用 BufferSource 播放声音。

以上是关于WebAudio - 振荡器 setPeridiocWave的主要内容,如果未能解决你的问题,请参考以下文章

如何正确缓存 webaudio 对象?

使用 NodeJs 中的 WebAudio API

使用 WebAudio 合并/混合两个音频流

iOS“默认”UIWebView/WebKit 上的 WebAudio 支持

来自WebSocket的WebAudio AAC流媒体播放

JavaScript - WebAudio API ScriptProcessorNode InputBuffer getChannelData 精度