Node for Max を用いて、定形外のUDPデータを受信 #Max8 #n4m

Maxの生命線UDPで問題が・・・

他のアプリを繋いでくれる updreceive

センシングや3D(Unity / UE / Arduino) 等とのコミュニケーション時に重宝するudprecieve ですが、udpを受信する場合に、メッセージが4bytesに揃っていなかったり長すぎた場合にアトリビュートなどの設定やOSC-routeを利用しても上手く受信できない事があります。

OSC Bad message name string: DataAfterAlignedString: Unreasonably long string Dropping entire message. / OSC packet size not a multiple of 4 byte dropping.

Max内にどうにかする方法としてNode for Maxが利用できます。

Node for Max で UDP receive

node object は、とりあえずHelpからコピペでOK

node.script objectjs をHelpからコピペし、ダブルクリックするとテキストエディターが開くので書き換えます。Maxのテキストエディタはクソなので、VS Code使ってます。

udpreceive.js

const dgram = require('dgram');
const IP = '192.168.1.1';
const PORT = 8888;
const socket = dgram.createSocket('udp4');
socket.on('listening', () => {
    const address = socket.address();
    console.log('UDP socket listening on ' + address.address + ":" + address.port);
});
socket.on('message', (message, remote) => {
    console.log(remote.address + ':' + remote.port +' - ' + message);
	/*
		処理
	*/
});
socket.bind(PORT, IP);

とくに外部ライブラリを入れる事なくできました!JS的に正しい書き方なのかは謎。外部ライブラリのOSC-routeなどを使わなくても、テキスト処理はスクリプト言語の十八番でしょうから楽ちんです。

感想

昔、VJソフトのあのタグをつくるためにMaxのjs objectを触っていた頃は、jsの文法を読んで型なしでプロトタイプ継承とか難しいなと思い、深入りしませんでした。時は経ち最近のjsは今どきな文法が色々あって使いやすくなってそうです。

Node.jsやnpmエコシステムなどでは当たり前の事が、Maxおじさんからすると凄いみたいな事は非常に沢山ありそうです。(Blogを適当に放置してる事から分かるように)今までネットワーク / スクリプト言語は触れないように生きてきましたが、そろそろNode.jsから色々触ってみようかなと思いました。

Reference

UniOSCとMaxを使ったOSCの送受信 #Max7 #Unity #OSC

UniOSC購入&起動

UniOSCをUnity Asset Storeで購入し、UniOSC.Mobile Sceneを起動します。

iOSアプリをインストール

Build SettingをiOSにし、Xcodeでビルドインストールします。iPhone6sで実行すると画面レイアウトが崩れますが、とりあえず気にしなければテストはできます。また私の環境だとなぜかIPアドレスがおかしい値になっています。が気にしなくても動きました。OSC OUT側のIPアドレスはMaxが動作しているMacやPCのIPを入力しておきます。

MaxでOSCのRecieve Sendパッチ作成

Max側は、OSCを送受信ですがUDPのオブジェクト使って準備しました。udpsendのIPアドレスにはiPhoneの設定画面で確認したIPアドレスを入力しておきます。また送信側のメッセージにはOSCのフォーマットに合うようにスラッシュをprependしておきます。(そうじゃないと確認できない。)

通信確認

MaxのSender側のスライダーを動かすと、UniOSC appのTraceに受け取れた事が表示されます。逆にUniOSC app側のSendボタンを押せば、Max側で受信を確認できました。