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。我也已经就此事打开了一个问题,可以在这里找到
使用 Tone.js 工具,使用 .set
方法更改属性。您可以同时更改多个属性,如下所示:
synth.set({
harmonicity: 10,
envelope: {
attack: 0.001,
},
});
在volume
的情况下,它是一个Param,所以可以通过volume.value
直接更改。
我从事 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。我也已经就此事打开了一个问题,可以在这里找到
使用 Tone.js 工具,使用 .set
方法更改属性。您可以同时更改多个属性,如下所示:
synth.set({
harmonicity: 10,
envelope: {
attack: 0.001,
},
});
在volume
的情况下,它是一个Param,所以可以通过volume.value
直接更改。