Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AudioParam';让我们推迟改变吧_Javascript_Web Audio Api - Fatal编程技术网

Javascript AudioParam';让我们推迟改变吧

Javascript AudioParam';让我们推迟改变吧,javascript,web-audio-api,Javascript,Web Audio Api,当试图实现一个ADSR信封时,它很容易实现ADS攻击、衰减和维持,因为所有这些值的时间是同时已知的。然而,如果试图实现这个信封的发布部分,我会遇到麻烦 问题是,我已经记下和记下了提前安排的事件。然而,AudioParams.linearranpovalueattime只接受两个参数—渐变应该结束的时间和它应该结束的值 那么,如何产生一个在特定时间开始的斜坡呢 /** * @param attack {int} * @param decay {int} * @param sustain {n

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

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

那么,如何产生一个在特定时间开始的斜坡呢

/**
 * @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);
如果您正在寻找某个斜坡,同时牢记当前值(斜坡时间取决于当前值与给定目标值之间的差异),我建议您使用
setTargetTime
系统。这应该是有用的,因为提到它在您的情况下非常有用:

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

它使用一个时间常数进行计算,该常数定义了渐变到
1-1/e(约63.2%)所需的时间。

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

时间常数越高,过渡越慢。我建议您考虑一下该值,看看什么适合您的情况。

问题是我需要知道该值应该是什么。想象一下,音符比攻击+延迟时间短。然后,释放应仅从参数的当前值起作用(在这种情况下为增益)。也就是说,体积应该是一条平滑的曲线。你是说1的值吗<代码>音频参数值我来试试。我想知道取消计划值A是否保留当前值,B是否在以后计划新值。根据规范,在给定时间后取消所有计划值。我必须测试它,但我认为如果坡道在给定时间之前启动,它就会继续前进。@Wes你的问题现在解决了吗?正如您可能知道的,SO系统基于接受答案的提问者工作,因此遇到相同答案的其他用户可以很容易地看到答案是否解决了问题,或者他们最好继续寻找其他地方。如果问题没有解决,请发表评论,询问更多信息/解释。