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

Ein*_*aas 6 javascript web-audio-api

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

这甚至可能吗?我看到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);
Run Code Online (Sandbox Code Playgroud)

Esa*_*ija 3

我发现自定义曲线工作更可靠并且更可控

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);
Run Code Online (Sandbox Code Playgroud)