Web Audio-停止振荡器声音

Web Audio-Stopping Oscillator Sound

正在尝试创建脉冲音调。从此处的另一篇文章 () 中找到了一些帮助。需要改编剧本。得出了一个令人满意的结果,即播放并发出一个音调。无法找出停止音调的函数:与振荡器一起使用的 .stop() 不起作用。

感谢任何帮助。

这是我的代码:

<html>
<body>
<button id = "start1" onclick='tone();'>Play</button>
<button id = "stop1" onclick='stopper();'>Stop</button>
<script>
function tone(){
var context = new AudioContext();
var abc = context.createOscillator();
abc.frequency.value = 325;
var xyz = context.createOscillator();
xyz.type='sine';
xyz.frequency.value = 10;
var gain = context.createGain();
var ramp = context.createGain();
abc.connect(gain);
gain.connect(context.destination);
xyz.connect(ramp); 
ramp.gain.value = 0.3;
gain.gain.value = 0.3;
ramp.connect(gain.gain);
abc.start(0);
xyz.start(0);
}
function stopper()
{
abc.stop();
xyz.stop();
}
</script>
</body>
</html>

移动评论回答:

A​​udioAPI 不是问题,这是一个简单的变量范围问题。

函数中创建的变量在该函数外不可访问,并且 stopper() 函数无法访问 abc/xyz 变量。

<html>
<body>
<button id = "start1" onclick='tone();'>Play</button>
<button id = "stop1" onclick='stopper();'>Stop</button>
<script>
let context = null;
let abc, xyz;

function tone(){
    context = new AudioContext();
    abc = context.createOscillator();
    abc.frequency.value = 325;
    xyz = context.createOscillator();
    xyz.type='sine';
    xyz.frequency.value = 10;
    var gain = context.createGain();
    var ramp = context.createGain();
    abc.connect(gain);
    gain.connect(context.destination);
    xyz.connect(ramp); 
    ramp.gain.value = 0.3;
    gain.gain.value = 0.3;
    ramp.connect(gain.gain);
    abc.start(0);
    xyz.start(0);
}
function stopper()
{
    abc?.stop();
    xyz?.stop();
}
</script>
</body>
</html>