processingでバーチャルキャストのOSCを操作する
とりあえず表題通り
processingだと割と楽にOSCを扱うことができるので、簡単な操作ができるとこまではできる限り説明したい
準備するもの
-
バーチャルキャスト
必然的にVR環境は必要 またOSCが動くのはPC版のみなのでQuest版は今回はごめんなさい -
Processing
お手軽プログラミング環境 - あとは必要に応じてTouchOSCとかprotokolとかOSC関係のデバッグ用の何かがあると便利
Processingをはじめてみる
ダウンロードしたzipを適当なとこに展開し、processing.exe
を実行
こんな画面が出ます
いろんなとこで面白いサンプル転がってるので見てみるといいよ
ニコ動とYouTubeでは過去にわたしがprocessing使ったプログラムの話題出してたりするのでそこのソースもあるよ(大したものじゃないけど)
OSCを使えるようにする
ツールメニューのManage Tool...より
ここでLibrariesを選びOSCで検索すると
oscP5ってやつを選んでInstall
完了したらエディタに戻ってファイルメニューからサンプル...を開く
Contribute Libraries-->oscP5-->oscP5messageをダブルクリック
OSC送受信のサンプルが開くのでこれをちょこちょこいじる
26行目
myRemoteLocation = new NetAddress("127.0.0.1",12000);
アドレスとポート バーチャルキャストのデフォルト受信ポートに合わせて19100に
34-45行目 mousePressed()の中
void mousePressed() {
/* in the following different ways of creating osc messages are shown by example */
OscMessage myMessage = new OscMessage("/test");
myMessage.add(123); /* add an int to the osc message */
myMessage.add(12.34); /* add a float to the osc message */
myMessage.add("some text"); /* add a string to the osc message */
myMessage.add(new byte[] {0x00, 0x01, 0x10, 0x20}); /* add a byte blob to the osc message */
myMessage.add(new int[] {1,2,3,4}); /* add an int array to the osc message */
/* send the message */
oscP5.send(myMessage, myRemoteLocation);
}
36行目のmyMessageを作るところで("/test")
がヘッダーなのでVCIで受信できるように合わせる(これはVCI毎に決めるのでどれがいいとは一概には言えない わたしのスケッチブック型メッセージボードに送るなら/vci/pio/message
とか)
38から42行目は実際に送られるデータ 上からInteger, float, string, blob, array(これはVキャスでは未対応)
わたしのメッセージボードならblobで受信できるので41行目以外コメントアウトして41行目に送信したいメッセージを書く
文字列そのままだと送れないのでbyte型配列に変換しなきゃいけないのがちょっと面倒だけど
// myMessage.add(123); /* add an int to the osc message */
// myMessage.add(12.34); /* add a float to the osc message */
//myMessage.add("some text"); /* add a string to the osc message */
myMessage.add(new String("aaaaa").getBytes()); /* add a byte blob to the osc message */
// myMessage.add(new int[] {1,2,3,4}); /* add an int array to the osc message */
これを実行すると黒いウィンドウが出てくるので、それをクリックしたらOSCメッセージが送れます
ログを取るとこんな感じ
RECEIVE | ENDPOINT([::ffff:127.0.0.1]:xxxxx) ADDRESS(/test) BLOB(6161616161)
ただこれで日本語を送るときれいなまでに文字化けするので、その対策として送信メッセージをUTF8に変換しなきゃいけない
ということで文字コード変換の定義をインポート
9行目辺りにこれを入れる
import java.nio.charset.StandardCharsets;
そして送信メッセージ部分は
myMessage.add(new String("aaaaa").getBytes(StandardCharsets.UTF_8)); /* add a byte blob to the osc message */
getBytes()のカッコの中身が追加
これで日本語も送れます
ひとまずデバッグにはこの程度で充分な気がしてならない
いきなりの寄り道:各言語環境でのOSCライブラリ
意外と知られていない感じがしたので
- Unity : uOSCなど
たぶんUnity製のVキャスも使ってるであろうUnity/C#で使用できるライブラリ - .NET(C#) : sharpOSCなど
Unityではない.NET環境ではsharpOSCとか実はけっこういっぱいある - nodejs : node-oscなど
これも実装は何種類かあるけどblobUTF8を送れなかったりパラメータ複数送るの大変だったり悩みは尽きない できないわけではないけど - python : python-oscなど
こっちもいっぱいある まあそれなりに使いやすい - windowsコマンドライン : sendosc.exe
CUIからの送信もできる ただし日本語を送る場合shellのコードページに注意 - java : javaOSC
実はあんまり使ったことない - processing : p5OSC
p5はprocessingのこと むかしprocessingという単語が一般的すぎてドメインも取れなかったのでproce55ingと表記していた事があり、略してp5になったという伝説 - スマホ : TouchOSC
PCでUI作ってスマホに転送してそこで操作するという形式
有料アプリだけど使いこなせればどれよりも便利
VirtualCastからOSCを受信する
受信するだけならそんな難しくはないのでメモ
oscP5でメッセージを受信すると void oscEvent(OscMessage, theOscMessage)
に飛ぶのでそこで記述
受信時のアドレスはtheOscMessage.addrPattern()
で取得可能
メッセージの中身はtheOscMessage.get(0).floatValue()
みたいな感じで取得
getの数値はパラメータの数
floatValue()以外にも型に合わせてデータ取得をするべし
println(theOscMessage.print());
とかで受信データの中身見とくと良いかも