2017-02-26 92 views
0

试图为小型Web音频应用程序发送延迟效果,并且似乎无法使其听起来不错。似乎很简单,但没有得到我想要的结果。希望延迟音符反复重复并慢慢消失。我可以实现增益部分,但似乎无法获得反馈环路部分,因此延迟仍在继续。有人能指引我朝着正确的方向吗?Web音频延迟节点指南

下面是相关的代码。增加了第二次延期,希望延期但并不完全符合我的期望。

  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); 
     } 

谢谢!

回答

0

我没有尝试了这一点,但在addDelay === true情况下,也许你要删除这条线: gainNode.connect(ctx.destination); 我也不知道为什么你有 gainNode.connect(delay); gainNode.connect(delay2); 您的意思是级联的两个延迟节点连接在一起?如果你这样做了,你可以只用一个延迟时间更长的延迟节点。

下面是一个小例子,似乎工作:https://jsfiddle.net/n6782bpf/不知道这是你想要的。

+0

感谢雷蒙,是的,我是试着增加两次延迟,看看是否会增加结果,我今天晚上会和你一起玩,并且告诉你结果,再次感谢 – Fedreg

+0

能够尝试一下,我想我没有说清楚原来的帖子,但我正在寻找的是一个延迟,将继续响几次而不只是一次,换句话说,比如说我玩了十六分钟的音符。我很乐意听到这张音符几次播放,每次.25s左右,直到它最终消失。希望是有道理的!我需要做些什么来实现这种延迟?谢谢! – Fedreg

1

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

var ctx = new AudioContext(); 

变种audioElement = $( '#反馈音频')[0];

audioElement.addEventListener( '玩',函数(){ VAR源= 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); 

正是我一直在寻找