ConstantSourceNode

时间:2019-01-05 19:01:54

标签: javascript audio web-audio web-audio-api

我正在创建一个合成音色,其中包含三个振荡器,如下面的代码片段所示。

const ctx = new AudioContext();

const osc1 = ctx.createOscillator();
osc1.type = "sawtooth";
osc1.start();
const osc2 = ctx.createOscillator();
osc2.type = "sawtooth";
osc2.detune.setValueAtTime(1200, ctx.currentTime);
osc2.start();
const osc3 = ctx.createOscillator();
osc3.type = "sawtooth";
osc3.detune.setValueAtTime(1900, ctx.currentTime);
osc3.start();

const gain = ctx.createGain();
gain.gain.value = 0.2;
gain.connect(ctx.destination);

osc1.connect(gain);
osc2.connect(gain);
osc3.connect(gain);

osc1.frequency.value = 160;
osc2.frequency.value = 160;
osc3.frequency.value = 160;

要播放音乐,我想通过一个AudioParam控制所有振荡器的频率。我发现应该通过ConstantSourceNode完成。但是由于某种原因,它现在播放的频率不同于我设定的频率。

const ctx = new AudioContext();

const osc1 = ctx.createOscillator();
osc1.type = "sawtooth";
osc1.start();
const osc2 = ctx.createOscillator();
osc2.type = "sawtooth";
osc2.detune.setValueAtTime(1200, ctx.currentTime);
osc2.start();
const osc3 = ctx.createOscillator();
osc3.type = "sawtooth";
osc3.detune.setValueAtTime(1900, ctx.currentTime);
osc3.start();

const gain = ctx.createGain();
gain.gain.value = 0.2;
gain.connect(ctx.destination);

osc1.connect(gain);
osc2.connect(gain);
osc3.connect(gain);

const control = ctx.createConstantSource();
control.connect(osc1.frequency);
control.connect(osc2.frequency);
control.connect(osc3.frequency);
control.start();
control.offset.value = 160;

我注意到振荡器频率AudioParam和ConstantSource的偏移AudioParam的minValue和maxValue不同。它以某种方式缩放吗?我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

我认为问题在于,当您将AudioNode连接到AudioParam时,AudioNode的输出信号会与AudioParam的固有值混合在一起。

在您的特定示例中,这意味着实际频率将为600。“振荡器”的默认频率为440。这与来自ConstantSourceNode的值混合。

440 + 160 === 600

要获得理想的结果,可以将每个振荡器的值设置为零。

osc1.frequency.setValueAtTime(0, ctx.currentTime);
osc2.frequency.setValueAtTime(0, ctx.currentTime);
osc3.frequency.setValueAtTime(0, ctx.currentTime);

以下是说明此行为的规范部分的链接:https://webaudio.github.io/web-audio-api/#dom-audionode-connect-destinationparam-output

答案 1 :(得分:0)

OscillatorNode频率的默认值为440,但是您将默认偏移设置为160。