Web MIDI回调功能仅在登录到控制台时有效

时间:2014-07-10 16:47:37

标签: javascript google-chrome console web-audio web-midi

我正在构建一个实验性的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 );注释掉的情况下进行尝试,它会奇怪地停止工作。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

认为我发现了问题......

范围/垃圾收集

我的参考var selected_input = MIDI.outputs()[0];发生在一个消失的范围内。所以当它消失的时候,它就会有回调响应机制。在全局范围内保持对它的引用解决了这个问题。不知何故,console.log()可能正在改变范围。

所以有一个解决方案,但我的理论只是一个有效的解决方案,我很乐意欢迎任何具有更多专业知识的人来证实我的理论。我不知道如何测试变量是否被垃圾收集......?

唉,Javascript语言的挑战......

答案 1 :(得分:0)

这个代码也发生在我身上的事情:当我这么做的时候   console.log(MIDI)之后navigator...它表示MIDI为空。但是当我在加载页面后立即在控制台输入中调用MIDI时,我可以检索非空的MIDI对象。

异步通话?