gpt4 book ai didi

javascript - 网络音频启动和停止振荡器然后再次启动它

转载 作者:数据小太阳 更新时间:2023-10-29 04:10:46 25 4
gpt4 key购买 nike

我正在尝试开始和停止声音。那行得通。但是我无法再次启动声音。

我真的必须再做一个振荡器吗?这看起来非常不直观。一定有更好的方法。

这就是我所有的工作:

oscillator1.noteOn(0);
oscillator1.noteOff(0);

再次调用 noteOn 没有任何作用。为什么?超出我的范围。

我还尝试将音量设置为零,或者在网络音频人员的上下文中,“增益”。但出于某种原因,零增益会发出声音。什么增益值不会发出任何声音?

伙计,我简直不敢相信这是多么困难:/

最佳答案

实际上,是的,您必须创建一个新的振荡器节点。 API 被设计和优化以使用该模式。

Taoist 代码中的断开连接模式基本上是一种创建新振荡器的复杂方法(每次运行 oscOn 时都会这样做)。它从未在断开连接的旧振荡器上显式调用 noteOff,因此它可能仍在后台运行(不确定网络音频如何处理此问题),但由于它与音频链断开连接而听不见。因此,它可能会在后台堆叠正在运行并耗尽 CPU 的振荡器。

这是相同的代码,但正确使用了 noteOff()。 http://codepen.io/Theodeus/pen/afgqk

这是相同的代码,但使用增益节点来控制振荡器,因此始终只使用相同的振荡器(尽管不推荐这样做,最好为每个音符创建一个新的振荡器,我认为) http://codepen.io/Theodeus/pen/aKFje

2015 年 4 月编辑
由于代码示例似乎在网络空间中丢失了,这里是我写的关于振荡器的教程,其中包含显示振荡器一次性特性的代码示例。它与上面引用的代码并不完全相同,但它显示了相同的概念。 http://codepen.io/Theodeus/blog/web-audio-synth-part-1-generating-sound - 它的要点是这样的:

//This won't work. Can't call play twice.
var context = new AudioContext(),
oscillator = context.createOscillator();

oscillator.connect(context.destination);
oscillator.start(context.currentTime);
oscillator.stop(context.currentTime + 0.5);
oscillator.start(context.currentTime + 1);
oscillator.stop(context.currentTime + 1.5);


//this will work!
var context = new AudioContext(),
oscillator;

function playOscillator(startTime, endTime) {
oscillator = context.createOscillator();
oscillator.connect(context.destination);
oscillator.start(startTime);
oscillator.stop(endTime);
}

playOscillator(context.currentTime, context.currentTime + 0.5);
playOscillator(context.currentTime + 1, context.currentTime + 1.5);

关于javascript - 网络音频启动和停止振荡器然后再次启动它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15261030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com