有没有办法避免javascript/浏览器中的键盘延迟?
如果你弹奏这架钢琴,你会在弹奏时感觉到巨大的延迟。我想避免延迟,因为它非常烦人。安装ASIO插件可以消除延迟。像这样的事情,或者有什么黑魔法可以让它发挥作用有没有办法避免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操作系统的特定配置上遇到的延迟;是使用鼠标
$(函数(){
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');
})
})