Tidalcycles/SupercolliderのOSC出力 動作確認方法

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