UnityOSC で OSC を送信する / MaxMSP で受信する
Unity で OSC を送受信するためのライブラリはいくつかありますが、 ここでは資料が多く見つかる UnityOSC を使って OSC を送信する手順についてまとめておきます。 送信した OSC は MaxMSP で受信して確認します。
送信版の記事が出来ました「UnityOSC で OSC を受信する / MaxMSP で送信する」。
UnityOSC の設定
UnityOSC のパッケージをダウンロードしたら、UnityOSC/src フォルダを Assets に取り込みます。
直下にあるソースコード OSCHandler は、OSC を送受信するための機能を持っています。UnityOSC ではこのファイルを直接書き換える必要があります。 (その点が唯一ネックです。もちろんそうしなくて済むように改変しても良いです。ここではわずかに改良しています。)
public void Init(string serverId, string serverIp, int serverPort)
{
//Initialize OSC clients (transmitters)
//Example:
CreateClient(serverId, IPAddress.Parse(serverIp), serverPort);
//Initialize OSC servers (listeners)
//Example:
//CreateServer("AndroidPhone", 6666);
}
OSCHandler の Init メソッドを確認します。 OSC を受信するときは OSC clients, 送信するときは OSC servers を編集します。 (送信側なのか受信側なのかも少々分かり難いネーミングかも?)
編集するといってもコメントアウトを解除すればよいです。ここでは Unity で OSC を送信するので、OSC clients 側の CreateClient のコメントアウトを解除します。
OSC を送信するスクリプト
OSC を送信するためのスクリプトを用意します。ここでは OSCController.cs とします(多くのサンプルが OSCController です)。 まずは 先に用意した OSCHandler のインスタンスを生成して初期化します。
public string serverId = "MaxMSP";
public string serverIp = "127.0.0.1";
public int serverPort = 12000;
…
void Start ()
{
OSCHandler.Instance.Init(this.serverId, this.serverIp, this.serverPort);
}
OSCHandler は Singleton クラスです。これを用意された Init
メソッドによって初期化します。
引数は (送信先の ID, 送信先の IP アドレス, 送信先のポート番号) です。ここで ID については適当に命名してもとりあえず良いです。
任意に定める必要がある場合もあるでしょうが、ここでは割愛します。
オリジナルの UnityOSC では、OSCHandler のソースコードを直接書き換える必要があります。
public string serverId = "MaxMSP";
public string serverIp = "127.0.0.1";
public int serverPort = 12000;
public KeyCode debugKey = KeyCode.S;
public string debugMessage = "/sample";
…
void Update()
{
if (Input.GetKeyDown(this.debugKey))
{
OSCHandler.Instance.SendMessageToClient
(this.serverId, this.debugMessage, Time.timeSinceLevelLoad);
}
}
ここでは Update メソッドで特定のキーを入力したときに OSC を送信することにします。
OSC の送信には OSCHandler.Instance.SendMessageToClient
メソッドを使います。
引数は (送信先の ID, 送信するメッセージ, 送信する値) です。ここで送信するメッセージとは、OSC のフォーマットに従ったもので、
例えば /sample
などです。
また同じ PC 内で実行されている Max MSP に送信して試験するため、ローカルホスト 127.0.0.1 に OSC を送信することにします。 ポート番号についてはウェルノウンポートなどと衝突しなければ何番でも良いです。 必要に応じて適切な IP アドレスとポート番号を指定します。
ここで実装した OSCController
を適当な GameObject に追加すれば OSC を送信する準備は完了です。
Max MSP (など) で受信する
音操作などのために良く利用される Max MSP を使って OSC を受信してみます。Max MSP は有料ソフトですが、無料でも送られてきた OSC の受信を確認することができます。 ライセンスしない間は、制作したパッチ(ファイル)が保存できない制限が付きます。
あらかじめ説明しておくと、ここでは OSC を Max MSP 内で解析するところまでは触れず、OSC 形式で送られてきた UDP を Max MSP で受信するところまでを解説しています。 したがって、必ずしも Max MSP を使う必要はなく、UDP を受信するほかのアプリケーションや、そもそも OSC を解析できる異なるアプリケーションを使えば良いと思います。
図は実際に Max で作成したパッチです。非常にシンプルな構成なので Max の使い方が分からなくてもこれくらいは作れると思います。 上のツールメニューから Object, Button, Message をそれぞれ 1 つずつ追加します。
Object は様々な機能を提供する部品です。udpreceive ポート番号
を入力すれば、UDP で送られてくるデータを受信するための機能が完成します。
ここで指定するポート番号は、Unity 側で OSC を送信するときに指定するポート番号と一致している必要があります。普通は送信側が合わせるでしょう。
図は実際に OSC を受信した結果を見せているので、Message 部品の中身は空にしておいて良いです。空にしていなくても問題はないのですが、空にしておきましょう。
udpreceive
から Button と Message にそれぞれ線を繋ぎます。繋ぐ先に注意してください。
繋いでおくと、udpreceive
に受信した結果が、Button と Message に反映されるようになります。
図は実際に受信した状態で、sample/ 時間
形式で送られてきたデータを表示しています。
検証する
Unity と Max を同時に起動した状態で、Unity から OSC を送信してみましょう。Max MSP 側で、Message オブジェクトに Unity から送信した OSC の内容が表示されれば成功です。 また Button オブジェクトが一瞬点滅します。
パッチを作らなくても UDP Tester がある
Max MSP には [ツールバー > Extras > UDPTester] が用意されていて、これを使えばパッチを作らなくても UDP の送受信を確認することができます。