PdはもともとTCP/IPやUDPに対応した機能があります。
これを使えば、OSC(OpenSoundControl)でやり取りすることが可能です。
Pdの機能拡張で簡単にOSCを使えるものがありますが、アップデートの不定期な機能拡張に頼りすぎると、せっかく作り込んでも1年後には動作しないこともあります。
なのでこのWSでは、Pd-VanillaだけでOSCできるパッチを作っていきます。
受信と送信がひとつになったパッチです。
自分で自分にOSCデータを送り、受信したOSCデータをPdで扱える値に変換しています。
キーボードでテストしていた部分を、OSCで作っておくと、実用的で便利になります。
先ほどの「pdws10-1-1_osctest.pd」の中の「osc-rcv」と「osc-send」パッチは、自作の外部パッチになっています。なので、もう少し深くオブジェクトを解説しておきます。
「pdws10-1-2_oscrcv.pd」「pdws10-1-2_oscsend.pd」の、2つのPdファイルを同時に開いてください。
ネットワーク通信を担当するPdの基本のオブジェクトは、[ netreceive ] ・ [ netsend ] です。
TCP/IPも、UDPも、ASCIIデータ(0〜127)も、バイナリデータ(0〜255)も扱うことができます。
自作外部パッチのOSCには、UDPでバイナリデータを使っています。
そのほかの多様な機能は、[ netreceive ] ・ [ netsend ] のそれぞれを、右クリックして「help」を見てみるとわかりやすいです。
OSC受信のパッチです。
太い枠で囲ったところは、OSC通信を行う基本的なオブジェクト構成になります。
点線で囲ったところは、ユーザが扱うデータによって、個数やデータタイプを揃える必要がある部分です。
対応するOSC送信のパッチです。
太い枠で囲ったところは、OSC通信を行う基本的なオブジェクト構成になります。
点線で囲ったところは、ユーザが扱うデータによって、個数やデータタイプを揃える必要がある部分です。
OSC受信、OSC送信のパッチで、ポート番号、OSCアドレス、IPアドレスを、対応させる部分のメモです。
Pdで独特なのですが、複数のデータを扱う場合、「pack」「unpack」を使います。
「pack」は複数をパックして1つにまとめるものですが、1つにまとめて出力されるタイミングを気にしておきましょう。いちばん左のインレットに入力があったときのみ、アウトレットから出力されます。
ネットワーク接続するものは、いろいろやっているうちに、うまくつながらなくなることがあります。
その理由の多くは、一度接続したポートを解放しない状態で、ポートを取り合っている場合です。
なので、すぐ再接続できるようにしておきます。
考え方としてはシンプルに、「接続解除」したあとに「接続する」だけです。
これは、受信側と送信側のそれぞれにつけておいたほうがよいです。
最初の例にもどって、外部パッチの中を説明します。必要な機能のみ、見えるようにしました。
「osc-rcv」パッチ
「osc-send」パッチ
「osc-rcv」パッチの中では、bangが送られてきたら「接続解除、50ms後に接続」としています。
また、Pdの小ワザですが、メッセージボックスへの入力を自動的に行うため、
[ list prepend set ]
[ list trim ]
を使い「listen 4001」メッセージを自動生成します。
この時点でメッセージは、まだ次のnetreceiveに出力されません。
そのため、[ del 50 ] のあとに、[ t b b ] を使ってbangを2回発生させ、1回目のbangでメッセージを自動入力し、2回目のbangで [ netreceive ] に出力するようにしています。
「osc-send」パッチの中でも、bangが送られてきたら「接続解除、50ms後に接続」としています。
同様にPdの小ワザで、メッセージボックスへの入力を自動的に行うため、
[ list prepend set ]
[ list trim ]
を使い「connect localhost 4001」メッセージを自動生成します。先ほどと同じく、この時点でメッセージは、まだ次のnetsendに出力されません。
そのため、[ del 50 ] のあとに、[ t b b ] を使ってbangを2回発生させ、1回目のbangでメッセージを自動入力し、2回目のbangで [ netsend ] に出力するようにしています。
OSCで受信した値をPdで実験的に使いたい場合は、「send」または「s」や、「receive」または「r」を使って、任意の名前の変数にし、値を転送すると便利です。
たとえば、この例では、OSCで受信した値を、外部パッチの中に転送しています。