我正在使用WebAudio构建Roland Juno-106合成器的仿真。 The live WIP version is here。
如果在起音或释放期间更改了截止频率或包络调制量,而同时通过包络对滤波器进行了调制,则我想知道如何处理滤波器的更新。 That code is located around here。当前的实现并没有像模拟合成器那样响应,但是我还不太清楚如何计算它。
在实际的合成器上,滤波器会根据频率截止,包络调制量和包络中的当前级而立即更改,但是上升或下降的过程也很平稳。
我将如何模拟这种行为?
最佳答案
辉煌的项目!
您无需自己对这些值求和-Web Audio AudioParams对它们的输入求和,因此,如果您有潜在的音频速率调制源,例如LFO(将一个OscillatorNode连接到GainNode),则只需将其connect()到AudioParam。
这是关键-AudioParams可以被connect()连接到-和一个节点或AudioParam的多个输入连接之和。因此,您通常需要一个
filter cutoff = (cutoff from envelope) + (cutoff from mod/LFO) + (cutoff from cutoff knob)
由于截止频率是一个频率,因此在对数刻度上不是线性频率,因此您想对数进行此加法运算(否则,将截止频率提高到440Hz Octave 的包络只会在880Hz处将其提高 Octave ),依此类推。 )-幸运的是,通过BiquadFilter上的“detune”参数可以轻松完成此操作。
失调单位为美分(1200/ Octave ),因此您必须使用增益节点来调整值(例如,如果您希望调制具有+ 1/-1 Octave 范围,请确保振荡器输出在-1200到+之间1200)。您可以在Web Audio合成器(https://github.com/cwilso/midi-synth)中看到如何执行此操作:特别是,请从第500行https://github.com/cwilso/midi-synth/blob/master/js/synth.js#L497-L519开始检查synth.js。注意modFilterGain.connect(this.filter1.detune);特别是。
您不希望直接设置ANY值来进行调制,因为实际值可能会以可能的快速速率更改-您想使用参数调度程序并从LFO输入求和。您可以根据需要在时间上设置旋钮值,但是事实证明,设置.value与在同一AudioParam上设置计划值的交互作用很差-因此您需要在AudioParam中输入单独的(汇总)输入。这有点棘手,说实话,我的合成器今天做得不好(我应该将其更改为以下所述的方法)。
处理旋钮设置的正确方法是创建一个根据您的旋钮设置而变化的音频 channel -也就是说,您可以将它连接到filter.detune这是一个AudioNode,尽管该AudioNode产生的样本值仅正值,并且仅在更改旋钮时才更改值。为此,您需要一个DC偏移源-即一个产生恒定采样值流的AudioNode。我想到的最简单的方法是使用AudioBufferSourceNode,其生成的缓冲区为1:
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即可使用该增益节点来缩放值(请记住, Octave 有1200美分,所以如果您要用旋钮表示六倍频程的截止范围,.value应该介于零到7200之间。然后将DCOffsetGain节点的connect()插入到过滤器的.detune中(它与LFO的连接求和,而不是替换),还与AudioParam上的预定值求和(请记住,您需要按美分缩放预定值, 也))。这种方法,顺便说一句,也可以轻松翻转包络线极性(Juno 106上的VCF ENV开关)-只需反转您在调度程序中设置的值即可。
希望这可以帮助。此刻我有点头疼,所以希望这很清楚。 :)
关于javascript - 网络音频合成: how to handle changing the filter cutoff during the attack or release phase?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30019666/