2013-04-07 69 views
0

林試圖讓使用上gainNode自動化我振盪器的包絡發生器,我希望能夠觸發每當一個事件發生(在這種情況下,點擊按鈕)的信封。網絡音頻API增益節點包絡發生器

但好像它的工作只是我第一次點擊。 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); 
}); 

爲什麼會這樣呢?什麼是創建可以由事件觸發包絡發生器的最佳方式?

回答

1

找到了解決辦法。 但考慮到振盪器始終是,應該有它的每一個觸發時間(相抨擊)重置振盪器的相位的方式。

$(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/

2

只是招行檢索context.currentTime click事件監聽器裏。

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

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