BeatLinkTriggerでMetadata取得とOSC Sending

BeatLinkTriggerでMetadata取得とOSC Sending

はじめに

BeatLinkTriggerの記事をまとめるにあたってまずBeatLinkTriggerとはなんぞやみたいなところから記事にするべきなんですが、そこから記事を書いていったらなかなかここまでたどり着かないので先に書いてしまいます。
BeatLinkTriggerに関しては、DJ Techtoolsの記事などを参考にすると良いかと思います。
また気が向いたらこのブログでもBeatLinkTriggerについての記事を書きます。

OSCに関しても詳しくは「Open Sound Control」で検索してくださいな。扱い自体はそんなに難しいものではないです。

ついでに僕はClojureのことはさっぱりなので、その辺の解説は合ってないかもしれませんし、なんならコードの書き方もおかしい可能性あります。

BeatLinkTriggerをTriggerでOSC Send

概要

BeatLinkTriggerで取得したCDJ情報、VJソフトに送れたら便利だなと思ってたのですが、BeatLinkTriggerはMidiだけではなくOSC Out (OSC Send)ができるので、文字列データをやりとりすることができます(やりとりというより一方的に送信)。
BeatLinkTriggerに関するユーザーガイドはこちら。記事作成時の最新バージョンはv0.6.1なので、バージョンが上がるにつれてユーザーガイドも更新されると思うのでその時は各自リンク先を確認してください。
この記事のExpressionsのところにさらっと(見落とすレベルで)OSC Sendに関しての記述があるので、そこをちょっといじくって自分用に設定していきましょう。

BeatLinkTriggerの設定

Triggerの作成

BeatLinkTriggerのメイン画面にある「Triggers」タブから「New Trigger」をクリックすると新しいTriggerを作ることができます(項目 1)。メイン画面にある設定項目から、読み取りたいCDJのプレイヤーナンバーを選択します(項目 2)。
Player No. を選択すると右側に曲情報が読み込まれているので確認します。

Trigger Expressionsの記述

BeatLinkTriggerには色々なタイミングでTriggerを発動させることができ、そのタイミングごとにExpressionからコードを呼び出すことができます。(個人的に欲しいのはCDJ loadタイミングなんですけど、それがない!!)
Expressionの設定は各Triggerにある歯車マークをクリックします(項目 3)。

「Edit Setup Expression」 (Triggerの呼び出し時)を選択し、(項目 4)

(swap! locals assoc :oscblt (osc/osc-client "localhost" 7002))

を記述します。swap!はいわばローカル保存領域のようなもので、設定を保存・上書きするコマンドのようなものです。
今回はlocalに :oscblt という名前でOSC情報を保存します(ここは好きな名前でOK)。OSC Send先が複数ある場合はここの名前を変えてやる必要があります。
OSCの設定に関しては省きますが、同一PC内の別ソフトとやり取りする場合は"localhost"、ネットワーク内に入れ込む場合はここにIPアドレスを入力します。続いて通信するポート番号(今回は 7002)を記述します。

これでTriggerを呼び出したら(というかBeatLinkTriggerを起動したら)、OSC通信ができる状態になりました。

次に「Edit Shutdown Expression」 (Triggerの終了時)を選択し、(項目 5)

(osc/osc-close (:oscblt @locals))

と記述します。これでTrigger終了と同時にOSC通信を終了します。

最後に「Edit Tracked Update Expression」 (CDJ/Mixer情報更新時)を選択し、(項目 6)

(let [metadata track-metadata]
    (swap! locals update-in [:oscmetadata]
           (fn [old-metadata]
             (when (not= metadata old-metadata)  
               (osc/osc-send (:oscblt @locals) "/track" track-artist track-title))  
             metadata)))

を記述します。
(let [metadata track-metadata] ... )metadataという変数にtrack-metadataを入れ込んでいますが、このExpressionの下部に使用できる(呼びだせる)値の一覧が書いてあり、track-metadataはCDJから送信されたトラック情報を一括して管理しているclassです。
このmetadataを毎フレームごとにチェックし、値が変わったタイミング( (when (not= metadata old-metadata)...) )でOSCを飛ばしています( (osc/osc-send (:oscblt @locals) "/track" track-artist track-title) )。

