1

我从事 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我也就此问题提出了一个问题,可以在这里找到

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

4

1 回答 1

0

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

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

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

于 2022-03-04T12:23:30.070 回答