如果您想这样做,请为每个振荡器添加一个增益节点,然后关闭和打开增益,而不是断开并重新连接。
这可能是导致您的点击和快照的原因。更多内容如下。
但是......这仍然有点过分,有 88 个振荡器。键盘执行此操作的标准方式是使用有限的复音。
创建一个由十个振荡器组成的阵列,所有振荡器都连接到自己的增益,每个增益都连接到目标。
跟踪按下了多少键,以及使用了多少个振荡器。
keysPressed = {}
// on key down
keysPressed["60"] = nextAvailableOsc()
在任何给定时间,都有十个振荡器准备就绪,每个手指一个。如果由于某种原因您需要更多,请动态添加它们。
咔哒声是因为您很难断开和重新连接正在运行的振荡器。在 osc 和目标之间使用增益节点,然后打开和关闭它。
此外,您可能会在硬更改值时获得点击,例如
gainNode.gain.value = 0
这可能会在声音流中产生故障。它应该是:
gainNode.gain.setValueAtTime(0, ctx.currentTime + 1)
也许+ 1是必要的。还有 setTargetAtTime 和 rampToAtTime 方法可以让事情变得更顺畅:
https://developer.mozilla.org/en-US/docs/Web/API/AudioParam