OSCのSend情報ですが、基本的には「(osc/osc-send (#OSCのSend先 @locals) #OSCアドレス #OSCのバリュー)」となっているので、必要な情報を選択してOSCを送ってやってください。
注意点としてはOSCアドレスは必ず / (スラッシュ)から始まるようにしないといけません。
また、ValueはList形式で送ることができるのですが、track-metadataで一括して送ることはできません(track-metadataがList形式じゃないっぽい?)。そのため必要な情報は一つずつ記述する必要があります。

また、受け手側がArgsで受け取れない場合は、

(osc/osc-send (:oscblt @locals) "/Artist" track-title)
(osc/osc-send (:oscblt @locals) "/Title" track-title)

のように並列に書いていくことで別々にOSCが送られるので解決します。

ついでながらユーザーガイドには「(when trigger-active? ...)」を使用していますが、基本的にtrigger-active?がTrueになるタイミングは曲を再生したタイミングなので、trigger-active?を使用してしまうとOSCの先読みができなくなりますので今回は使用していません。

VJソフト側でのOSC Receive設定

VDMXの場合

VDMX5の場合、まず上部タブ「VDMX5」から「Preferences…」をクリックして詳細設定画面を開きます。
左側のリストから「OSC」を選択し、「Input Ports」にある「Create New」をクリックして新しいポート設定を呼び出し、BeatLinkTriggerで設定したポート番号を入力します(今回の場合は7002) (項目1, 2, 3, 4)。この時他のソフトで同じポート番号を使用していると選択できないので、ポートを使用している別ソフトを終了するか、別のポート番号を設定してやる必要があります。

次に受信したデータを利用したい場所をクリックして(今回はControl SurfaceにあるText Field)、UI Inspectorを表示させます(Windowがない場合は「Command + 2)」 (項目 1)。
UI Inspector内のReceivingタブを選択し (項目 2)、リストから「+」を押して新規作成します (項目 3)。「/<No Source Chosen>」を先ほど設定したOSC Adressに書き換えるか、あるいは「OSC Detect」ボタンを押して一度OSCデータを送信させて設定します(今回の場合は「/OSC/Track」) (項目 4)。次に、OSCを受信するために、「Enable/Disable this receiver」にチェックを入れます (項目 5)。
リストデータとして送っている場合は、「When receiving a list, use item:」の項目で必要な要素を取り出します(今回の場合は「0 : track-artist」「1 : track-title」が送られてきています) (項目 6)。

これでOSCを受信したら適切に表示されるようになっていますので、CDJの曲情報を一度更新してみてください。
Rekordboxにトラック情報がない場合は、「”” (Null String (Nullではない))」が受信されます。

TouchDesignerの場合

TouchDeisgnerには「OSC In DAT」と「OSC In CHOP」がありますが、文字列データ(String)を扱う場合はOSC In DATを使用する必要があります。
OP Create Dialogから「OSC In DAT」を呼び出し (項目 1)、OSC In DATのパラメーター設定項目にあるPortをBeatLinkTriggerの出力先ポートに合わせます(今回は 7002) (項目 2)。初期設定ではLocalhostになっているので、ネットワークを使用する場合は、Multi-Cast Messaging (UDP)にてネットワークアドレスを設定します。

適切に設定していれば、CDJ情報が更新されたタイミングでOSCを受信してOSC In DATのLog Tableに曲情報が書き込まれていきます (項目 3)。

リスト化されて送られてくるOSCはOSC In DAT内にあるoscin_callback DATから編集できます。リスト化されたデータはargsという可変長引数リストとして呼び出すことができます。
List型なので、args[0]やargs[1]などから要素を取り出して別のオペレーターに文字列データとして渡すことができます。

まとめ

今回はBeatLinkTriggerでOSCを飛ばすやり方をまとめました。
VJソフトに曲情報を送れれば、配信映像に曲情報を載せたりできるだけでなく、PV・MVの検索がはかどったりと用途はいろいろありますね。

BeatLinkTriggerは他にも色々と便利機能があるのでもう少し色々と記事が書ければなと思います。

TouchDesignerカテゴリの最新記事