Tone.js :实时调整合成器参数时得到意想不到的结果(例如失谐、调制指数、起音等)

Tone.js : Getting unexpected results when tweaking synth parameters live (ex. detune, modulation index, attack etc.)

我从事 Tone.js 合成器项目已有一段时间了。

作为记录,我将包含以下链接: Repo Deployment (由于我遇到了这个问题,它仍在开发中)

我遇到了一个我无法解决的严重问题。我将 PolySynth 与 FMSynth 一起使用,但我尝试过的所有其他合成器类型都遇到了同样的问题。

每当我尝试实时调整合成器的参数(例如失谐、调制指数、振幅包络等)时,我都会遇到意外行为:

大多数时候,当我更改参数值时,它会立即生效,因此声音会根据我所做的更改进行修改,但声音会停留在第一个修改值上,即使我一直在改变参数的值。

然后有时我在合成器上弹奏音符时每隔一秒就会得到修改后的声音。一次我得到修改后的声音,然后下一次我得到没有任何修改的原始声音,然后再次得到修改后的声音等等。

有时会成功,但我仍然停留在第一次修改上。

有时它会随机工作,先演奏一些音符。

有时它会立即工作,但随后一些特定的音符会产生未修改的原始声音,无论我的修改如何(并且合成器仍然停止响应任何进一步的参数更改)。

除了体积之外的每个参数都会发生这种情况:体积每次都按预期工作。

让我们以调制指数为例(失谐、谐度和攻击也是如此——这些是我暂时实现的参数)。最初,我使用 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 

等等。

我正在使用 Tone.js 14.8.37 使用 CDN,Chrome 98-99 在 Ubuntu.

非常感谢任何可能提供帮助的人:-)

P.S。我也已经就此事打开了一个问题,可以在这里找到

https://github.com/Tonejs/Tone.js/issues/1045

使用 Tone.js 工具,使用 .set 方法更改属性。您可以同时更改多个属性,如下所示:

synth.set({
  harmonicity: 10,
  envelope: {
    attack: 0.001,
  },
});

volume的情况下,它是一个Param,所以可以通过volume.value直接更改。