UnityOSC で OSC を送信する / MaxMSP で受信する

Unityのロゴ。

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 MSP で作ったパッチ。udpreceive オブジェクトを使って、受信したメッセージを Message オブジェクトに流している。

図は実際に 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 の送受信を確認することができます。