2013年12月31日火曜日

ChromeにおけるWeb MIDI APIの実装状況

2013もそろそろ終わりって事で今年色々と動きはじめたWeb MIDI APIの実装状況について簡単にまとめておきたいと思います。会社の方針とかそういう話ではなく、担当者として客観的事実の報告です。

ChromeではMac版のみで実装を進めてきました。最初の実装という事で、実装から仕様へのフィードバック、上位仕様とのすり合わせなどで仕様変更が伴います。全OSの対応を同時に進めると、イテレーションのコストが大きくなってしまうためです。

Chrome 30からchrome://flags#enable-web-midiが登場しました。この時点ではMacで入力ポートのみ動作していました。ただし、SysExメッセージ入力にバグがあり、このバグはChrome 32まで残っています。

Chrome 31で入出力ひと通りの機能が揃い、SysExメッセージ利用許可を求めるUI、設定などが入りました。Chrome的に言うとContent Settingsという仕組みの中に統合しています。

Chrome 32ではIAC Driver経由で外部ソフトウェア(音源)と連携できるようになりました。

Chrome 33からはいよいよWindows版でも動くようになりました。Timestampが異常値を返すバグがあるのですが、基本的な機能は動作するはずです。TimestampのバグはChrome 34で修正されています。

さて、ここまではリリース済み、またはブランチカット済みのバージョンの話でした。ここから先は予定の話になるので確約はできないことをご了承ください。現在、開発中の最新バージョンはChrome 34です。以下はChrome 34に向けて実装を始めている項目です。

  • Promise
    • 今まではthen()しか使えない限定的なWeb MIDI専用のPromiseもどきを返していました。Chrome 32から本物のPromiseが有効になるため、本物のPromiseに移行します。
  • Chrome OS / Linux
  • Android
    • いずれのプラットフォームでもラフな実装を終え、レビューを回している段階です。
これ以外に直近で計画しているのは

  • 入出力デバイスを列挙するAPIが変更になっており、その対応
  • デバイスの動的な追加・削除のイベント通知
ですが、詳細なスケジュールについては調整中です。対応プラットフォームの拡大も含め、いずれもデバイスの動的な追加・削除を実現するため仕組みを、すべてのプラットフォーム上で無理なく実装するための取り組みです。

という事で、仕様も実装も完全に安定したわけではありませんが、興味ある方はぜひ使ってみてください。また、不審な点に気づいた場合には私までご一報ください。

という事で、良いお年を!

2013年11月2日土曜日

vmware-mount

vmwareの中で動かしている仮想マシン、うっかり/etc/hostsを消してしまって。
特にカスタマイズもしてなかったのでリポジトリ管理もしてないファイルだったんだけど、元通りじゃないと気持ち悪いので、仮想ディスクvmdkのバックアップから発掘しようかな、と思って作業した時のメモ。
バックアップから別の仮想マシンを起動すれば簡単なんだけど、面倒だからvmdkを直接マウントしようとして、結論から言えばもっと面倒だった、という話。

まず、普通に生活していればvmware-mountが便利に使えたはず。だったんだけど、中で動かしていた仮想マシンがNetBSDだったので、そのままだとうまく動いてくれなかった。ので、vmware-mountが中でやってると思われるmountコマンドを引数を適切に指定して呼ぶ必要がありました。
% sudo mount disk.vmdk /mnt/tmp -t ufs
-o ro,loop=/dev/loop1,offset=2719232,ufstype=44bsd
最近じゃ違うのかもしれないけど、僕は昔からNetBSDでは奥ゆかしきufsを使い続けてるので-t ufsをつけて、-oの方にはufstype=44bsdを指定。ufstypeを指定しないとoldが選ばれて、マウントはできるけど一切読めない状態になるので注意。あとufsはread onlyでしかサポートされてないのでroも必要。ここまではmanを読めばすぐわかる話。で、問題なのはoffsetの探し方。

ここで指定するoffsetはvmdkのヘッダサイズと読みたいパーティションの位置を足したもの。とりあえずvmdkのヘッダサイズがよくわからなかったので適当に推測。以下、仮想マシンの中での作業。
% disklabel /dev/wd0
(snip)
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:   2097900        63     4.2BSD   2048 16384 21880  # (Cyl.      0*-   2220*)
 b:   1048950   2097963       swap                     # (Cyl.   2220*-   3330*)
 c:  41942977        63     unused      0     0        # (Cyl.      0*-  44384*)
 d:  41943040         0     unused      0     0        # (Cyl.      0 -  44384*)
(snip)
って感じの状態なので、とりあえずディスクの先頭に何が書いてあるか確認。
% hexdump -C /dev/wd0d | head -n 20
って感じで見れば、先頭から0x100付近にNetBSDのMBRのエラーメッセージが見えるので、これをキーにディスクイメージ側を探索。以下はホストでの作業。
% hexdump -C disk.vmdk|less
"BSD"をキーに探せばすぐに該当箇所が見つかる。僕の場合0x290120付近。ここからちょっと遡ると0x290000がディスクの先頭と一致することがわかる。

ここまでわかれば簡単。読みたいパーティションはoffset 63からなので
% expr 63 \* 512 + `printf %d 0x290000`
2719232

ふぅ。ちなみに最初の段階でvmdkが複数のファイルに別れてたりする場合はvmware-vdiskmanagerを使って単一ファイルのフォーマットに変換してから作業する必要があるはず。

2013年10月19日土曜日

Web MIDIでゲーム

最近MIDI入力を使ったゲームが話題になっていたので、Webの世界でも同じ物を・・・と。 Web Music ハッカソンにて作ってみました。 とりあえず、KORGさんのnanoKONTROL2で操作しやすい設定にしてあります。フェーダーセットの一番左側で、Sボタンでスタート、パンでバー操作、フェーダーで弾幕速度の調節です。