月別アーカイブ: 2013年11月

MIDI to OSC Deviceの試作とUnityを用いたVJについて 6 (まとめ)

2013.11.04りんご飴音楽祭@渋谷WWWでのAZUMA HITOMIさんのVJの技術的なことについて書きました。やっつけで作るとまとめが大変だとわかりました。書いてるうちに渋谷2.5Dでも少しVJしました。

まとめ

ハードからPCまで、雑ですが構造だけ書いた感じです。

今後の課題

今のところ、VJソフトが付け焼き刃ですので、もっと色んなモデルやシェーダを作り、Unityを活かしたいと思っています。(Linuxの開発環境マジでおねがいします!)
また、操作性が非常に悪いので、そのへんも課題です。どうせなら操作もOSCかNIDでやりたいな。タブレットのマルチタッチをOSCで送るとかも便利そう。
また、デバイス側ですが、かなり処理能力的に余裕があると思っていて、様々な発展が可能と目論んでいます。BeagleBoneBlackはRaspberry PiやArduinoより遙かに重い処理が回せるはずです。
例えばKinect,XtionなどのNIDでモーションキャプチャしてOSCに乗せて飛ばすとか。実はUnityからOpenNIを呼んだVJはすでにやったことがあるのですが、OpenNIがARM対応したことですし、今後無線化してみたいと思います。

Demo

今回使用した1シーンをUnity Web Player向けにビルドしてみました。
キーボードの数字キーでなんか飛び出します。MIDIのNoteOnの代わりと思ってください。GUI領域のスライダで回転スピードが変わります。って全然MIDIのデモになりませんが、ご了承ください。。
[unity src=”33508″ width=”480″ height=”360″]

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

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

3DゲームエンジンUnityでのOSC受信処理とVJへの応用

前回まででデバイスとネットワーク関係が整ったので、PC側の実装に入ります。

3Dゲーム開発環境Unityについて

今回のVJでは、本来は3Dゲーム開発環境であるUnityを使いました。Linux界隈の人はUbuntuのGUIと紛らわしいですね。Unityは開発環境が使いやすく、物理エンジンなども統合されていて、インタラクティブなVJ用途にも使えると思い使ってみています。実際、かなり短期間で色んな3Dモデルを取り込んで自由に動かすことができました。
素晴らしい開発環境なのですが、個人的には以下の2点で不満もあります。
まず、Linuxで動く開発環境が無い。正直、このためだけにWindowsを使っています。オフィシャルページにも要望が上がっていて、投票もしていますので、ぜひみなさんも投票してみてください。
もう一つは、バージョン管理システムへの対応がイマイチな点。これに関しては徐々に改善しているらしいので、僕の勉強不足なのかも。

Unityでマルチディスプレイを使用したVJについて

というわけで、物理エンジンをゴリゴリ使ってVJするぜ!と思ったんですが早速問題がひとつ。Unityでは複数のWindowを扱うプログラムを作成できないっぽく、一般的なVJソフトのような操作・Preview画面と出力画面の2画面構成がとれません。たぶん。GUIを一切廃してフルスクリーン1画面にするという手もありますが、さすがに不便です。
そこで今回は、PCをデュアルディスプレイに設定し、VJ出力として使うディスプレイを覆い隠すような大きいWindowを作ることにしました。
unityvjwindow
Window左側にGUI専用画面を用意することで、1つのWindowで出力と操作をする苦肉の策です。
幸い、Unityではカメラオブジェクトの設定により、簡単に上記のような画面構成をとることができます。カメラコンポーネントのNormalized View Port RectのXでWindow内のカメラ表示領域の開始位置を、Widthで幅を設定できます。
unityvjcamera
空いた左側の領域にはGUIを並べたり、情報を表示するわけですが、このままだとシーン切り替えがあった時などに背景がクリアされずに表示が乱れてしまいます。そこで、カメラをもう一つ配置し、GUI領域の背景を描写させました。ProjectionはOrthographicにして、Sizeは0.01とか、最小限に設定します。背景色はVJ画面と区別できる単色にしておきます。さらに、Audio Listenerなど、不要なコンポーネントを削除しておきましょう。そうしないと警告が出ちゃいます。
こうすることで、一般的なVJソフトのように操作画面とVJ出力画面を作れます。複数のシーンで使用することを考え、Prefabを作っておくといいと思います。でもWindowサイズを調整したり、操作中にWindowを最小化しちゃうリスクとかがあるので、もっと良いやり方があれば知りたいところです。

UnityでのOSC受信

作成したデバイスからはPCのIP宛に所定のポートでOSCが流れており、Unityで受信するわけですが、UDPの受信動作をどう実装するかも迷ったポイントの一つでした。
僕はC#のUDP送受信に関しては実装した経験はあるのですが、Unityの流儀的にこういったグローバルな動作をどこでするのが綺麗なのかイマイチわかっていません。動作としてはInputクラスなどが似ているかな、と思うのですが、無理やりStaticに実装するのも変な気がします。
結局今回は、子のGameObjectにBroadcastMessageを投げるスクリプトを作ることにしました。このスクリプトをルートになるようなGameObjectに持たせて、OSC受信を担当させます。OSCによって変化させたいオブジェクトはすべてこの中に配置しました。(ただ、このへんは将来、先のInputクラスを真似た実装にできないかと思案中です。)
OSC受信部分は、みなさん参考にしているらしいこちらのサンプルを参考にしています。
OSC受信を担当するGameObjectには、OSCのParserスクリプトも配置します。OSC受信スクリプトはとりあえずGameObject内のParserにSendMessageし、Parserが内容を見て、必要であればBroadcastします。今回はMIDIデータを使いたいので、メッセージ種類に応じて扱いやすい構造体にしてBroadcastするParserを作りました。例えば、NoteOnがきた時だけ整数配列を送るとか。
このようなルートになるGameObjectを作ることで、中のオブジェクト(のスクリプト)は決まった名前の関数を作るだけで、扱いやすい構造のMIDIメッセージ構造体を受け取れます。今回のVJでNoteOnに応じて物体を動かすスクリプトは、例えばこんな感じ。

