Open3

processingでバーチャルキャストのOSCを操作する

PioPio

とりあえず表題通り

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()のカッコの中身が追加
これで日本語も送れます

ひとまずデバッグにはこの程度で充分な気がしてならない

PioPio

いきなりの寄り道:各言語環境での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作ってスマホに転送してそこで操作するという形式
    有料アプリだけど使いこなせればどれよりも便利
PioPio

VirtualCastからOSCを受信する


受信するだけならそんな難しくはないのでメモ
oscP5でメッセージを受信すると void oscEvent(OscMessage, theOscMessage) に飛ぶのでそこで記述
受信時のアドレスはtheOscMessage.addrPattern()で取得可能
メッセージの中身はtheOscMessage.get(0).floatValue()みたいな感じで取得
getの数値はパラメータの数
floatValue()以外にも型に合わせてデータ取得をするべし
println(theOscMessage.print());とかで受信データの中身見とくと良いかも