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

时间:2016-11-12 15:42:40

标签: javascript web-audio

我刚注意到,当没有连接振荡器或振荡器时,似乎无法使用方法doc.select("table").forEach((e) -> { System.out.println(e.text()); }); gain.value更改gainNode的{​​{1}}尚未开始。

振荡器启动后

setValueAtTime()

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

setValueAtTime

振荡器启动,增益为setValueAtTime 1秒钟。然后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

振荡器启动之前

gain.gain.value

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

setValueAtTime

setValueAtTime将保持为1。

设置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

奇怪的是,如果我们直接设置增益,就不会出现这种行为

gain.gain.value

增益值将始终保持为0.

2 个答案:

答案 0 :(得分:1)

如果你正在使用Chrome,那么这可能是bug in Chrome。 Chrome实际上会在getter中返回计算值,但如果某个节点没有输入但仍连接到目标,则不会运行AudioParam自动化。它们应该是,并且可以使用.value getter检查值。

答案 1 :(得分:0)

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

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