Javascript Web音频api:如何从一开始就不断增加音量

Javascript Web音频api:如何从一开始就不断增加音量,javascript,web-audio-api,Javascript,Web Audio Api,为了不阻塞听众,我想播放一个wave,但音量不应该在早期以100%的比例播放,例如,在2秒钟的持续时间内,音量应该从0%到100% 我想到了一个setTimeout,我增加了增益,但我不知道是否还有其他更好的方法 var source = aCtx.createBufferSource(); source.buffer = buf; var gainNode = aCtx.createGain(); gainNode.gain.value = 0 sour

为了不阻塞听众,我想播放一个wave,但音量不应该在早期以100%的比例播放,例如,在2秒钟的持续时间内,音量应该从0%到100%

我想到了一个setTimeout,我增加了增益,但我不知道是否还有其他更好的方法

    var source = aCtx.createBufferSource();
    source.buffer = buf;
    var gainNode = aCtx.createGain();
    gainNode.gain.value = 0
    source.connect(gainNode);
    gainNode.connect(aCtx.destination);
    source.start(0);

setTimeout(function() {
     gainNode.gain.value = 0.5
}, 1000)

setTimeout(function() {
     gainNode.gain.value = 1
}, 2000)

Web音频API为此提供了一个解决方案

AudioParam.linearRampToValueAtTime(value, endTime)

一个浮点数,表示AudioParam在给定时间将渐变到的值

结束时间

一个双精度值,表示渐变开始后,值的更改将停止的确切时间(以秒为单位)


所以在你的情况下使用

gainNode.gain.linearRampToValueAtTime(0, 0)
gainNode.gain.linearRampToValueAtTime(1, 2)

Web音频API为此提供了一个解决方案

AudioParam.linearRampToValueAtTime(value, endTime)

一个浮点数,表示AudioParam在给定时间将渐变到的值

结束时间

一个双精度值,表示渐变开始后,值的更改将停止的确切时间(以秒为单位)


所以在你的情况下使用

gainNode.gain.linearRampToValueAtTime(0, 0)
gainNode.gain.linearRampToValueAtTime(1, 2)

通过简单地使用某种lerp函数使其成为动态的,有很多。基本思想是在两个起始值之间插入一个值。 例如:

值1=5

值2=1

插值量=0.4(40%)

那么结果应该正好是2.6

所说的函数可能就是这样的

Math.lerp = function (value1, value2, amount) {
    amount = amount < 0 ? 0 : amount;
    amount = amount > 1 ? 1 : amount;
    return value1 + (value2 - value1) * amount;
};
Math.lerp=函数(值1、值2、金额){
金额=金额<0?0:金额;
金额=金额>1?1:金额;
返回值1+(值2-值1)*金额;
};
在您的特定场景中,您可以将最小和最大体积作为这两个值,然后使用经过的时间调整量。可能是通过一些异步函数调用此函数。
希望我能帮上忙。

只需使用某种lerp函数,就可以使其动态化,还有很多。基本思想是在两个起始值之间插入一个值。 例如:

值1=5

值2=1

插值量=0.4(40%)

那么结果应该正好是2.6

所说的函数可能就是这样的

Math.lerp = function (value1, value2, amount) {
    amount = amount < 0 ? 0 : amount;
    amount = amount > 1 ? 1 : amount;
    return value1 + (value2 - value1) * amount;
};
Math.lerp=函数(值1、值2、金额){
金额=金额<0?0:金额;
金额=金额>1?1:金额;
返回值1+(值2-值1)*金额;
};
在您的特定场景中,您可以将最小和最大体积作为这两个值,然后使用经过的时间调整量。可能是通过一些异步函数调用此函数。
希望我能帮上忙。

你可能应该做两次以上。请注意,正如现在所写的,您的音频保持半秒的静音,然后爆炸到50%的增益。是的,我认为设置超时的循环取决于我正在修复的步骤是的,添加一些小增益,并重新安排放大,直到增益达到1.0(或略低于1.0)。您可能应该执行两次以上。请注意,正如现在所写的,您的音频保持半秒钟的静音,然后爆炸到50%的增益。是的,我认为设置超时的循环取决于我正在修复的步骤是的,添加一些小增益并重新安排放大,直到增益达到1.0(或略低于1.0)。谢谢,我不知道。但是gainNode.gain.linearrantovalueattime(1,2)在一开始就不适用于我,即使我使用了gainNode.gain.value=0。我必须添加gainNode.gain.setValueAtTime(0,audioCtx.currentTime);然后是链接中的gainNode.gain.LinearRamptoValueTime(1,audioCtx.currentTime+2)。再次感谢你,你救了我的命day@MehdiSouregi好的,谢谢,我自己不知道。谢谢,我不知道。但是gainNode.gain.linearrantovalueattime(1,2)在一开始就不适用于我,即使我使用了gainNode.gain.value=0。我必须添加gainNode.gain.setValueAtTime(0,audioCtx.currentTime);然后是链接中的gainNode.gain.LinearRamptoValueTime(1,audioCtx.currentTime+2)。再次感谢你,你救了我的命day@MehdiSouregi好的,谢谢,我自己也不知道。