使用 WaveShaper 控制 Osc 频率导致无输出

Using a WaveShaper to control Osc frequency results in no output

问题:

如下图所示(效果不佳)创建音频图会导致振荡器不产生任何输出。我不确定振荡器是否产生超低频率,或者什么,但没有创建 audible 输出。

GainNode -> WaveShaper [-1, 1] -> GainNode -> OscillatorNode.frequency

但是,将上图中的最后一个 GainNode 连接到另一个 GainNode 的 gain 参数 而不是 会导致同样的问题(假设该图中的最后一个 GainNode 有一个振荡器,或连接到它的某种发电机)。 编辑:这实际上不是真的。它确实有影响。请参阅下面的更新。

GainNode -> WaveShaper [-1, 1] -> GainNode -> GainNode.gain


示例:

我创建了两个 JSFiddle 来展示它的实际效果。

我想我要么从根本上误解了这里的信号流,要么在较低级别出了问题。求助!


一些背景知识:

我正在尝试在 WebAudio API 中创建一个模拟 AudioParam 对象行为的音频图。原因是我希望能够拥有一个带有自定义曲线的 AudioParam,这样我就可以使用内置节点(而不是 ScriptProcessingNode,它是密集型的)来控制 AudioParam。 IE。具有指数曲线 AudioParam,或等功率 AudioParam。

在上面的音频图中,第一个 GainNode 是 "control" 节点,因此更改为 gain.value 属性 将控制 AudioParam 仿真。


更新 (13/04)

我在图中添加了一个 AnalyserNode 来可视化输出,我想我已经找到了问题...

WaveShaperNode(使用值为 [-1, 1] 的线性曲线)将输入值限制在 -1 到 1 的范围内,而不管输入的值是什么。因此,当启用 WaveShaperNode 时,来自 paramInput GainNode 的输入被限制为 -1、1。我需要查看规范以确定这是否是正确的行为,但我认为它可能是; WaveShaperNode 的主要用途之一是失真,因此如果它 没有 将输入信号钳位到 -1、1,则不会产生失真,只会产生整形。需要检查这个。

Here's an updated JSFiddle showing the osc's frequency using an analyser node. Apologies for the rough code.

And here's an updated JSFiddle showing the same behaviour when controlling a GainNode's gain param

WaveShaper.curve spec 很清楚。输入被限制在 [-1, 1]。您可能需要使用增益节点将您的输入映射到该范围,以最多将振幅降低到统一。