Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
note在使用audioContext javascript时,长按键可无限播放_Javascript - Fatal编程技术网

note在使用audioContext javascript时,长按键可无限播放

note在使用audioContext javascript时,长按键可无限播放,javascript,Javascript,我正在使用audioContext实现一个简单的钢琴。短时间按可正常播放音符,但长时间连续按某个键时,声音会播放不清楚。请帮助,谢谢 function Main() { // Create audio (context) container var audioCtx = new (AudioContext || webkitAudioContext)(); var pressed; var osc; var key; // Table of not

我正在使用audioContext实现一个简单的钢琴。短时间按可正常播放音符,但长时间连续按某个键时,声音会播放不清楚。请帮助,谢谢

function Main() {
    // Create audio (context) container
    var audioCtx = new (AudioContext || webkitAudioContext)();
    var pressed;
    var osc;
    var key;
    // Table of notes with correspending keyboard codes. Frequencies are in hertz.
    var notesByKeyCode = {
        65: { noteName: 'c4', frequency: 261.6, keyName: 'a' },
        83: { noteName: 'd4', frequency: 293.7, keyName: 's' },
        68: { noteName: 'e4', frequency: 329.6, keyName: 'd' },
        70: { noteName: 'f4', frequency: 349.2, keyName: 'f' },
        71: { noteName: 'g4', frequency: 392, keyName: 'g' },
        72: { noteName: 'a4', frequency: 440, keyName: 'h' },
        74: { noteName: 'b4', frequency: 493.9, keyName: 'j' },
        75: { noteName: 'c5', frequency: 523.3, keyName: 'k' },
        76: { noteName: 'd5', frequency: 587.3, keyName: 'l' },
        186: { noteName: 'e5', frequency: 659.3, keyName: ';' }
    };



     function Key(noteName, keyName, frequency) {
            console.log(frequency);
            var keySound = new Sound(frequency);
            return keySound;
        }

        function Sound(frequency) {
            osc = audioCtx.createOscillator(); // Create oscillator node
            pressed = false; // flag to indicate if sound is playing
            osc.frequency.value = frequency;
            osc.type = 'triangle';
            osc.start(0);
        };

        Sound.prototype.play = function() {
            if(!pressed) {
                pressed = true;
                osc.connect(audioCtx.destination);
                console.log('play');
            }
        };

        Sound.prototype.stop = function() {
            osc.disconnect();
            pressed = false;

            console.log('stop');

        };


        var playNote = function(event) {
            var keyCode = event.keyCode;
            key = new Sound(notesByKeyCode[keyCode].frequency);
            console.log(notesByKeyCode[keyCode].frequency);
            key.play();
        };

        var endNote = function(event) {
            console.log(pressed,'endnote');
            var keyCode = event.keyCode;
            key.stop();
        };

        window.addEventListener('keydown', playNote);
        window.addEventListener('keyup', endNote);

    }

    Main();

如果你仍然对答案感兴趣。我想我可以试着解释一下这种行为

如果您在playNote函数中调用“console.log”,您将看到如果您一直按下该键,该函数会执行多次。我不知道为什么尾注函数不停止声音(可能“key”没有删除前面提到的“sound”)

作为快速解决方案,我修改了代码:

var playNote = function(event) {
    console.log("Function xD")
    if(!pressed) {
        var keyCode = event.keyCode;
        key = new Sound(notesByKeyCode[keyCode].frequency);
        console.log(notesByKeyCode[keyCode].frequency);
        key.play();
    }
};
由于函数“playNote”被多次调用,我只需在“Sound.prototype.play”中复制您的条件,以避免重新创建变量“key”


这项工作至少在Chrome 47中可以完成。

请发布相关代码。到目前为止,您尝试了哪些?Stackoverflow不用于接受代码段的订单。向我们展示您的尝试。您是在生成音调还是在播放声音文件?抱歉…我已添加了代码。我正在生成音调