Web音频延迟节点指南

时间:2017-02-26 18:49:53

标签: javascript web-audio

尝试连接一个小的Web Audio应用程序的延迟效果,似乎无法让它听起来不错。看起来很简单,但没有得到我想要的结果。希望延迟说明一遍又一遍地重复,慢慢消失。我可以实现其中的增益部分,但似乎无法获得反馈回路部分,因此延迟继续。有人能指出我正确的方向吗?

这是相关代码。增加了第二次延迟,希望延伸但不完全是我想要的。

            var osc = ctx.createOscillator();
            var gainNode = ctx.createGain();

            if (addDelay === false) {
                osc.connect(gainNode);
                gainNode.connect(ctx.destination);
            }

            else if (addDelay === true) {
                var delay = ctx.createDelay();
                var delay2 = ctx.createDelay();
                delay.delayTime.value = 0.35;
                delay2.delayTime.value = 0.5;
                osc.connect(gainNode);
                gainNode.connect(ctx.destination);
                gainNode.connect(delay);
                gainNode.connect(delay2);
                delay.connect(gainNode);
                delay2.connect(gainNode);
                delay.connect(ctx.destination);
                delay2.connect(ctx.destination);        
            }
            gainNode.gain.value = 0.0;
            gainNode.gain.setTargetAtTime(0.75, ctx.currentTime, 0.1);
            gainNode.gain.setTargetAtTime(0.0, ctx.currentTime + sustainFnl, 0.01);
            osc.frequency.value = hz * octave / 4;
            osc.type = waveType;
            osc.start();
            osc.stop(ctx.currentTime + sustainFnl + 0.01);
        }

谢谢!

2 个答案:

答案 0 :(得分:1)

Chris Lowis在本文中找到了答案:http://blog.chrislowis.co.uk/2014/07/23/dub-delay-web-audio-api.html

var ctx = new AudioContext();

var audioElement = $(' #feedback audio')[0];

audioElement.addEventListener(' play',function(){     var source = ctx.createMediaElementSource(audioElement);

var delay = ctx.createDelay();
delay.delayTime.value = 0.5;

var feedback = ctx.createGain();
feedback.gain.value = 0.8;

delay.connect(feedback);
feedback.connect(delay);

source.connect(delay);
source.connect(ctx.destination);
delay.connect(ctx.destination);

正是我在寻找的东西。

答案 1 :(得分:0)

我没试过,但在addDelay === true的情况下,也许你想要删除这一行: gainNode.connect(ctx.destination); 我也不确定你为什么这么做 gainNode.connect(delay); gainNode.connect(delay2); 你的意思是将两个延迟节点级联在一起吗?如果你这样做,你可以使用延迟时间较长的延迟节点。

以下是一个似乎有用的小例子:https://jsfiddle.net/n6782bpf/不确定这是否是你想要的。