网络音频:在振荡器启动之前更改增益值

Web Audio: Change gain value before oscillator starts

我刚刚注意到,当没有连接振荡器或当振荡器还没有开始。

setValueAtTime 之后振荡器开始

例如在这种情况下,setValueAtTime 将按预期工作:

var context = new AudioContext();

var gain = context.createGain();
gain.connect(context.destination);

var osc = context.createOscillator();
osc.frequency.value = 300;
osc.connect(gain);

osc.start();

gain.gain.setValueAtTime(0, context.currentTime + 1);

振荡器启动,增益1持续1秒。然后gain.gain.value会移动到0.

setValueAtTime 振荡器开始之前

但是如果我们在振荡器启动前用setValueAtTime设置增益

var context = new AudioContext();

var gain = context.createGain();
gain.connect(context.destination);

var osc = context.createOscillator();
osc.frequency.value = 300;
osc.connect(gain);

osc.start(context.currentTime + 1);

gain.gain.setValueAtTime(0, context.currentTime);

gain.gain.value 将保持为 1。

设置gain.gain.value没有setValueAtTime

奇怪的是如果我们直接设置增益就看不到这种行为

var context = new AudioContext();

var gain = context.createGain();
gain.connect(context.destination);

var osc = context.createOscillator();
osc.frequency.value = 300;
osc.connect(gain);

osc.start(context.currentTime + 1);

gain.gain.value = 0;

增益值永远为0。

AudioParam.value 不是计算值 - 也就是说,它不会告诉您增益的当前值 IS,只是 AudioParam.value 最后设置为。 (参见 https://webaudio.github.io/web-audio-api/#widl-AudioParam-value)。如果您想知道 AudioParam 的当前值到底是多少,您需要将其路由到音频节点并收集数据(例如,通过脚本处理器)。在你的第一个例子中,我认为 gain.gain.value 不应该为 0.

AudioParam 在任何给定时间点的实际值不仅会受到调度程序和 .value 的影响,还会受到连接到 AudioParam 的节点的影响;不断计算这些值并将它们移植回 AudioParam 会很昂贵。

如果您使用的是 Chrome,那么这可能是 bug in Chrome。 Chrome 实际上 returns getter 中的计算值,但如果节点没有输入但仍连接到目的地,则 AudioParam 自动化不是 运行.它们应该是,并且可以使用 .value getter.

检查值