繁体   English   中英

Web音频合成:如何在攻击或释放阶段处理更改过滤器截止?

[英]Web Audio synthesis: how to handle changing the filter cutoff during the attack or release phase?

我正在使用WebAudio构建Roland Juno-106合成器的仿真。 实时WIP版本在这里

如果截止频率或包络调制量在攻击或释放期间发生变化,同时滤波器同时被包络调制,我就会挂断如何更新滤波器。 该代码位于此处 当前的实现并没有像模拟合成器那样响应,但我无法弄清楚如何计算它。

在真正的合成器上,滤波器立即由包络中的频率截止,包络调制量和当前级确定,但是上升或下降也可以平滑地继续。

我该如何模拟这种行为?

精彩的项目!

你不需要自己总结这些 - Web Audio AudioParams对它们的输入求和,所以如果你有一个潜在的音频速率调制源,如LFO(一个连接到GainNode的振荡器节点),你只需将它连接到AudioParam即可。

这是关键 - AudioParams能够连接()编辑 - 并且对节点或AudioParam的多个输入连接求和。 所以你通常需要一个模型

filter cutoff = (cutoff from envelope) + (cutoff from mod/LFO) + (cutoff from cutoff knob)

由于截止是一个频率,因此在对数标度而不是线性标度上,你想要以对数方式进行这种加法(否则,在440Hz处将截止频率提高一个八度音程的信封只能在880Hz处将其提高半个八度等等。 ) - 幸运的是,通过BiquadFilter上的“detune”参数很容易做到这一点。

Detune以美分(1200 /倍频程)为单位,因此您必须使用增益节点来调整值(例如,如果您希望调制具有+ 1 / -1倍频程范围,请确保振荡器输出介于-1200和+之间1200)。 您可以在我的Web音频合成器( https://github.com/cwilso/midi-synth )中看到我是如何做到这一点的:特别是从第500行开始查看synth.js: https//github.com/ cwilso / midi-synth / blob / master / js / synth.js#L497-L519 注意modFilterGain.connect(this.filter1.detune); 特别是。

您不希望直接为调制设置任何值,因为实际值将以可能快的速率变化 - 您希望使用参数调度程序并从LFO输入求和。 您可以根据需要在时间方面设置旋钮值,但事实证明设置.value与在同一AudioParam上设置预定值的交互性很差 - 因此您需要在AudioParam中有一个单独的(求和)输入。 这是一个棘手的问题,说实话,我的合成器今天做得不好(我应该把它改成下面描述的方法)。

处理旋钮设置的正确方法是创建一个根据旋钮设置而变化的音频通道 - 也就是说,它是一个可以连接()到filter.detune的AudioNode,尽管该AudioNode生成的样本值仅为正,仅在更改旋钮时更改值。 要做到这一点,您需要一个DC偏移源 - 即一个产生常量样本值流的AudioNode。 我能想到的最简单的方法是使用一个生成的缓冲区为1的AudioBufferSourceNode:

   function createDCOffset() {
    var buffer=audioContext.createBuffer(1,1,audioContext.sampleRate);
    var data = buffer.getChannelData(0);
    data[0]=1;
    var bufferSource=audioContext.createBufferSource();
    bufferSource.buffer=buffer;
    bufferSource.loop=true;
    bufferSource.start(0);
    return bufferSource;
}

然后,只需将DCOffset连接到增益节点,并将“旋钮”连接到该增益的.value,使用增益节点来缩放值(请记住,八度音程中有1200美分,所以如果你想要你的旋钮代表一个六个八度音的截止范围,。值应该在0到7200之间。 然后将DCOffsetGain节点连接()到过滤器的.detune(它与LFO的连接相加而不是替换,并且还与AudioParam上的预定值相加(请记住,您需要以美分来缩放计划值) ,也))。 这种方法BTW也可以轻松地翻转包络极性(Juno 106上的VCF ENV开关) - 只需反转您在调度程序中设置的值。

希望这可以帮助。 我此刻有点时差,所以希望这是清醒的。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM