如何正确取消Web Audio API中当前正在更改的AudioParam

时间:2016-01-09 14:21:43

标签: javascript web-audio

我正在尝试实现可以​​在任何给定时刻重新启动的音量包络,即使它已经处于参数运动的中间但我无法弄清楚如何在没有点击结果音频的情况下执行此操作(其中关于它们何时出现,似乎有些不规则。)

这甚至可能吗?我看到AudioParam.cancelScheduledValues() “取消了对AudioParam的所有预定的未来更改”,但我不确定当前正在进行的更改会发生什么。

这是我用来启动/重启音量信封的代码。

var now = context.currentTime;
var currentVol = gain.gain.value;
gain.gain.cancelScheduledValues(now);
gain.gain.setValueAtTime(currentVol, now);
gain.gain.exponentialRampToValueAtTime(1, now + volAttack);
gain.gain.exponentialRampToValueAtTime(0.000001, now + volAttack + volDecay);

3 个答案:

答案 0 :(得分:2)

我发现自定义曲线更可靠,更可控

function expCurve(start, end) {
    var count = 10;
    var t = 0;
    var curve = new Float32Array(count + 1);
    start = Math.max(start, 0.0000001);
    end = Math.max(end, 0.0000001);
    for (var i = 0; i <= count; ++i) {
        curve[i] = start * Math.pow(end / start, t);
        t += 1/count;
    }
    return curve;
}


gain.gain.cancelScheduledValues(0);
var currentVol = gain.gain.value;
var now = context.currentTime;
gain.gain.setValueCurveAtTime(expCurve(currentVol, 1), now, volAttack);
gain.gain.setValueCurveAtTime(expCurve(1, 0), now + volAttack, volDecay);

答案 1 :(得分:2)

在询问松弛的网络音频频道后,他们向我解释说这是当前规范的已知问题。

以下是GitHub上问题的链接:https://github.com/WebAudio/web-audio-api/issues/344

所以简短的回答是目前不支持中途停止斜坡。因此,作为一种解决方法,必须在每个细分受控制。

答案 2 :(得分:1)

我相信您可能正在寻找 cancelAndHoldAtTime() 。根据MDN:

  

AudioParam接口的cancelAndHoldAtTime()属性取消对AudioParam的所有预定的未来更改,但在给定时间保持其值,直到使用其他方法进行进一步更改。

在进行进一步更改之前保留值的附加功能似乎正是您所寻找的。我现在正在使用网络音频API创建一个振幅包络,它似乎正在工作。

注意:截至2018年3月,此功能似乎只在Chrome中实现。请参阅MDN上的兼容性表以获取更新。