Web音频API:如何使所有振荡器静音并暂停旋律

时间:2014-04-11 15:11:38

标签: javascript web audio web-audio

我为每个演奏的音符制作一个新振荡器。

function playSound(freq, duration) { 
    var attack = 5,
        decay = duration,
        gain = context.createGain(), 
        osc = context.createOscillator(); 

    gain.connect(context.destination); 
    gain.gain.setValueAtTime(0, context.currentTime);
    gain.gain.linearRampToValueAtTime(0.1, context.currentTime + attack / 1000);
    gain.gain.linearRampToValueAtTime(0, context.currentTime + decay / 1000);

    osc.frequency.value = freq;
    osc.type = "sine";
    osc.connect(gain); 
    osc.start(0);

    setTimeout(function() { 
        osc.stop(0);
        osc.disconnect(gain);
        gain.disconnect(context.destination);
    }, decay)
}

旋律在for循环中播放,其中调用了playSound。当我单击暂停按钮时,我想要使旋律静音并暂停for循环,这样如果我再次单击播放按钮,则会重新开始旋律。如何访问所有当前振荡器以断开它们?

2 个答案:

答案 0 :(得分:4)

你不能在这段代码中。

1)根据设计,Web Audio API中没有对节点图的内省 - 它可以优化垃圾收集,并优化大量节点。两种可能的解决方案 - 要么维护播放振荡器列表,要么将它们全部连接到单个增益节点(即,将它们的包络增益节点连接到"混合器"增益节点),然后断开连接(并释放参考)获得节点。

2)不确定你的意思"暂停for循环" - 我假设你有一个围绕游戏音符方法的for循环?

答案 1 :(得分:0)

您可以suspend音频上下文。

const audioCtx = new AudioContext();
audioCtx.suspend();
audioCtx.resume();