网络音频API增益节点包络发生器

问题描述:

林试图让使用上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); 
}); 

为什么会这样呢?什么是创建可以由事件触发包络发生器的最佳方式?

找到了解决办法。 但考虑到振荡器始终是,应该有它的每一个触发时间(相抨击)重置振荡器的相位的方式。

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

只是招行检索context.currentTime click事件监听器里。

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

currentTime属性公开音频时钟,因此会实时更新。