使用 Oscillator.connect() 和 Oscillator.disconnect() 方法在使用 Web Audio API 构建的应用程序中打开/关闭声音有多可行?

2024-02-17

我一直在尝试使用 Web Audio API 创建 88 键钢琴。计划是首先以适当的频率运行所有 88 个振荡器,然后使用Oscillator.connect() and Oscillator.disconnect()按下和释放钢琴键时相应振荡器上的方法。的状态AudioContext将 ”running“一直以来。现在,我有两个问题,

  1. 这是正确的做法吗?
  2. 当我播放声音时,我会在声音的开始和结束处听到咔嗒声。为什么会发生这种情况以及如何摆脱它?

PS:制作这样一架钢琴的原因是为了让自己沉浸在从头开始创作的乐趣中。因此,使用预先录制的声音不是一个选择。


如果您想这样做,请向每个振荡器添加一个增益节点,然后关闭然后打开增益,而不是断开连接并重新连接。

这可能就是导致您点击和咔嗒声的原因。更多内容见下文。

但是...这仍然相当过大,有 88 个振荡器。键盘执行此操作的标准方式是使用有限的复调。

创建一个由十个振荡器组成的数组,所有振荡器都连接到自己的增益,每个增益都连接到目标。

跟踪按下了多少个按键,以及使用了多少个振荡器。

keysPressed = {}

// on key down
keysPressed["60"] = nextAvailableOsc()

在任何给定时间,都有十个振荡器准备就绪,每个手指一个。如果由于某种原因您需要更多,请动态添加它们。


发出咔嗒声是因为您很难断开和重新连接正在运行的振荡器。在振荡器和目标之间使用增益节点,然后打开和关闭它。

此外,在硬更改值时,您可能会获得点击,例如

gainNode.gain.value = 0

这可能会在声音流中产生故障。它应该是:

gainNode.gain.setValueAtTime(0, ctx.currentTime + 1)

也许+1是必要的。还有 setTargetAtTime 和 RamToAtTime 方法,可以让事情变得更加顺利:

https://developer.mozilla.org/en-US/docs/Web/API/AudioParam https://developer.mozilla.org/en-US/docs/Web/API/AudioParam

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Oscillator.connect() 和 Oscillator.disconnect() 方法在使用 Web Audio API 构建的应用程序中打开/关闭声音有多可行? 的相关文章

随机推荐