如何在 Web Audio API 中为 OscillatorNode 设置相位偏移?

rob*_*ert 5 javascript audio webkit web-audio-api

我正在尝试实现此处描述的立体声相位:http : //www.image-line.com/support/FLHelp/html/plugins/3x%20OSC.htm

"立体声相位 (SP) - 允许您为发生器的左右声道设置不同的相位偏移。偏移导致振荡器从振荡器形状的不同点开始(例如,从振荡器的最高值开始正弦函数而不是零点。立体声相位偏移增加了所产生声音的丰富度和立体声全景。”

我正在尝试为 OscillatorNode 实现这一点。我唯一的想法是使用 createPeriodicWave ( https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-createPeriodicWave ) 但是,规范中对创建周期波的描述是超出我的理解,我没有通过谷歌找到任何例子。

任何帮助破译 createPeriodicWave 的描述都会很有帮助,就像任何其他关于如何实现这种效果的想法一样。

谢谢!

小智 5

麦克莱伦等人,

这个答案帮助并随后使我进入了傅立叶的世界。在有关该主题的页面和一些维基百科的帮助下,我想我得到了方形和锯齿图案,但三角形图案仍然让我望而却步。有人知道吗?

它确实为您提供了相移的能力,正如Nick Thompson 的这篇文章所解释的(尽管他对 AudioContext 方法的调用方式不同,但原理是相同的)。

至于方形和锯齿图案:

var n = 4096;
var real = new Float32Array(n);
var imag = new Float32Array(n);
var ac = new AudioContext();
var osc = ac.createOscillator();

/* Pick a wave pattern */

/* Sine 
imag[1] = 1; */

/* Sawtooth 
for(x=1;x<n;x++)
    imag[x] = 2.0 / (Math.pow(-1, x) * Math.PI * x); */

/* Square */
for(x=1;x<n;x+=2)
    imag[x] = 4.0 / (Math.PI * x);

var wave = ac.createPeriodicWave(real, imag);

osc.setPeriodicWave(wave);  
osc.connect(ac.destination);
osc.start();
osc.stop(2); /* Have it stop after 2 seconds */
Run Code Online (Sandbox Code Playgroud)

这将播放激活的模式,在本例中为方形模式。三角形公式会是什么样子?


rmc*_*lan 3

一种简单的伪造方法是向左通道和右通道添加单独的延迟节点,并为它们提供用户控制的延迟值。这将是我的方法,并且与阶段设置或多或少具有相同的效果。

如果您想使用createPeriodicWave,不幸的是您可能必须了解其背后有些困难的数学。

基本上,您首先必须将波形表示为正弦波“部分”的总和。所有周期波都有这种形式的某种表示。然后,一旦找到每个分音的相对幅度,您就必须通过将每个分音乘以一个复数来分别对左通道和右通道进行相移。您可以在此处阅读有关将周期波表示为正弦波之和的更多详细信息:http ://music.columbia.edu/cmc/musicandcomputers/chapter3/03_03.php

使用createPeriodicWave与使用 a 相比有一个显着的优点BufferSourceNodecreatePeriodicWave波形将自动避免混叠。如果您在缓冲区中“手动”生成波形,则很难避免混叠。