Web Audio API增益节点包络生成器

时间:2013-04-07 12:03:25

标签: javascript html5 web-audio

我试图使用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 );
});

为什么会那样?什么是创建可由事件触发的包络生成器的最佳方法?

2 个答案:

答案 0 :(得分:2)

只需在click事件监听器中移动检索context.currentTime的行。

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

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

答案 1 :(得分: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/