簡體   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