🥁

【ARドラム】生ドラムの演奏データどうやって取る?

2024/12/11に公開

こんにちは,ARドラマーのさくたまです.
この記事はIwaken Lab. Advent Calendar 202410日目の記事です!

また,XR Kaigi 2024 でお話しする内容の一部にもなっています!XR Kaigiもぜひいらしてください
https://www.xrkaigi.com/event/9316/module/booth/308916/263763

はじめに

最近はDoomboxというバンドで楽曲とドラム演奏に同期して動くARライブを作っています!
https://www.youtube.com/watch?v=VAGFz5MwQDg

こちらのARライブを作る時には,

  • ドラムの演奏(スネア,キックをいつ叩いたか)
  • 楽曲進行度 (Aメロ? Bメロ?Cubaseで再生している同期音源の再生位置)
    をiPhone上のARアプリ(Unity)にOSCで送ってARエフェクトを発火しています.
    この二つの情報をどうやって取得して送信しているかをまとめていきます.

この記事は以下のような方々に楽しんでもらえるといいなと思っています!

  • ドラム裏側こんなことしてるんだ〜と楽しんでくださる方
  • CubaseからOSC送信したいニッチな需要がある方
  • ライブのリアルタイムな同期ソフトあれこれの「もっとこういう便利なツールあるのに」を教えてくれる方

1. ドラムの演奏データを送る

↓今までは,電子ドラムやMIDIパッドを使ってMIDIをアウトプットし,TouchDesignerやUnityで,ARアプリ(Unity)に送っていました.
https://zenn.dev/sakutama_11/articles/7959b58810cb26
https://zenn.dev/sakutama_11/articles/799d5f5a9af4fc
https://www.youtube.com/watch?v=FJQSks7e778

しかし,ライブでARしたい!となると,電子ドラムではない普通のドラム「生ドラム」の演奏データをセンシングする必要があります.

スネア,キックのセンシング

スネアとキックのセンシングには「ドラムトリガー」という道具を使っています.
https://drum-hakase.com/1432/
画像のようにフープ(フチ)に取り付けることでドラムの振動を取り,本来は音にエフェクトをつける道具です.

トリガーは,「トリガーモジュール」というモジュールに端子を繋いで音色を変更するのですが,この役割は電子ドラムのモジュールでも代用できます.モジュールも高額だったり,インプットの数が限られたりするので,手持ちのALESIS製の電子ドラムにRoland製のトリガーを繋いでいます.(電子ドラム用に最小限の長さのケーブルしか付いていなかったり,不便さはありますが...)

これで生ドラムも電子ドラムと同じようにMIDIを取り出して扱えます.
細かい問題点として,タム(バスドラムの上についている太鼓類)をセンシングしたくても,バスドラムの振動を拾ってしまうという問題があります.ゆくゆくは閾値調整などで解決してキメに合わせた演出も作りたいです.

シンバル類のセンシング

シンバル類は,そもそも薄い金属の振動で音が出る仕組みですし,トリガーを取り付けられません.諦つつ,やっぱりクラッシュシンバルは切れ目でメリハリが出ますし,取りたいなと思いつつ...
だったのですが!!
最近 KORG CLIP HITというクリップでなんでもドラムにしちゃう電子楽器の存在を知り使ってみるとうまくいきました!
https://www.korg.com/jp/products/drums/cliphit/

このクリップをシンバルスタンドの先の方につけて,もう一方の端子を電子ドラムモジュールに挿しています.

シンバルの振動が増幅するのか,叩いて振動している一発の間に最初より大きな値のMIDIが流れてきたりするので,TouchDesigner側で微調整しています.
何はともあれ,シンバルを叩くとARエフェクトが発火される!というのが達成されました!↓
https://www.youtube.com/watch?v=KiDn-t946LM

こんな感じで,ALESIS電子ドラムとRolandトリガーとKORGクリップをキメラして使っています.

2. 楽曲進行度を送る

同期音源の再生にはCubaseを使っていたので,CubaseからOSCを送信する方法を採用しています.
理想的には,「楽曲が始まった」「Aメロに入った」「Bメロに入った」というタイミングで通知したいです.色々考えて,Cubase側では任意の値をOSC送信し続け(OSCar),TouchDesignerで一度受け取って,通知したいタイミングでTouchDesignerからUnityにOSCを送信することにしました.

当初の方針

最初はトラックに合わせてAメロ,Bメロと決めたMIDIを打ち込んでMIDIの開始タイミングでOSCを送信できればと思っていたのですが,OSCを送信するプラグイン連続的に送信するものしか見つかりませんでした.何か良い方法があれば教えていただきたいです.

Ableton Liveとか,得意なんですかね...?(↓このへん?)
https://qiita.com/TaitoOtani/items/d7648fa3c25950f3656f

OSCarの使い方

OSCarというCubaseでも使えるVST規格プラグインを使うと,トラックに合わせた任意の値を常に送信することができます.
以下の記事を読んでプラグインをインストールしました.
https://note.com/ryu_mu/n/n739ae49fa487

1.OSCarで送信する値用のトラックを作る

以下のような設定でFXチャンネルのトラックを作ります.
エフェクト(FXアイコン)を押して,「エフェクト」と書いてあるトグルをOSCarに設定します.

2. 「ボリューム」と書いてあるプルダウンをOSCar - xに設定

トラックの表示するデータをOSCarの送信チャンネルに設定します.

詳細設定を押すと,他に使えるアドレスも表示されます.この設定や各チャンネルに対するOSCのアドレスの割り当ては,oscar.xmlというファイルに記載されているので,カスタマイズすることができます.

3. 楽曲のタイミングに合わせて送信する値を設定する

楽曲のタイミングに合わせて送信する値を設定します.今回は
Intro → 0.0
Aメロ → 1.0
Bメロ → 2.0
のようにぽちぽちと少数を打ち込んで階段状になっています.

4. OSCの送信設定

output port ... TouchDesignerのOSC受信(osc in)ノードで設定しているポート番号を指定します.
output IP ... 今回は同じPCのTouchDesignerでバイパスするので127.0.0.1としています.
polling rate ... 値を送る間隔を指定します.

これでCubase側は完成です.

TouchDesignerで整形してUnityにOSC送信

TouchDesigner側では,Cubaseから送られた値を受信するたびに以前の値から整数部が変わったかどうかを判定して,変わっていた場合変更をUnity側に通知するようにしています.
OSC In -> CHOP Execute -> OSC Outです.

CHOP Execute
def onValueChange(channel, sampleIndex, val, prev):
    if int(val) == int(prev):
        return
    osc_out = op("oscout2")
    args = [int(val)]
    osc_out.sendOSC("/cmd", args)
    return

3. TouchDesignerで送信側を管理

OSC送信先のアドレスなどはその時のデバッグ環境で変わったりもするので,一旦MIDIデータとCubaseのデータをTouchDesignerに集約しています.


MIDIの閾値調整や,送信がダブらないようにしたりといった調整は割とコールバックの中にハードコーディングされています...汗

おわりに

色々と愚直なことをしてARドラムを構成しています.晴れてシンバルが取れるようになって,ハード側はあとタム問題くらいなので,AR演出をガンガン作りやすくする方に力を入れたいかなと思います.
あとは,受信側が一台じゃなくて複数台設定できるように,アプリ側からローカルIPを登録して自動接続する,あたりも解決してお客さんに各自のアプリで見てもらえるようにしたいです.

2-3台はとりあえず用意できるのでぜひ一度ARライブを見にきてください!(さくたまにDMいただければライブ予定お伝えします!)

Discussion