网络音频:在振荡器启动之前更改增益值
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.
检查值
我刚刚注意到,当没有连接振荡器或当振荡器还没有开始。
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.