2015-06-01 95 views
1

我一直在寻找Web Audio API,并且无法获得音频增益。我在这里设置了一个小提琴,所以你可以理解这个功能的应用:http://jsfiddle.net/mnu70gy3/Web Audio Api,设置增益

我希望能够在点击事件中动态创建一个音色,但是不能让那个音色淡出。下面是相关的代码:

var audioCtx = new AudioContext(); 
var osc = {}; // set up an object for all the oscillators 
var gainNodes = {}; // set up an object for all the gains 
var now; 
function tone(id,freq) { 

    // create osc/set gain/connect osc 
    gainNodes.id = audioCtx.createGain(); 
    osc.id = audioCtx.createOscillator(); 
    osc.id.connect(audioCtx.destination); 

    // set frequency 
    osc.id.frequency.value = freq; 

    // set gain at 1 and fade to 0 in one second 
    gainNodes.id.gain.value = 1.0; 
    gainNodes.id.gain.setValueAtTime(0, audioCtx.currentTime + 1); 

    // start and connect 
    osc.id.start(0); 
    osc.id.connect(audioCtx.destination); 
} 

任何想法,如果这可以做?

+0

你见过[这](http://jsfiddle.net/JCTJj/19/)?还包括关于如何使用滑块进行调整的代码(以及已发表的评论)。 – lalengua

回答

2

在您的代码中,您将振荡器连接到destination两次。 而不是连接oscillator -> gain -> destination

gainNodes.id = audioCtx.createGain(); 
osc.id = audioCtx.createOscillator(); 
osc.id.connect(gainNodes.id); 

// set frequency and gain 
osc.id.frequency.value = freq; 
gainNodes.id.gain.value = 1.0; 
gainNodes.id.gain.setValueAtTime(0, audioCtx.currentTime + 1); 

// start and connect 
osc.id.start(0); 
gainNodes.id.connect(audioCtx.destination); 
1

的你需要断开audioCtx.destination当你在瓦片上,再次单击。

https://jsfiddle.net/2dyq2ajw/

function dismissTone(id,freq) { 
    gainNodes.id.gain.value = 0; 
    osc.id.disconnect(audioCtx.destination); 
} 

    if($(this).hasClass('xx')) 
     tone(thisId,thisFreq); 
    else 
     dismissTone(thisId,thisFreq);