OSC (Open Sound Control) は伝統的(笑)にOSC-Kitを使ってたけど、これは本家でも古いと言われるコードなので、最近はVVOSCを使うことが多い。このVVOSCは、vvopensourceなるオープン・ソース・フレームワークの一部で、Objective-Cインターフェースでキレイにデザインされてて、機能も申し分ない。サンプルとして提供されているOSCTestAppを見れば、何をサポートしているか一目瞭然。デベロッパでなくてもOSCの送受信チェックに便利だから、Downloadsからビルド済みのアプリをダウンロードね。
ただし、VVOSCはOS Xがメイン・ターゲットらしく、サポートされているとは言え、iOSではイマイチ。これまで何とか修正していたけど、iOS 5 & Xcode 4.2になって再びビルドが通らない。そこで、本来推奨されているスタティック・ライブラリではなく、ソースをプロジェクトに取り込んだのが以下の手順。
(1) ターミナルを開き、ソースをsvnで入手。Xcodeのレポジトリに登録してチェックアウトしてもOK。
(2) ソースからVVOSCとVVBasicのフォルダをプロジェクトのフォルダにコピー
(以下、コピーしたフォルダでの作業で、OS X関連などのファイルを削除する)
(3) VVOSCフォルダからAppSrcとDoxyfileを削除
(4) VVBasicsフォルダからDoxyfileとInfo.plistを削除
(5) VVBasicsフォルダのsrcフォルダから VVCrashReporter〜.〜 VVCURLDL.〜 VVSprite〜.〜 を削除
(ここからはXcodeでの作業)
(6) VVOSCフォルダとVVBasicフォルダをプロジェクトに追加
(7) プロジェクトのBuild SettingsのApple LLVM compiler 3.0 – LanguageのOther C Flagsに -DIPHONE を追加
(8) ビルドしてエラーの出る箇所を修正
#import <VVBasics/〜.h> を #import “〜.h” に修正
OSCStringAdditions.h に #import “MutLockDict.h” を追加
ビルドが通れば、VVOSCを利用してOSC通信を行うのは簡単。
まずはヘッダをインポート。
#import "VVOSC.h"
そしてOSCマネージャを作って、デリゲートを指定。
OSCManager *manager = [[OSCManager alloc] init]; manager.delegate = self;
出力ポートを作って送信。
OSCOutPort *outPort = [manager createNewOutputToAddress:@"127.0.0.1" atPort:1234]; OSCMessage *message = [OSCMessage createWithAddress:@"/test"]; [message addInt:100]; [outPort sendThisPacket:[OSCPacket createWithContent:message]];
入力ポートは作るだけ。
OSCInPort *inPort = [manager createNewInputForPort:1234];
実際に受信するとデリゲートが呼ばれる。
- (void) receivedOSCMessage:(OSCMessage *)m { NSString *address = m.address; OSCValue *value = m.value; if ([address isEqualToString:@"/test"]) NSLog(@"%d", value.intValue); }
はい、おしまい。
【追記】以前に比較したように、VVOSCは処理速度がやや劣っている。これは現在のバージョンでは改善された様子だけど、タイミングがシビアな用途には向かない場合があるかも。