Javascript audioParam.ExponentialRamptoValueTime是如何工作的?

Javascript audioParam.ExponentialRamptoValueTime是如何工作的?,javascript,web-audio-api,Javascript,Web Audio Api,我无法通过增益节点的指数RamptoValueAtime获得体积的滑动变化 以下是一个例子: var context = new AudioContext(), osc = context.createOscillator(), gain = context.createGain(); osc.frequency.value = 440; // A note osc.start( 0 ); osc.connect( gain ); gain.gain.value = 0; g

我无法通过增益节点的指数RamptoValueAtime获得体积的滑动变化

以下是一个例子:

var context = new AudioContext(),
    osc = context.createOscillator(),
    gain = context.createGain();

osc.frequency.value = 440; // A note
osc.start( 0 );
osc.connect( gain );

gain.gain.value = 0;
gain.connect( context.destination );

gain.gain.cancelScheduledValues( 0 );
gain.gain.setValueAtTime( 0, context.currentTime );
gain.gain.exponentialRampToValueAtTime( 1, context.currentTime + 2 );
据我所知,这将逐渐增加容量,直到达到1(100%),整个过程需要2秒。这个假设正确吗

如果是,为什么在0上停留2秒,然后突然切换到满音量


提前感谢您的时间和努力。

此函数似乎不喜欢0值。FF抛出“SyntaxError:指定了无效或非法的字符串”。下面的代码将正确渐变。再见

var context=new AudioContext(),
osc=context.create振荡器(),
gain=context.createGain();
osc.frequency.value=440.0;//便条
osc.start(0);
osc.连接(增益);
连接(context.destination);

gain.gain.setValueAtTime(0.0001,context.currentTime);// 假设该值必须为正值。

您是否尝试过
线性RAMPTOVALUEATTIME
?我尝试过,而且效果很好,但我听说线性效果不如指数斜率,所以我想尝试一下。我正在写一个信封生成器,我想测试一些选项。我想这就是它应该如何工作的。快速爬升。“注意:由于人耳的工作方式,在改变频率或播放速率时,指数爬升被认为比线性爬升更有用。”即使我设置了15秒,也不会出现滑动-时间过后只会转到gain.gain.value==1。这不是故意的。如果是,指数RamptoValueAttime和setValueAtTime之间有什么区别?你完全正确。谢谢但这不是一个错误吗?我想,可能有一些乘法从初始值开始,这就是为什么直到最后一步它都是0。由于函数的速度是指数级的,当它稍微接近(不易察觉)时,他们可能只是设置了所提供的值(幻灯片的方向)。我认为这就是问题所在:这在Webkit中,但在Blink中是相同的。这不是一个bug;规范中明确规定,“如果此值小于或等于0,或者如果上一个事件发生时的值小于或等于0,则必须引发NotSupportedError异常。”(from)@cwilso感谢您的澄清。尽管如此,Chrome和Safari中并没有抛出错误,Firefox抛出了“非法字符串错误”,这使得它非常混乱。现在有一个bug文件:crbug.com/480606.:)谢谢,但这并不是一个单独的答案。这对于FF的实现是正确的,而不是webkit和Blink。还有“非法字符串错误”。。。这看起来像是一个“有文档记录的bug”,并提供了解决方法。:)虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,只有链接的答案可能会无效。@MZaragoza:但它们确实包含了此处的关键部分。
var context = new AudioContext(),
    osc = context.createOscillator(),
    gain = context.createGain();

osc.frequency.value = 440.0; // A note
osc.start( 0 );
osc.connect( gain );

gain.connect( context.destination );

gain.gain.setValueAtTime(0.0001, context.currentTime); // <-- line of interest

gain.gain.exponentialRampToValueAtTime(1, context.currentTime + 10 );