2017-02-26 100 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); 

正是我一直在尋找