【发布时间】:2016-11-12 15:42:39
【问题描述】:
我刚刚注意到,当没有连接振荡器或振荡器尚未启动时,似乎无法使用 setValueAtTime() 或 setValueCurveAtTime() 方法更改 gainNode 的 gain.value。
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。
【问题讨论】:
-
当我使用 API 时,我记得必须将振荡器连接到
gain.gain(osc.connect(gain.gain)),这可能与问题无关,而且我并不完全当然可以,但你可以试试。