MIDI to OSC Deviceの試作とUnityを用いたVJについて 3

2013.11.04りんご飴音楽祭@渋谷WWWでのAZUMA HITOMIさんのVJの技術的なことについて、何回かに分けてまとめていきます。

AVR100円マイコンと小型LinuxボードによるMIDI→OSC変換 (後半)

前回が長くなっちゃったので、続きです。

BeagleBone BlackのセットアップとUART受信

前回の通り、メインの処理はBBBを使います。BBBはARMコア(Cortex-A8)の1GHzCPUが載っていて、Amazonで一式6000円弱で買える素晴らしいLinuxボードです。ただしHDMIの挙動はちょっと怪しいのですが、VNCとかでLAN上から覗いたり、そもそもコンソールしか使わない場合は関係ないのでよしとします。
買ったままでも内蔵フラッシュからAngstrom Linuxが起動しますが、今回はmicroSDから使い慣れたubuntuをブートしてみました。詳しい事は省略しますが、このページからPrebuildイメージを落としてSDに焼いて、ボタンを押しながら電源を入れてSDからbootする事を確認、ネットワークなどの設定を済ませて、ssh等で確実にログイン出来るかチェックします。
大丈夫そうなら、デフォルトでSDからbootするようにします。BBBをPCにUSB接続すると内蔵フラッシュのbootパーティションが見えるので 内蔵フラッシュのbootパーティションにSDのbootパーティションの内容をコピーします。
今回、UARTを3本使いたいので、起動時にpin functionの設定を変更します。ここを参考に、UARTを有効にするスクリプトをupdate-rc.dで登録します。ついでにstty -F /dev/ttyO1 38400とか書いて、Baud rateを今回使いたいものにしておきます(あとでプログラム上から設定するので別になくてもいいですが)。
これでやっとUART3本をLinux上からいじれるようになったはず!前回のAVRマイコン基板を挿して、MIDI機器を繋いでみます。sudo hexdump /dev/ttyO1してみると何やらつらつらと表示されてる!わーい!

BeagleBone BlackによるOSCの送信

もはや誰向けの記事なのかわかんなくなっていますが、ここまででデバイスの土台は完成です。続いて機能の実装に入ります。Linux用のプログラムを書くわけですが、目的はUARTの受信とOSCの送信です。それなりに単純なので、C言語で実装しました。
ここからは結構世の中に情報があると思います。UARTについてはtermios.hを用いてシリアルポートを操作します。このへんのページが参考になるでしょうか。O_NOCTTYでopenしてcfsetispeedでB38400とか適当に設定します。
OSCについては、libloをapt-getで入れて使います。この方が解説してくれています。というか、libloは使いやすいライブラリなので、公式ドキュメントを見ればだいたい使い方がわかるかと思います(雑)。PCでOSCの受信確認ができるソフトは沢山あります。せっかくなのでProcessing製のOSCモニタとか使って動作を確認しながら書くと便利です。
BBB用のクロスコンパイル環境を作る方法もいろいろ紹介されていますが、簡単なものなら実機上でgcc main.c -lloでもいいでしょう。本格的に書く場合はLinux機またはVirtualBox上のEclipseがいいと思います。その辺はググればなんとかなります。と言いつつ、実は自分は既存の開発環境と競合してうまくいきませんでしたが。
MIDIデバイスからのバイナリデータをそのまま1バイトずつintとしてOSCで送信すれば、MaxでMIDI parseできるようです。ただ他のプログラムからは読みにくいので、ちゃんと1つのMIDIメッセージを1つのOSCメッセージとして送ってみました。帯域的にはかなり余裕があるので、両方の形式で送り、OSCパスでフィルタできるようにしました。また、プログラム自体は引数で与えたUART1ポートのみ処理するようにしました。このプログラムを複数プロセスで同時に起動して、複数ポートに対応します。起動用スクリプトは前述のOS起動時のスクリプトに追加して、デバイスの電源ONで自動実行する事もできます。
最終的なソースはそのうち公開しますが、ここまでで一応所望のMIDI→OSC変換が出来ました。次回は運用周りのTipsとハウジングの3Dプリントについてまとめます。Unity目当ての方は期待せずにもう少しお待ち下さい。

コメントを残す

メールアドレスが公開されることはありません。