Web MIDI APIを読む
というわけでEditor's Draft 2014-02-13を読むことにしたが、差異を知るためには現在のTRを読む必要もあるので両方読むことにした。TRは日本語訳があるのでまずはTR版を読み、そのあとEditor's Draftを読んだ。
MIDIデータの入出力だけなのでAPIはそんなに複雑ではない。MIDIAccessオブジェクトをnavigator.requestMIDIAccess()メソッドでPromissオブジェクト経由で得る。次にMIDIAccessからMIDIOutputMap/MIDIInputMapを得る。MIDIOutputMap/MIDIInputMapはMIDIOutput/MIDIInputのコンテナであるので、任意のMIDIOutput/MIDIInputを得ることができる。MIDI入力はMIDIInputのコールバックでメッセージを取得、MIDI出力はMIDIOutput.send()メソッドで送るというシンプルなものである。入出力は複数のインターフェースがある場合は複数同時に扱えるので、シーケンサートラックの出力振り分けなども簡単に実装できそうである。
一番気になっていたのがデータ送信時のタイミングコントロールである。シーケンスデータの再生時はデータ送信のタイミングをタイマで正確にコントロールする必要があるので。MIDIOutput.sendメソッドには DOMHighResTimeStampの引数があるので、時間指定をすることによりミリ秒単位の精度でメッセージを送ることができる。つまりブラウザにタイミングをゆだねることができる。setIntervalやsetTimeoutで10ms程度の精度で粗くタイミングをコントロールして、それ以下の精度はsendメソッドでコントロールすれば正確なタイミングが維持できそうである。MIDI入力のコールバックで受け取るデータもタイムスタンプがついているので、リアルタイム入力にも比較的簡単に対応できそうである。
TRとeditor'sドラフトの違いは、MIDIOutputMap/MIDIInputMapのメンバの違いである。MIDI出力ポート/MIDI入力ポートのコンテナであることは変わりないのだが、メソッドが大幅に変わっている。TRよりもEditor'sドラフトのほうがより直感的になっているように思う。