【问题标题】:Web Audio: Change gain value before oscillator starts网络音频:在振荡器启动之前更改增益值
【发布时间】:2016-11-12 15:42:39
【问题描述】:

我刚刚注意到,当没有连接振荡器或振荡器尚未启动时,似乎无法使用 setValueAtTime()setValueCurveAtTime() 方法更改 gainNodegain.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)),这可能与问题无关,而且我并不完全当然可以,但你可以试试。

标签: javascript web-audio-api


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回答!有趣的是,我认为.value 实际上对应于当前值。但是如何在连接之前或振荡器开始之前(如果可能的话)更改增益节点的值?
    • 另一方面,参见github.com/WebAudio/web-audio-api/issues/…,它基本上说它应该返回计算值。而且由于规范还说 .value 设置器与 setValueAtTime 相同,因此如果它不是计算值,您将永远无法检查该值。
    • 好吧,你告诉我——你现在是编辑了。 :) 但规范准确地说:“设置此属性的效果等同于使用当前 AudioContext 的 currentTime 和请求的值调用 setValueAtTime()。随后访问此属性的 getter 将返回相同的值。”这只是意味着一组 .value 必须与 setValueAtTime 具有相同的效果,并且如果您设置了 value,它将返回该值(不是后续的 setValueAtTime,或斜坡的结果)。它从不说“这是计算值”,并且该问题已被搁置到 v2。 :(
    • 嗯。我认为我们的意图是 getter 返回计算值(就像 Chrome 今天所做的那样),并且 getValueAtTime 被踢到 v2。但是,是的,这需要澄清。如果参数是自动化的,让 getter 返回 setter 的值并不是很有用。
    猜你喜欢
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多