簡體   English   中英

Web Audio API增益節點包絡生成器

[英]Web Audio API Gain node envelope generators

我試圖使用gainNode上的自動化方法為振盪器制作一個包絡發生器,我希望能夠在事件發生時觸發包絡(在這種情況下,單擊按鈕)。

但這似乎僅在我第一次單擊時起作用。 http://jsfiddle.net/ehsanziya/T9mV2/

var context = new webkitAudioContext();
var osc = context.createOscillator();
var gain = context.createGainNode();
var now = context.currentTime;

osc.frequency.value = 100;
osc.type = "sine";
osc.connect(gain);
osc.noteOn(0);

gain.connect(context.destination);
gain.gain.value = 0;


var trigger = document.getElementById('play');

trigger.addEventListener('click', function(){
  gain.gain.setValueAtTime(gain.gain.value, now);
  gain.gain.linearRampToValueAtTime( 1.0, now + 2.0 );
  gain.gain.linearRampToValueAtTime ( 0.0, now + 4.0 );
});

為什么會這樣呢? 創建事件觸發的包絡發生器的最佳方法是什么?

只需將獲取context.currentTime的行移動到click事件監聽器中即可。

trigger.addEventListener('click', function(){
  var now = context.currentTime;
  ...

currentTime屬性公開音頻時鍾,因此會實時更新。

找到了解決方案。 但是,鑒於振盪器始終處於打開狀態,應該有一種方法可以在每次觸發振盪器時重置其相位(相位重擊)。

$(document).ready(function(){

var context = new webkitAudioContext();
var osc = context.createOscillator();
var gain = context.createGain();

osc.connect(gain);
gain.connect(context.destination);
osc.start(0);

gain.gain.value = 0;

var oscStart = function(){
var now = context.currentTime;
gain.gain.cancelScheduledValues( now );
gain.gain.setValueAtTime(gain.gain.value, now);
gain.gain.linearRampToValueAtTime(1 , now + 0.2);
};

var oscOff = function(){
var now = context.currentTime;
gain.gain.cancelScheduledValues( now );
gain.gain.setValueAtTime(gain.gain.value, now);
gain.gain.linearRampToValueAtTime(0 , now + 0.2);


};

$('#button').hover(oscStart , oscOff);


});

http://jsfiddle.net/ehsanziya/JJqNU/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM