2017-11-09 4 views
0

私はWeb Audio APIを使用してデジタルシンセサイザーを作成しようとしています。私はポリフォニック・シンセにエンベロープを追加しようとしています。それを正しく得ることはできません。私はlinearRamptoValueAtTime、exponentialRamptoValueAtTime、setTargetAtTimeなどのすべての組み合わせを試しました...そして、私はまだこれらの厄介なポップとクリックで終わります。私はすべてのチュートリアルを読んでこのトピックに関する記事を投稿したように感じますが、明らかに何か間違っています。Web Audio APIを使用したポップスとクリック

ここに私の攻撃とリリースのコードがあります。

攻撃:

let osc1Vol; 
keyboard.keyDown = function(note, freq) { 
    let now = audioCtx.currentTime; 
    const osc1 = audioCtx.createOscillator(); 
    if (gainNodeTable[freq]) { 
    osc1Vol = gainNodeTable[freq]; 
    osc1Vol.gain.cancelScheduledValues(now); 
    osc1Vol.gain.setValueAtTime(osc1Vol.gain.value, now); 
    } else { 
    osc1Vol = audioCtx.createGain(); 
    osc1Vol.gain.setValueAtTime(0, now); 
    } 
    osc1.connect(osc1Vol); 
    osc1.type = osc1wave.value; 
    osc1.frequency.value = (freq * octaveTable[osc1octave.value]); 
    oscillators[freq] = osc1; 
    gainNodeTable[freq] = osc1Vol; 
    osc1Vol.connect(audioCtx.destination); 
    osc1Vol.gain.linearRampToValueAtTime(1.0, (now + parseInt(attack.value))); 
    osc1.start(); 
}; 

リリース:

keyboard.keyUp = function (note, freq) { 
    const now = audioCtx.currentTime; 
    const gain = gainNodeTable[freq].gain.value; 
    gainNodeTable[freq].gain.cancelScheduledValues(now); 
    gainNodeTable[freq].gain.setValueAtTime(gain, now) 
    gainNodeTable[freq].gain.exponentialRampToValueAtTime(0.0001, now + parseInt(decay.value)); 
    oscillators[freq].stop(now + parseInt(decay.value)); 
}; 

ありがとう!

答えて

0

これらの周波数を取り除くためにフィルターを通過させるだけで終了しました。

関連する問題