我从事 Tone.js 合成器项目已经有一段时间了。
作为记录,我将包括链接: 回购 部署 (它仍在开发中,因为我遇到了这个问题)
我遇到了一个我无法解决的严重问题。我将 PolySynth 与 FMSynth 一起使用,但我尝试过的所有其他合成器类型都遇到了同样的问题。
每当我尝试实时调整合成器的参数时(例如失谐、调制指数、幅度包络等),我都会得到意想不到的行为:
大多数情况下,当我更改参数的值时,它会立即起作用,因此声音会根据我所做的更改进行修改,但即使我不断更改值,声音也会停留在第一个修改后的值上的参数。
然后有时我每在合成器上演奏一个音符时就会得到修改后的声音。一次我得到修改后的声音,然后下一次得到没有任何修改的原始声音,然后再次获得修改后的声音,依此类推。
有时它可以工作,但我仍然坚持第一次修改。
有时它会在先弹奏一些音符后随机工作。
有时它会立即起作用,但随后一些特定的音符会产生未经修改的原始声音,而不管我的修改如何(并且合成器仍然停止响应任何进一步的参数更改)。
除了volume:volume每次都按预期工作时,每个参数都会发生这种情况。
让我们以调制指数为例(失谐、谐波和起音也是如此——这些是我暂时实现的参数)。最初,我使用 NexusUI 组件,但为此我将使用常规的 HTML 滑块(以证明 NexusUI 不是问题)。它可以在我提供的部署网站和 repo 中找到。这是我的代码:
在主 JavaScript 文件中,我创建了合成器并将其发送到目的地:
const synth = new Tone.PolySynth(Tone.FMSynth).toDestination();
在 HTML 文件中,我创建了一个简单的滑块:
<input type="range" min="0" max="300" value="0" class="slider" id="mod-index">
每次表盘移动时,我都会相应地更改调制指数值:
let modulationIndexSlider = document.getElementById("mod-index");
modulationIndexSlider.oninput = function() {
synth.options.modulationIndex = this.value
}
如您所见,我正在使用以下方法设置新的调制指数值:
synth.options.modulationIndex = this.value
我对其他参数遵循完全相同的方法,例如。
synth.options.harmonicity = this.value
synth.options.envelope.attack = this.value
等等。
我在 Ubuntu 上使用 Tone.js 14.8.37,使用 CDN、Chrome 98-99。
非常感谢任何可能提供帮助的人:-)
PS我也就此问题提出了一个问题,可以在这里找到