記事一覧

ObjCOSC and Cocos2d Scene

シーン(Cocos2dのSceneですね)を切り替える場合、ObjCOSCの入力ポートの扱いはどうするのが正しいんでしょうね?
入力ポートを使うのは1つのシーンだけなので、該当シーンの init に入力ポート作成処理、dealloc に破棄処理を書いてみたのだけど、別のシーンに行って戻ってきたときにポートの再開に失敗する。
エラー的には
"Could not bind UDP socket for OSC".
というもので、これはおそらく最初に作ったポートが生きていて、もう一度作ろうとしても作れないという理由なんじゃないか・・・と思うのだけど詳しく調べる気力がないので別の方法で逃げました;
別の方法というのは、シングルトンを1コ作って、そっちに OSC受信を担当させるというもの。メッセージが来たらそれをディスパッチする。
で、実際に受信時処理が必要なシーンに入ったら、そのシーンをデリゲートとして登録してディスパッチを受ける。逆に要らないときはデリゲートを nil にする、という感じ。

What's the right way to manage ObjCOSC Input Port when changing the scene (<- I mean Cocos2d Scene)?
I need to activate OSC Input Port in only one scene, so I put the codes to make the port in the scene's init routine,and releasing codes in dealloc routine.
But it fails to restart the port when go to and back from other scenes.
The error is
"Could not bind UDP socket for OSC".
What does this mean?
My guess is, the port I first made still remains alive and cannot make new one.
If I did some tests I may be able to figure it out, but I don't have the energy to give it a go;
So I've added a singleton to my project and let it have the OSC Input Port so that the port keeps alive between scenes.
The singleton only does the dispatching OSC messages to the delegate. When entering the scene register itself as the delegate, and when leaving reset it to nil.

Receiving by ObjCOSC

とりあえずよくわからないので、まずはココ
http://d.hatena.ne.jp/soundflower/20090425/1240618558
を参考に ObjCOSC ベースで受信プログラムを組んでみたらあっさりできました。

ただ、ちょっとハマったのが、そこに載ってるコードだけではダメで、最後に
[portIn start];
を入れないとダメなのでした;
ObjCOSC に添付の main.m を見て初めて気づきました。ていうか、上記リンクのコード自体、ほぼこの main.m を見てれば分かる話でした;

I let the problem I wrote in my last post aside and start coding receiving program based on this issue:
http://d.hatena.ne.jp/soundflower/20090425/1240618558 (in Japanese)
As result, it worked:)

There was only one thing I was stuck in:
You have to write this after the port settings to make it work
[portIn start];
which is not written in the code in the URL above.
I noticed later that all of these are written in the sample code included in the ObjCOSC package as "main.m"...

OSC - receiving

I'm testing receiving OSC message by iPhone using TouchOSC, sendOSC, dumpOSC and OSCulator, but there seems to be something strange.
When I send message from OSCulator TouchOSC does react, but from sendOSC it doesn't.
I checked the message string from OSCulator by receiving it by dumpOSC and send exactly the same from sendOSC, but TouchOSC still doesn't react.
Why????


OSC メッセージを iPhone 側で受信するテストとして、TouchOSC と sendOSC, dumpOSC, OSCulator などでメッセージの仕組みを見ているところなのだけど、どうも sendOSC からメッセージを送ると TouchOSC が反応してくれない。
OSCulator から送ると動くんだけど。
変だと思って OSCulator から送ったメッセージを dumpOSC で受信してみて、その通りに sendOSC から送ってみたんだけどやっぱり反応なし。
どういうこと???

ObjCOSC - sending MIDI notes to OSCulator

ObjCOSC で MIDIノートをOSCulatorに送るのは非常に簡単で、iPhone側は
[port sendTo:"/action" types:"f", 1.0f];
みたいに書いて、あとはOSCulatorの方で "/action" に希望のノートナンバーを割り当てればいい。

でも連続してノートを送ろうとすると、/action の値を一旦リセットしないといけないのがちょっと厄介。
というのは、OSCulatorは各アドレス(ここでは /action ですね)について前回送信した値を覚えていて、その値から10%以上変化した値を送らないと無視してしまうのであります。
とりあえずこんな感じで対策しました。
cocos2dベースのコードですが("schedule:" は CCNodeのセレクタなので)、NSTimerを使えば同じことができると思われます。


// どこかのメソッドの中
[port sendTo:"/action3" types:"f", 1.0f];
[self schedule:@selector(sendNoteOff:) interval:1.0f];

// セレクタをひとつ追加
-(void) sendNoteOff:(ccTime)dt
{
[self unschedule:@selector(sendNoteOff:)];
[port sendTo:"/action1" types:"f", 0.0f];
}


