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));
};
ありがとう!