我正在构建一个实验性的Web MIDI应用程序,它以图形方式将您在外部MIDI键盘上播放的音符显示在浏览器上。我有一个奇怪的错误,如果我将以下回调记录到控制台,则以下回调:
// ============================================================================
// Web MIDI API
// ============================================================================
var MIDI = null;
$(document ).ready(function(){
function onMIDISuccess( midiAccess )
{
MIDI = midiAccess;
// Start listening to the MIDI ports!
var selected_input = MIDI.inputs()[0];
console.log( selected_input );
selected_input.onmidimessage = function( event )
{
if( event.data[0] == 144 )
{
// Zero velocity means note OFF
if( event.data[2] == 0 )
$("pianokey[note="+event.data[1]+"]" ).removeClass("active");
// Non-zero velocity means note ON
else
$("pianokey[note="+event.data[1]+"]" ).addClass("active");
}
};
}
function onMIDIFailure( error )
{
console.error( "MIDI Failed! Error: ", error );
}
navigator.requestMIDIAccess().then( onMIDISuccess, onMIDIFailure );
});
我发现我的代码是有效的,但只有在包含console.log( selected_input );
行时才会有效。
通过操作我的小提琴最容易看出我的意思:http://jsfiddle.net/8sSMe/1/
如果您插入了外置midi键盘,您应该会看到屏幕上的按键点亮,模仿您在键盘上弹奏的内容。请记住,您可能必须重新启动chrome来拾取键盘,并且您可能需要从selected_input
的数组中选择不同的输入。您还可能需要通过转到chrome:// flags / #enable-web-midi来打开Chrome中的Web MIDI(我也只是想让它在Chrome上运行)。一旦您看到它正常工作,请在console.log( selected_input );
注释掉的情况下进行尝试,它会奇怪地停止工作。
有什么想法吗?
答案 0 :(得分:1)
我认为我发现了问题......
范围/垃圾收集
我的参考var selected_input = MIDI.outputs()[0];
发生在一个消失的范围内。所以当它消失的时候,它就会有回调响应机制。在全局范围内保持对它的引用解决了这个问题。不知何故,console.log()
可能正在改变范围。
所以有一个解决方案,但我的理论只是一个有效的解决方案,我很乐意欢迎任何具有更多专业知识的人来证实我的理论。我不知道如何测试变量是否被垃圾收集......?
唉,Javascript语言的挑战......
答案 1 :(得分:0)
这个代码也发生在我身上的事情:当我这么做的时候
console.log(MIDI)
之后navigator...
它表示MIDI为空。但是当我在加载页面后立即在控制台输入中调用MIDI时,我可以检索非空的MIDI对象。
异步通话?