RTCGatewayとは?
RTCGatewayはCycling’74社のMax(MAX/MSP)とRTミドルウェアである産業総合技術研究所開発のOpenRTM-aistとの間でデータ交換を行うことができるプラグインです。MaxのExternalオブジェクトとして実装されており、Max側ではRTCオブジェクトとして、RTM側ではRTコンポーネントMAX_MSP_RTCとして扱われます。
Max(MAX/MSP)はシンセサイザーのコントロールのためのビジュアルプログラム環境として開発されましたが、現在はリアルタイム音響処理、映像処理・生成、MIDI・様々なデバイスのコントロールに対応しています。オブジェクトと呼ばれる特定の機能を持った部品同士を線でつなぐ(Patch)ことでプログラミングができるようになっており、音楽表現、舞台演出、メディアアートなどのインタラクティブなシステム開発にとって強力なツールとなっています。対してOpenRTM-aistはコンポーネント志向のロボットシステム開発環境RTミドルウェアの実装です。C++ , Python, Javaで動作し、他の人が作ったコンポーネントを再利用することでロボットシステム開発の効率化を狙っています。
RTCGatewayを導入することでMaxで主にロボット用に開発されたRTコンポーネントを比較的簡単に利用することができます。例えばロボットを用いたメディアアート作品の制作の際、音や映像といったインタフェースとロボット制御との間でのデータ交換を行うことも可能です。
現在、Mac OSX 10.8 Mountain Lion+ Xcode 4 or 5 + Max 6 で動作確認しており、尾形研究室のGithub(https://github.com/ogata-lab/RTCGateway)上で配布しています。
※使い方によってはMaxが強制終了することがあります。自己責任でご利用ください。
RTCGatewayビルドの仕方
Githubからレポジトリをクローンします:
git clone https://github.com/ogata-lab/RTCGateway
RTCGatewayは以下の2つをサブモジュールとして利用しています。
MAX 6のエクスターナルオブジェクト開発SDK(https://github.com/Cycling74/max6-sdk)
Mac環境下でのRTミドルウェア開発SDK(https://github.com/ogata-lab/rtmsdk-mac)
クローンしたディレクトリ内で以下のコマンドを実行してください:
git submodule init git submodule update
問題なくサブモジュールがクローンできたら以下のコマンドでビルドを行います:
./build.sh
build.shと同じディレクトリにRTC.mxoが生成されます。これがMaxのExternalオブジェクトであるRTCオブジェクトの実行ファイルになります。
使い方
クローンしたファイルの中にあるRTC.maxhelpはMaxで開くと対応データ型をすべて使ったサンプルになっています。とりあえず使いたい場合はこれらをコピーしてPatcherに組み込むことができます。以下ではMaxのインストールとRTC.mxoの設定、ポートの追加方法とコンポーネントのアクティブ化について説明します。
Maxが入っていない場合はまずインストールを行います。
http://cycling74.com/
内の[Download Max]よりMax 6をインストールしてください。
ダウンロードしてから30日間はデモ(無料)で使用することができます。
スタートアップよりNew Patcherを選択します
Patcherウィンドウが表示されます。
RTCオブジェクトをPatcherウインドウに配置します。MaxでExternalオブジェクトを使用するためにはオブジェクトが置かれているディレクトリパスをMaxに指定する必要があります。RTC.mxoを任意のディレクトリに置き、そのパスをMaxの[Options]→[File Preferences]に追加してください。
追加後にMaxを再起動する必要があります。
再起動後、BasicからObjectをドラック&ドロップでPatcherウインドウに配置します。
配置されたObjectに「RTC」と入力してください。画像のように候補でRTCオブジェクトが表示されます。
RTCオブジェクトが表示されると、RTシステムエディター上に「MAX_MSP_RTC」が非アクティブ状態で生成されます。このままではデータポートを持っていないので他コンポーネントと通信ができません。そこで、Max側でオブジェクトを配置することでデータポートを作ります。
2013年11月末日現在、RTCGatewayは以下のデータ型に対応しています。
- TimedLong型
- TimedDouble型
- TimedPose2D型
- TimedVelocity2D型
- TimedBooleanSeq型
- TimedUShort型 (new!)
- TimedPoint2D型 (new!)
ここではTimedLong型のインポート、アウトポートを作成します。RTCオブジェクトを配置した状態で、新たにBasicからObjectをPatcherウインドウに配置し「RTC LongIn in0」と入力します。
ここで入力した「RTC LongIn in0」は型とポートの種類を指定する特定の文字列です。フォーマットは
RTC [データ型名] [ポートの種類( In または Out)] [ポート名]
となっており、データ型名は以下のように対応しています。
- TimedLong型 -> Long
- TimedDouble型 -> Double
- TimedPose2D型 -> Pose2D
- TimedVelocity2D型 -> Velocity2D
- TimedBooleanSeq型 -> BooleanSeq
ポートの種類は頭文字が大文字なので注意してください。ここで指定したポート名でがMAX_MSP_RTCが作成され、ポートをつなぐことができるようになります。
ポートを作成したらMAX_MSP_RTCをアクティブ状態にします。RTCオブジェクトに「activate」メッセージを送るか、RTシステムエディター上の再生ボタンでアクティベーションができます。非アクティブ状態にするときは「deactive」メッセージを入れるかRTシステムエディター上で停止ボタンをクリックしてください。
maxhelpについて
RTCオブジェクトのヘルプファイルとして、RTC.maxhelpファイルが同梱されています。現在使用できるすべてのポートを使ったサンプルになっているのでここからでも動作確認等を行えます。
使用時のポイント
Point2DやBooleanSeqといった配列形式のデータを受け渡しを行う場合には注意が必要です。
RTCGatewayはRT側の周期(1000.0 fps)でデータの受け渡しを行っています。しかしMax側で周期的に数値を更新するためには、packまたはunpackオブジェクトに定期的にbangメッセージを送ることをおすすめします。
Maxの原則として、左端の値が変更されたことがトリガーとなってpack/unpackが実行されます。そのため、Pose2Dなどの場合、xの値が一定でyの値のみが変化するような場合はトリガーを与えないとMax側で値の更新が行われません。metroオブジェクトなどで一定周期でbangメッセージを送ることで解決することができます。