TidalcyclesとProcessing/openFrameworksとのOSC通信をやりたくて試行錯誤した結果、なんとかうまくできたので、動作確認方法をメモしておきます。
記事の概要
この記事の内容は以下です。
- TidalからSCに送るOSCの中身を確認する方法
- SCから指定のポートにOSCを送信できているか確認する方法
最終的にやりたいことは、Tidalcycles(Tidal)→Supercollider(SC)→openFrameworks(oF)という流れでOSCを送信することですが、この記事では「SCから指定のポートにOSCが送れていること」までを確認します。
この記事を書いた背景として、「OSC連携について、参考記事通りにやっているのになぜかうまくいかない。問題がどこか、切り分けたい。例えば、そもそもTidalの出すOSCってどんなデータなの?SCからOSCは出せているの?ポートの設定とかあっているの?」という思いと試行錯誤がありました。
そうやって試行錯誤する中で、基礎的な確認に有効だった方法をこの記事で紹介します。
ちなみに、TidalとSCは、そもそもOSCで通信しているので、音が出ていればTidalc-SC間のOSC通信はできているはずです。つまり、Tidalができている時点で、OSCは取り扱いできているので、あまり難しく考える必要はない、と思います。
環境
Mac OS 10.13.2 / SuperCollider 3.10.3 / Tidalcycles 1.7.2
Tidal→SCのOSC内容の確認
まず、SCはTidalからどんなOSCを受信しているかを確認します。
OSCFunc.trace(true); // Turn posting on
OSCFunc.trace(false); // Turn posting off
SCのstartup.scdを開き、Tidalを実行して音を出しながらOSCFunc.trace(true); を実行すると、画像のようにSCのPost windowに、受信しているOSCが表示されます。
停止はOSCFunc.trace(false);を実行してください。
注:startup.scdは、SCのFile>Open Startup File から開けます。
この中で、例えば[/dirt/play, cps, 0.55000001192093, cycle, 1075.875, delta, 0.45454549789429, orbit, 0, s, bd ]みたいなものがTidalの演奏データのように見えますね。
このとき、/(スラッシュ)の箇所がOSCのアドレスです。これが /play2 なのか、/dirt/play なのか、それともそれ以外なのかを確認しておいてください。後ほどこのOSCアドレスを使用します。
SCで受信したOSCをそのまま別のポートに送信する設定
Supercolliderにコードを追加して、「受信したOSC内に”dirt/play”というアドレスを確認したら、それをそのまま別のポートに送信する」という機能を持たせます。
以下コードをSCのstartup.scdに記載してください。
var addr = NetAddr.new("127.0.0.1", 2020);
OSCFunc({
arg msg, time;
var latency = time - Main.elapsedTime;
addr.sendBundle(latency, msg)
},'dirt/play').fix;
ここの.fixの手前の文字列’dirt/play’のところに、先程確認したOSCのアドレスを入力してください。
※私はここをずっと違う文字列にしていたために、SCからOSCを出すことができず悩みました。
なお、今回は、”127.0.0.1″、ポート2020に送る設定にしています。
SCからOSCが出力されていることの確認
SCからOSCをポート2020に送信できていることの確認は、以下サイトのツール”OSC Data Monitor”を使用します。
これは、processingで作成されたツールなので、特にprocessingでOSCの受信を確認したい人は有効に使えると思います。
上記リンクからダウンロード後展開し、以下画像のOSC Data Monitorを実行(画像はMacの場合)します。
開いたら、以下画像の1の欄にport番号である2020を入力し、2 ADD PORT を押します。3に2020が表示されたら、それを2回クリックすると、4に2020が表示され、5にAlready listening to port:2020と表示されます。
これでport2020で受信したOSCを画面に表示する準備が完了です。
この状態で、まず以下コードをSCのstartup.scdで実行してください。
b = NetAddr.new("127.0.0.1", 2020); // create the NetAddr
b.sendMsg("/hello", "there"); // send the application the message "hello" with the parameter "there"
これは、SCから/hello there と送るだけのコードです。
受信できていれば、画像のようにOSC Data Monitorに[2020]/hello there (string)と表示されます。
/hello there で、SCからOSC送信できていることが確認できたら、次はTidalcyclesのOSCをSC経由で送信できるか確認します。
先程設定した以下コードをSCのstartup.scdで実行してください。
(‘dirt/play’のところは、先程確認したOSCアドレスに書き換えてください)
var addr = NetAddr.new("127.0.0.1", 2020);
OSCFunc({
arg msg, time;
var latency = time - Main.elapsedTime;
addr.sendBundle(latency, msg)
},'dirt/play').fix;
上記を実行後、Tidalcyclesを実行して音を再生してください。
うまく受信できていれば、OSC Data Monitorに、次々とSCから受信したOSCが表示されます。
これによって、TidalのOSCをSC経由でポート2020に送信できていることが確認できました。
参考にしたサイト
https://depts.washington.edu/dxscdoc/Help/Guides/OSC_communication.html
https://doc.sccode.org/Guides/OSC_communication.html