我正在使用WebAudioAPI
和WebMIDIAPI
創建複音合成器。我的每個振盪器都有一個增益節點,然後連接到主增益節點。Web Audio API - 停止振盪器連接以釋放信封的正確方法
我想知道如何在發佈後正確停止(如果有必要刪除)振盪器。我不確定是否有必要從陣列中調用oscillator.stop()
和delete
振盪器。
如果我這樣做,釋放信封不起作用,筆記立即停止,如果我不這樣做,釋放信封確實有效,但筆記有時可以繼續播放。
編輯:它似乎當.stop()
功能沒有實現和兩個音符同時播放一個振盪器將始終保持。不知道這是我的代碼還是??
我對noteOff
功能代碼如下:
/**
* Note is being released
*/
this.noteOff = function (frequency, velocity, note){
var now = this.context.currentTime;
// Get the release values
var osc1ReleaseVal = now + this.osc1Release;
var osc2ReleaseVal = now + this.osc2Release;
// Cancel scheduled values
this.oscGain.gain.cancelScheduledValues(now);
this.osc2Gain.gain.cancelScheduledValues(now);
// Set the value
this.oscGain.gain.setValueAtTime(this.oscGain.gain.value, now);
this.osc2Gain.gain.setValueAtTime(this.osc2Gain.gain.value, now);
// Release the note
this.oscGain.gain.linearRampToValueAtTime(0.0, osc1ReleaseVal);
this.osc2Gain.gain.linearRampToValueAtTime(0.0, osc2ReleaseVal);
// ----- IF I COMMENT THE `forEach` Loop the release works correctly but with side-effects!
// Stop the oscillators
this.oscillators[frequency].forEach(function (oscillator) {
oscillator.stop(now);
oscillator.disconnect();
delete oscillator;
});
};
任何幫助將不勝感激,謝謝!
事實上,我不知道你應該刪除你的osc陣列。在釋放筆記之後使用可以減少增益的功能怎麼樣?因此,您可以確保音量在某個時間點關閉,而無需停止並刪除osc?只是一個想法... 我需要花一些時間在它上啊... – DevMoutarde
@DevMoutarde一個好主意,或許,我試着把'oscillator.stop()'放在一個'setTimeout'函數中,設置時間到'osc1ReleaseVal'和'osc2ReleaseVal',但沒有工作..認爲我需要想想其他的東西來增加到 –
哦,太糟糕了,它不工作,因爲它聽起來像一個好方法。也許(我想你已經做過了),你應該看看互聯網上的一些html/js合成器,看看他們如何設法方便地播放/停止。我曾經自己玩增益節點,而不是停止osc – DevMoutarde