void OscMidiNoteReceive(NoteOnMsg msg)
{
  var modnum = (msg.num/2) % Mod;
  if(modnum == Num)
  {
    StartMove();
  }
}

ちょっと詳細な構造をまとめる時間がないので雰囲気だけで申し訳ないですが、ノート番号を定数で割った余りが自分に指定されている番号と一致すれば、動作開始しろってことです。OSC受信オブジェクトによって、中の動作はとても簡素化できます。
ということで、簡単ですがUnity製VJプログラムの構造を書いてみました。そのうちコードサンプルなどをもっと入れてまとめられるといいな、と思います。

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

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

MIDI→OSC変換基板の筐体製作と小型WiFiルータと組み合わせた遠隔操作

前回まででデバイスの機能は実装できましたが、ライブで使用するには色々と詰めが必要でした。

MIDI→OSC変換基板の筐体製作

まずなんといっても、最初は基板むき出しの配線モジャモジャです。少なくてもカバンにつっこめる程度のハウジングが必要です。コネクタも固定して、MIDIのDIN5端子の挿抜に耐えられなければいけません。
midicast_housing
そこで、αの所有する3Dプリンタでハウジングを印刷することにしました。モデリングはあまり経験がなかったので、まずはモデリングソフトに慣れるところから、という感じでした。Google sketchupとAutodesk 123D Designが候補ですが、検討の結果Sketchupを使用しました。理由としては、以前に少しだけいじったことがあることと、DAE出力ができ、Unityにモデルをインポート可能なこと、ギャラリーが充実していることが挙げられます。
コネクタ穴を開けただけの簡単な箱を作って、αに印刷を依頼しました。当初素材にABSを使用しましたが、反りが激しく失敗しまし、PLA樹脂を購入して再挑戦したところ、無事印刷が出来ました。
PLA樹脂はコネクタを取り付けるネジもなんとか止まる程度に硬度があり、なかなか便利そうです。基板からコネクタまでの配線などの都合でわりと大きめの箱になってしまったところは今後の改善点ですが、持ち運びや端子挿抜はできるようになりました。

小型WiFiルータ周りのあれこれ

ライブでの使用を想定すると、無線LANでの運用は必須です。製作初期には有線LANで試験していましたが、無線化するところで色々ハマりました。
まず、有線LANではOSCメッセージを255.255.255.255に投げていたのですが、無線にしてみると急にパケット落ちが激しくなることがわかりました。最初は無線が不安定なのかと思いましたが、試しにユニキャストにしてみると問題なく送信できました。最近のネットワーク機器は頭がいいんですねー。仕方ないので、引数で指定した複数のIPに投げるように仕様変更しました。
しかしここで問題が発生しました。メンバーのIPをすべて固定にするのは面倒なので、DHCPを使いたいのですが、ルーターで割り振るIP範囲を指定する機能がないのです。またもや仕方ないので、小型ルーターMZK-RP150Nを買いました。ポイントは

  • DHCPサーバーが割り振るIP範囲を指定できる
  • ルータ、アクセスポイント、コンバータの3モードがある
  • アクセスポイント間通信または無線リピータ機能がある
  • USB給電可能

の4点です。これであらゆる配置やネットワーク構成に対応できると思っています。
midicast_wdsap
渋谷WWWに来ていただいた方は見た通り、今回はVJ部屋が別部屋になっていたので、さらに同じルーターをもう一つ使ってリピータを用意しておきました。小型USB充電器と合わせたり、モバイルバッテリーと組み合わせてどこでもWifi範囲を拡張できます。
こうして、かなりの広範囲でOSCを送受信出来る環境が整いました。

BeagleBone Black遠隔操作のあれこれ

デバッグなどの都合上、Wifi経由のSSHでBBBにログインして遠隔操作することが多くなりますが、無線を使用すると特に接続が不安定になりがちです。そして、ふつうにSSHから起動したプロセスは、接続が一時的に切れるだけで終了してしまいます。これは致命的な問題になります。
当初はBBBのGUIにVNCでアクセスすることも考えましたが、帯域を圧迫するしGUIは必要ありません。こういう場合はscreenコマンドで仮想端末を作ると良いです。この解説がドンピシャです。SSHしたらとりあえずscreenする癖をつけると、起動したプロセスに再接続できるようになります。

クラブやライブ会場は、リハで初めて現場環境がわかる事が多く、こういったインフラ周りは重要かつ苦労するポイントだと思います。
次回はようやくこのデバイスとUnityを使ってOSCを受信してみます。

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目当ての方は期待せずにもう少しお待ち下さい。