1
신시사이저를 만들고 있는데 오실레이터가 한 번 생성되고 키 누르기가 중지 된 다음 키 업을 중지하려고합니다.keydown() 및 Web Audio API에서 트리거되는 이벤트가 너무 많습니다.
다음은 제 코드입니다. 여기
$(document).on("keydown", e => {
console.log(e);
let key = $("div[data-key-id = " + e.keyCode + "]")
key.addClass('red')
if (fired) return null;
fired = true;
let oscs = playTone($(key[0]).attr("data-frequency"))
if (!oscs) return null;
$(document).on('keyup', e => {
oscs.forEach(osc => {
osc.stop();
});
$('.key').removeClass('red')
fired = false;
})
})
function playTone(freq) {
if (!freq) return null;
let osc = audioCtx.createOscillator();
let osc2 = audioCtx.createOscillator();
connectNodes(osc, osc2)
osc.type = type;
osc2.type = type2;
osc.detune.value = detune * 5;
osc2.detune.value = -detune * 5;
let number = parseFloat(freq.match(/[\d\.]+/))
osc.frequency.value = number * octave;
osc2.frequency.value = number * octave;
console.log(osc)
osc.start();
console.log(osc2)
osc2.start();
return [osc,osc2]
}
당신은'keydown' 이벤트에서'$ (문서) CSTE 연구진 ('keyup''을 가지고, keydown 이벤트가 발생할 때마다 새롭고 분리 된 keyup 이벤트 처리기를 만들 것입니다. –
좋은 점은 고맙습니다. 여전히 같은 문제가 발생하고 있습니다. – John