2016-12-04 69 views
0

情境觸發信封:我試圖讓100%的模塊化合成器在網絡上WebAudioAPI:基於輸入

到目前爲止,我已經看到了用於製作使用的功能來觸發不同階段的信封教程信封,但是如果我想根據AudioNode的輸出觸發信封,該怎麼辦?

例如,攻擊方波振盪器的上升沿,並在下降沿釋放?

我不得不求助於使用腳本處理器節點(並在性能方面受到影響)還是有更好的方法來做到這一點,我還沒有發現?

預先感謝

澄清:

的輸入是一個簡單的二進制邏輯門。當按鍵被按下時爲1,否則爲0。

應該有一些參數是AudioParams,可以控制攻擊時間,衰減時間,持續時間和釋放時間。假設衰減電平(ADSR包絡的峯值)爲1

輸出是ADSR包絡信號本身。

回答

1

這裏有一種替代方法,如果你有模擬電路,你可以區分你的方波得到前緣有正衝動,後緣有負衝動。將該脈衝串饋入RC電路。這將產生一個攻擊和釋放階段。

在WebAudio中,您可以通過延遲信號一個採樣並從原始信號中減去信號來做一個簡單的區分。對於RC電路,您可以使用BiquadFilterNodeIIRFilterNode來產生所需的結果。

我不確定如果您想要更復雜的ADSR響應該怎麼辦。

+0

過濾器節點中的什麼機制將用作回調以調整asdr。換句話說,我認爲他正在尋找某種事件監聽器? – bob

+0

我想我們確實需要更多關於「其他」信號的外觀以及用例的確切信息。 –

+0

非常感謝您的回答!它在獲得攻擊和釋放階段方面效果很好,但我最終還需要一個衰退階段。我會暫時使用這種方法。現在我正在試驗DynamicCompressor節點以及一些信號增益和偏移量處理,以查看我是否可以獲得具有可協調音頻參數的完整ADSR。 – euwbah

1

儘管我不太明白節點用於觸發的位置/方式實際上會觸發某些事情(除了使用sourceNode.onended事件,最終我相信您需要使用setValueAtTime和linearRampToValueAtTime來處理信封。在一個附加的增益節點再次,你如何推導出攻擊的時候,維持和釋放仍是一個謎

無論如何,這是一個基本的要點我如何建立信封:

var triggerAtTime = 10; 
var attackTime = 3; 
var sustainTime = 5; 
var releaseTime = 5; 

var attackVol = 0.8; 

var attackStartTime = triggerAtTime; 
var attackEndTime = triggerAtTime + attackTime; 

var releaseStartTime = attackEndTime + sustainTime; 
var releaseEndTime = releaseStartTime + releaseTime; 

var gainNode = ctx.createGain(); 
var gng = gainNode.gain; 

gng.setValueAtTime(0, attackStartTime); 
gng.linearRampToValueAtTime(attackVol, attackEndTime); 

gng.setValueAtTime(attackVol, releaseStartTime); 
gng.linearRampToValueAtTime(0, releaseEndTime); 

sourceNode.connect(gainNode); 
+0

感謝您的回答。這是我已經擁有的,而我實際上正在尋找的是如何基於另一個節點的輸出來觸發setValueAtTime()和linearRampToValueAtTime()函數。在這種情況下,所有ADSR時間都被硬編碼。但是,有沒有辦法觸發這個信封,例如,基於另一個方波振盪器,其中上升沿被視爲「音符開」,下降沿被視爲「音符關」? – euwbah

+0

如果另一個節點是方波,可以使用簡單的濾波器來實現(至少部分)。濾波器的輸入是方波,濾波器的輸出設置增益節點的增益。在波的上升沿,濾波器的輸出將上升到1.在後沿,濾波器的輸出斜坡下降到0.這些斜坡具有某種你可能不想要的對稱性。那麼將需要更復雜的方案。 –