有没有办法避免javascript/浏览器中的键盘延迟?

有没有办法避免javascript/浏览器中的键盘延迟?,javascript,html,browser,keyboard,latency,Javascript,Html,Browser,Keyboard,Latency,如果你弹奏这架钢琴,你会在弹奏时感觉到巨大的延迟。我想避免延迟,因为它非常烦人。安装ASIO插件可以消除延迟。像这样的事情,或者有什么黑魔法可以让它发挥作用 $(函数(){ var$keyboard=$(“.keyboard”) ,$buttons=$keyboard.find('button')) ,charMap={} ,keyList=[] 烧焦 ,audioCtx=newaudiocontext() ,oscMap={}; 对于(变量i=0;i操作系统的特定配置上遇到的延迟;是使用鼠标

如果你弹奏这架钢琴,你会在弹奏时感觉到巨大的延迟。我想避免延迟,因为它非常烦人。安装ASIO插件可以消除延迟。像这样的事情,或者有什么黑魔法可以让它发挥作用

$(函数(){
var$keyboard=$(“.keyboard”)
,$buttons=$keyboard.find('button'))
,charMap={}
,keyList=[]
烧焦
,audioCtx=newaudiocontext()
,oscMap={};
对于(变量i=0;i<$buttons.length;i++){
char=$buttons[i].innerHTML;
keyList.push(charMap[char]={
$button:$($buttons[i]),
索引:i,,
char:char,
播放:错误
});
}
函数getFreq(i){
返回220*数学功率(2,(i+3)/12);
}
功能播放说明(obj,播放){
if(obj&&obj.playing!=正在播放){
玩=玩;
如果(玩){
如果(!obj.osc){
obj.osc=audioCtx.create振荡器();
obj.osc.type=‘方形’;
obj.osc.frequency.value=getFreq(obj.index);
obj.osc.connect(audioCtx.destination);
}
obj.osc.start();
}否则{
如果(目标osc){
obj.osc.stop();
obj.osc=null;
}
}
对象$button[播放?'addClass':'removeClass']('playing');
}
}
$(窗口).on('keydown-keyup',函数(e){
变量c=e.originalEvent.key | |“”;
playNote(charMap[c.toUpperCase()],e.type=='keydown');
});
$keyboard.on('mousedown mouseup','button',函数(e){
var c=this.innerHTML;
playNote(charMap[c.toUpperCase()],e.type=='mousedown');
})
})

耳机用户请注意:在测试codepen之前,请先将音量调低。我在Win7桌面上的Chrome上单击鼠标时,感觉到(轻微疼痛,但没有延迟)。是您在浏览器>操作系统的特定配置上遇到的延迟;是使用鼠标、键盘还是两者都使用?是触摸屏?使用这个:我的意思是,键盘延迟,可以在触摸屏上使用。尚未在触摸屏上测试。是的,我需要实现音量控制,这可能会让一个headphoe用户心脏病发作=)我在测试时没有经历延迟。你在点击事件上也有这个问题吗?此外,您还可以使用左移位优化playNote,如2
$(function(){

    var $keyboard = $('.keyboard')
      , $buttons = $keyboard.find('button')
      , charMap = {}
      , keyList = []
      , char
      , audioCtx = new AudioContext()
      , oscMap = {};

    for(var i=0; i < $buttons.length; i++){
        char = $buttons[i].innerHTML;
        keyList.push(charMap[char] = {
            $button: $($buttons[i]),
            index:i,
            char:char,
            playing:false
        });
    }

    function getFreq(i){
        return 220 * Math.pow(2, (i+3)/12);
    }

    function playNote(obj, playing){
        if(obj && obj.playing != playing){
            obj.playing = playing;
            if(playing){
                if(!obj.osc){
                    obj.osc = audioCtx.createOscillator();
                    obj.osc.type = 'square';
                    obj.osc.frequency.value = getFreq(obj.index);
                    obj.osc.connect(audioCtx.destination);

                }
                obj.osc.start();
            } else {
                if(obj.osc){
                    obj.osc.stop();
                    obj.osc = null;
                }
            }
         obj.$button[playing ? 'addClass' : 'removeClass']('playing');
        }

    }

    $(window).on('keydown keyup', function(e){
        var c = e.originalEvent.key || '';
        playNote(charMap[c.toUpperCase()], e.type == 'keydown');
    });

    $keyboard.on('mousedown mouseup', 'button', function(e){
        var c = this.innerHTML;
        playNote(charMap[c.toUpperCase()], e.type == 'mousedown');
    })

})