RSS Twitter Facebook

2013/12/02 (2013年12月 のアーカイブ)

Web MIDI API に関する補足

さて、数日前にWeb MIDI API の日本語訳を公開しましたが、このAPIはまさに今開発途上ですので仕様と実装の間でまだ不一致があったりしますので、気を付けるべき点について補足しておきます。

なお、そもそも動作させるには今の所、Mac版Chrome上でflagを有効にするか、JazzPluginを入れてWebMIDIAPIShimを使う必要があります。(ついでに近々Windows版Chrome(Canary)にもWeb MIDI APIが入るという話が某所で流れてました。期待したいです)

動きは結構速いので、あくまでも「今のところ」です。

MIDIAccessからMIDIポートを得る部分
例えばMIDI入力ポートの名前をそれぞれconsole.logに出そうとする場合:

現在、実際のChromeおよびpolyfillの実装では次のようになります。
  var inputs=midiAccess.inputs();
  for(var i = 0;i < inputs.length; ++i) {
    console.log(inputs[i].name);
  }
つまりmidiAccess.inputs (およびoutputs) は関数であり、それぞれポートの配列を返します。

これに対して、現在の仕様書上では次のような動作になります。
    midiAccess.inputs.values( function( port ) {
      console.log(port.name);
    });
つまり、midiAccess.inputs (およびoutputs).valuesが関数であり、そこに別の関数を渡すと各MIDIポートに対して渡した関数が実行されるという形式です。またvalues以外にkeys、entriesというキー名、キー名/ポートのペアを渡す関数がそれぞれ準備されています。

ところがこの仕様書上の動作は何かおかしいだろ? inputs/outputsがiterableなオブジェクトで for-in / for-of ループが使えればそれでいいじゃないか、という意見も出ているようです。つまりこんな感じになると思われます:
  for(port of inputs) {
    console.log(port.name);
  }
最後の奴に分があるかなぁという気はしますが、実際どういう方向に実装が進むかはわかりません。 どちらにせよ、今現在、Web MIDI APIを動かしてみようという場合には一番上の例を使う必要があります。しかしこの現在の実装に対応する仕様書は既に過去のものなので、GitHubのHistoryを漁って近いものを探してみたところ、このあたりになります。

https://rawgithub.com/WebAudio/web-midi-api/35c89e62a77051afd8df3636b9c1dcf52eeb40d1/index.html
(ReSpecの関係で日付が現在の日付で表示されますが、6月末くらいのスペックです)

ちなみにこれも完全ではなくてサンプルコード内で使っている関数名が違っていたりしますので、あくまで参考に。

Posted by g200kg : 2013/12/02 02:48:22