audioparam&# 39;s更改如何延迟?

How can an AudioParam's change be delayed

本文关键字:何延迟 延迟 audioparam      更新时间:2023-09-26

当尝试实现ADSR信封时,很容易实现ADS攻击,衰减和维持,因为所有这些值的时间都是同时已知的。然而,如果试图实现这个信封的释放部分,我遇到了麻烦。

问题是我已经记下了提前安排的事件。然而AudioParams。然而,linearRampToValueAtTime只接受两个参数:斜坡应该结束的时间和它应该结束的值。

如何产生一个在特定时间开始的斜坡?

/**
 * @param attack {int}
 * @param decay {int}
 * @param sustain {number} 0-100 percentage of overall level
 * @param release {int} time for volume to reach 0
 */
 function ADSR(attack, decay, sustain, release) {
    this.attack  = attack;
    this.decay   = decay;
    this.sustain = sustain;
    this.release = release;
    function applyTo(audioParam, time) {
        audioParam.linearRampToValueAtTime(1, time+attack);
        audioParam.linearRampToValueAtTime(this.sustain/100, time+attack+decay);
    }
    this.applyTo = applyTo;
    function applyRelease(audioParam, time, audioNode) {
        // here I want to apply the release starting at the time given
        // ending at time + this.time
    } 
    return time;
}

根据规范事件是按顺序计算的,因此如果您在rampToValueAtTime之前安排了setValueAtTime,则坡道将在此之后计算:

audioParam.setValueAtTime(audioParam.value, time);
audioParam.linearRampToValueAtTime(0, time+this.time);

如果你正在寻找的东西,斜坡,同时保持当前值(时间斜坡取决于当前值和给定的目标值之间的差异),我建议你使用setTargetAtTime系统。这应该是有用的,正如规范中提到的,例如在您的情况下它是有用的:

在给定时间以给定时间常数的速率开始指数接近目标值。在其他用途中,这对于实现ADSR信封的"衰减"answers"释放"部分很有用。

它使用一个timeConstant来计算,它定义了应该花费多少时间才能上升到1 - 1/e (around 63.2%)

audioParam.setTargetAtTime(<target_value>, <start_Time>, <timeConstant>);

时间常数越大,跃迁越慢。我建议您尝试一下这个值,看看适合您的情况。