くろねこだって中二病ごっこがしたい! -P5とPdをOSCでつなぐ-
この記事はProcessing Advent Calendar 22日目の記事です。
久々のブログ更新がAdvent Calendarというね…
何かネタが無いか振られるかしないと書かない性分のようです(ヽ´ω`)
Advent Calendarに向けて何しよーかなーと考えていた時期、くろねこは毎週の中二病が楽しみでした。
(ヽ´ω`)「爆ぜろリアル、弾けろシナプスー」
(ヽ´ω`)「なんか昔こういうのやってた気がするー」
(ヽ´ω`)「ほら、こう、壁に向かって手をかざして扉よ開けー的な」
(ヽ´ω`)「扉ないにしても何かキーンって共鳴して模様が浮かび上がるとかさ」
(ヽ´ω`)「…これ実装できるかも」
てなことで、「手をかざすといい感じの共鳴音を上げるとともに視覚効果を演出する」ようなものを実装してみました。
(動画中の○は手の座標です。)
上記コンセプトを分解して、以下の様な感じに仕上げていきます。
・「手をかざすと」→kinectで右手の座標を検知
・「いい感じの共鳴音を上げる」→キーンと来る高周波数の音を生成・出力
・「視覚効果を演出」→手の座標が画面中央に近いほど画面が荒れるようなエフェクト(これに合わせて生成音の音量も大きくする)
処理の流れはこんな感じです。
キーンとくる良い感じの音は単純なサイン波で十分かなと思いP5でも生成可能だなと検討していたのですが、
より凝った音を作りこみたいなーという展望があり、draw()内の処理をなるべく少なくしたかったので、OSCを利用してPdに音声処理を委託することにしました。
今回の記事では映像演出の話は置いといて、OSCを利用してP5とPd間でどのようにメッセージを送るかというところを紹介します。
OSCとは?
電子楽器やアプリケーション、PC間のための通信プロトコルです。
@tadokoroさんのブログ記事にて分かりやすく説明してくれています。
openFramewoks – OSC (Open Sound Control) を利用したネットワーク連携
OSC送信側(P5)
まずはOscP5インスタンスを生成し、ポート番号と送信先アドレスを指定しましょう。
今回はlocalhostへ。
// oscP5 setting oscP5 = new OscP5(this, 10001); oscDestination = new NetAddress("127.0.0.1", 10001);
Pd側に送る情報が決定したら、メッセージを生成して送信します。
// send osc message with velocity value OscMessage messageForPd = new OscMessage("/p5/soundValue"); messageForPd.add(velocityValue(distance)); oscP5.send(messageForPd, oscDestination);
基本はこれだけです。
OSC受信側(Pd)
dumpOSCとOSCrouteでメッセージを取り出します。
Pd側で注意すべきことが1点。
実行したけどdumpOSCでエラー出て何故か受信できないという現象に出会った場合、dumpOSCにて指定したポートを既に使用している場合があります。
つまり、同じプログラム、又は同一ポートを利用したプログラムが立ち上がっているとこの現象に出会ってしまいます。
上記プログラムが起動していないことを確認、もしくは起動しているプログラムを一旦落としてから再度開いてみてください。
ソースコード全体(P5、Pdともに)をご覧になりたい方は、githubにアップロードしたので御覧ください∩(・ω・)∩
https://github.com/laprasdrum/Chuuni-P5-Pd-Kinect
明日はすつーかさんですね。
よろしくお願いします!