Basically it's pretty easy to send MIDI notes to OSCulator by ObjCOSC.
Just write like this on your code,
[port sendTo:"/action" types:"f", 1.0f];
and assign desired note No. to "/action" on OSCulator.

But if you want to repeat this action, you have to reset the value to 0.0f before sending the next one.
This is because OSCulator remembers your last value you have sent to the address (in this example "/action"),and ignores the input message unless the value differs over 10% from the last value.

I did like below to manage this issue.
It's cocos2d-based ("schedule:" is the selector of CCNode) but I believe you can do the same with NSTimer.


// In some method in the class
[port sendTo:"/action3" types:"f", 1.0f];
[self schedule:@selector(sendNoteOff:) interval:1.0f];

// Add this method to the class
-(void) sendNoteOff:(ccTime)dt
{
[self unschedule:@selector(sendNoteOff:)];
[port sendTo:"/action1" types:"f", 0.0f];
}

iPhone-OSC system in action

I gave it a go with my iPhone(iPad)-OSC system in my last performance. I was so nervous because I couldn't assure its stability till the performance had finished.
The system is connected by ad-hoc Wi-Fi network with my iBook be the base station. Most of the time it's working well, but from time to time unknown disconnections took place and brought me heart attacks.

Besides the OSC related things, there were some other difficulty with iPhone/iPad themselves.
For example
* I have to be aware of battery remainder because I have to leave them awake all the time so that keep them connected to Wi-Fi (if you let them sleep it takes long time to reconnect!)
* I had to pay lots of attention when pick the device to show it to the audience because just a bit of touch on the screen may cause undesirable action of the App.

On reflection, as it's my first time to work with this system, so it'd be better to have begun with less critical kind of usage. This time it was very critical, that is, if it didn't work the whole performance might have been spoiled.


ライブで実際に iPhone(iPad) - OSC を絡めたシステムを運用してみましたが、まぁヒヤヒヤものもいいところ。
iBook から Wi-Fi ネットワークを立ち上げて接続しまして、基本的には安定して接続できてたんですが、時々急に不安定になったりするので最後まで不安が拭えませんでした。

あと OSC以外のところでは、iPhone/iPadそのものの取り回しがけっこう大変でした。
いちどつながったWi-Fi を切断したくないのでスリープはさせたくないがそうすると電池残量を気にしなきゃいけなかったりとか、オペレーションがタッチセンスのみ、しかもほぼ全面がタッチセンサなのでステージ上での取り回し上すごく気を遣う、とか;

初使用だから、多少の操作ミスもご愛敬になるような場面で使えば良かったのに、いきなりクリティカルなところに使用してしまったのもアレですね;

Purchasing OSCulator

ライブで使うにあたって、いちいち時間制限を気にしてられないのでライセンスを購入しようと思ったら、最初出来なくてちょっとあせった。Safariが古かったのがいけなかった模様。(Safari 4.0.5)
最新のFireFoxでは問題ありませんでした。

I decided to use OSCulator in my live performances and to buy the license of it, but unable to purchase the license at the first time.
It may be because Safari's version is too old (Safari 4.0.5) .
With the newest FireFox caused no problem.

OSCulator

ObjCOSCは最初の印象ほど難しくはなかったです。
わりと簡単に送信できました。
しかし、今さら気づいたのが、OSCulatorの方が受信しかできないという点。OSCメッセージを受け取ってMIDIに変換することはできるが、逆はできないという。
がっつりインタラクティブなことをやろうとするとこれはけっこうな制約・・・

(9/29追記)誤解してました。できるようです。
http://www.osculator.net/doc/manual:midi_input


I've found ObjCOSC isn't so difficult than my impression at first glance.
But I also found that OSCulator cannot convert MIDI signal to OSC message.
It can only receive OSC message and convert to other signals.
It's a big problem in making full-interactive kind of system...

(added on 9/29) I was misunderstanding. It can.
http://www.osculator.net/doc/manual:midi_input

OSC

I'm now trying to build a remote control system with OSC(Open Sound Control).
As I'm planning to use my iPod Touch as the client so I thought using ObjCOSC framework must be convenient, but it seems not to match with my environment very well.
There seem to be other OSC related libraries, so I'll go check them out.

OSC(Open Sound Control)を使って遠隔操作みたいなシステムを組みたいと思ってまして。
クライアントにはiPod Touchを使いたいということで調べたら、ObjCOSCフレームワークがあるらしく、早速使ってみたのだけど、ちょっと相性が合わないっぽくてちょっとうまく動かない感じ。
他にもOSCを扱うライブラリとかあるっぽいのでもうちょっと調べてみよう。

ページ移動

  • 前のページ
  • 次のページ