为什么js振荡器在使用后停止播放声音?

时间:2020-08-14 21:19:06

标签: javascript google-chrome audio

我正在尝试用js制作一架简单的钢琴,但是我不想使用音频样本,而是想以编程方式生成声音。要播放单一声音,我正在使用此博客https://marcgg.com/blog/2016/11/01/javascript-audio/

中的代码
var context = new AudioContext()
var o = context.createOscillator()
var  g = context.createGain()
o.connect(g)
g.connect(context.destination)
o.start(0)
g.gain.exponentialRampToValueAtTime(0.00001, context.currentTime + 5)

我发现,播放超过50次后,此方法停止工作。运行此代码时没有声音播放,context.currentTime不变且保持为0。如何在不停止已经播放声音的情况下进行修复?

1 个答案:

答案 0 :(得分:1)

不要为每个笔记创建新的AudioContext;创建一个并将其用于所有这些对象。这样不仅可以节省资源;如果您决定要在正确的时间播放多个音符,这也将有所帮助。

您还正在累积仍然非常安静的振荡器。您需要有时停止它们。好消息是,Web Audio API设计为make it easy to do this:

// stop after 5 seconds from now
o.stop(context.currentTime + 5);