gpt4 book ai didi

javascript - 如何延迟 AudioParam 的更改

转载 作者:行者123 更新时间:2023-11-30 17:29:00 27 4
gpt4 key购买 nike

当尝试实现 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;
}

最佳答案

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

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

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

Start exponentially approaching the target value at the given time with a rate having the given time constant. Among other uses, this is useful for implementing the "decay" and "release" portions of an ADSR envelope.

这是用 timeConstant 计算的,它定义了斜坡到 1 - 1/e(大约 63.2%) 需要多少时间。像这样使用它

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

时间常数越大,转换越慢。我建议您尝试使用该值,看看适合您的情况。

关于javascript - 如何延迟 AudioParam 的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23585839/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com