声音淡出,但不会淡入 - 为什么?

时间:2015-03-18 16:38:31

标签: javascript audio web-audio

我想我理解Web Audio API的主要概念,以及声音如何正常工作。即使我设法发出声音"淡出" ,我也无法弄清楚,为什么它不是"渐渐消失" 在我编写的以下片段中代表问题:



(function ()
{
    'use strict';
    var context = new AudioContext(),
        wave = context.createOscillator(),
        gain = context.createGain(),
        ZERO = 0.000001;

    wave.connect(gain);
    gain.connect(context.destination);

    wave.type = 'sine';
    wave.frequency.value = 200;
    gain.gain.value = ZERO;

    wave.start(context.currentTime);

    gain.gain.exponentialRampToValueAtTime(1.00, 1.0);
    gain.gain.exponentialRampToValueAtTime(ZERO, 3.0);
})();




注意: 同样的问题也出现在Firefox(Linux)和Chrome(Windows)上

2 个答案:

答案 0 :(得分:4)

用以下代码替换gain.gain.value = ZERO

gain.gain.setValueAtTime(ZERO, 0);

将解决问题。

理由是exponentialRampToValueAtTime()函数的actual specification

  

将参数值的指数连续变化从先前的预定参数值计划到给定值

因此,如果没有先前的预定参数值(仅固定值),则该函数不能进行插值。这同样适用于linearRampToValueAtTime函数。

这也可能来自MDN documentation

  

AudioParam.value ...虽然可以设置,但是在安排自动化事件时发生的任何修改 - 即使用AudioParam方法调度的事件 - 都会被忽略,而不会引发任何异常

答案 1 :(得分:3)

你需要

gain.gain.setValueAtTime(ZERO, 0); 

因为只是设置

gain.gain.value = ZERO;

未在AudioParam调度程序中设置调度点 - 因此它从最后知道的调度点(在时间= 0时的默认值1)进行调度。混合设置。值和调度往往不能很好地工作;我已经有75%的文章写了很长一段时间,并且还没有发布它。