ARギターエフェクター with Meta Quest & Ableton Live
1 はじめに
こんにちは、Ekitoです!こちらの記事は、Iwaken Lab. Advent Calendar 2024の12日目の記事です。
1.1 自己紹介
あらためてIwaken Lab.に所属しているEkitoと申します。アドベントカレンダーなるものに初めて参加しております。
私は、ARと都市をキーワードとした音楽体験を作っています。最近は、2024年10月に虎ノ門ヒルズで開催されたTOKYO NODE OPEN LAB 2024 “XR PARADE”にて、街の場所に合った音楽をレコメンドするARアプリ「Walking DJ」を展示しました。
「Walking DJ」の開発記録も記事にまとめてますので、ぜひ読んでみてください!
1.2 今回やりたいこと
私は普段ギターを弾いていますが、以前からギターの音をARで操ってみたいと思ってました。
今回そのファーストステップとなるイメージが浮かんだので、それを実装してみたいと思います。
仕組みとしては、ギターの先から飛ばしたレーザー[1]がARオブジェクトに当たるとエフェクターがONになってギターの音が変化するというものです。
ARギターエフェクターのイメージ
1.3 ARギターエフェクター全体像
使用したデバイスやツールは以下のとおりです。
- エレキギター
- オーディオインターフェース
- Meta Quest 3
- コントローラー
- Unity 6
- Ableton Live
システム全体像を図にすると、以下のようになります。
システム構成図
- まず、ギターをPCに接続してAbleton LiveというDAWを通して音を出します。
- 次に、Meta Questを被りARオブジェクトに向かってレーザー(レイ)を飛ばしたら、そのことをOSC通信でAbleton Liveに通知します。
- 通知を受け取ったAbleton LiveはエフェクターをONにします。
これからシステムの実装について、Meta Quest側とAbleton Live側に分けて説明していきたいと思います。
2 Meta Quest側の実装
Meta Quest 3にインストールするARアプリをUnityで実装していきます。あらかじめMeta XR All-in-One SDKをインポートしておきます。
2.1 ギターの先からレイを飛ばす
まず、ギターのヘッドにMeta Quest 3のコントローラーを取りつけます。
といってもコントローラーの紐を巻きつけるだけ
次に、新規シーンを作成してコントローラーからレイを飛ばすための設定をします。
Meta XR Interaction SDKのRay Interactionに関するサンプルシーン(Assets/Samples/Meta XR Interaction SDK/71.0.0/Example Scenes/RayExamples.unity
)からOVRCameraRig
を取ってきます。これによって、コントローラーからレイを飛ばせるようになります。
RayExamplesシーンのOVRCameraRig
2.2 レイに当たるARオブジェクトを作る
次に、レイに当たるゲームオブジェクト(レイインタラクタブル)を作成します。以下のサイトを参考にしました。
- シーンにCubeを配置して、
Ray Interactable
コンポーネントをアタッチします。 - Cubeに空の子オブジェクトを追加して、
Box Collider
とCollider Surface
コンポーネントをアタッチします。 - Cubeの
Ray Interactable
のSurface
に、子オブジェクトのCollider Surface
を登録します。
2.3 レイが当たったらOSCメッセージを送る
そして、コントローラーからのレイがレイインタラクタブルに当たったときに、OSCメッセージをPCに送る仕組みを作ります。
2.3.1 OSCメッセージを送るためのスクリプトを作成する
シーンに空のゲームオブジェクト(EffectorSwitchDetector
とします)を配置します。OSCメッセージを送るためのスクリプト(OSCSender.cs
)を作成して、EffectorSwitchDetector
にアタッチします。
OSCメッセージを送るために、OscJackというライブラリを使用します。
レイがレイインタラクタブルに当たったとき、およびレイがレイインタラクタブルから外れたときにOSCメッセージを送る処理を以下のように作ります。
OSCSenderの内容
using OscJack;
using UnityEngine;
public class OSCSender : MonoBehaviour
{
private OscClient _client = new OscClient("PCのIPアドレス", 9000); // 9000はポート番号
// レイがレイインタラクタブルに当たったときに呼び出す関数
public void OnHoverEnter()
{
_client.Send("/unity", 1);
}
// レイがレイインタラクタブルから外れたときに呼び出す関数
public void OnHoverExit()
{
_client.Send("/unity", 0);
}
private void OnDestroy()
{
_client.Dispose();
}
}
- レイがレイインタラクタブルに当たったとき→1(
OnHoverEnter
) - レイがレイインタラクタブルから外れたとき→0(
OnHoverExit
)
の値をPCに送るようにします。
2.3.2 レイが当たったとき/外れたときに関数を呼び出す
EffectorSwitchDetector
にさらに以下のコンポーネントをアタッチします。
Interactor Active State
Active State Unity Event Wrapper
Interactor Active State
Interactor Active State
のInteractor
にコントローラーのRay Interactor
を登録し、Property
にIs Hovering
を選択します。
Interactor Active State
のInspector
コントローラーのRay Interactor
の場所
Active State Unity Event Wrapper
Active State Unity Event Wrapper
のActive State
に先ほどのInteractor Active State
を登録し、When Activated
イベントに先ほど作成したOnHoverEnter
を、When Deactivated
イベントにOnHoverExit
を登録します。
Active State Unity Event Wrapper
のInspector
これによって、コントローラーのRay Interactor
のActive State(コントローラーのレイがレイインタラクタブルにHoveringしている状態)がActivateされたときにOnHoverEnter
が、DeactivateされたときにOnHoverExit
が呼び出されるようになります。
3 Ableton Live側の実装
続いてAbleton Liveで、OSCメッセージを受け取ってエフェクターのON/OFFを切り替えるプロジェクトを作成します。このとき、Ableton Liveの拡張機能であるMax for Liveを使用します。Max for Liveは、Maxというビジュアルプログラミング言語を活用してAbleton Liveの機能を制御することができます。
Max for Liveの使い方は、大黒淳一さんの動画シリーズで勉強させていただきました。大変参考になりました!
3.1 ギター用トラックを作成する
まず、Ableton Liveの新規プロジェクトを作成し、ギターを鳴らすためのトラックを作成します。
Audioトラックに、以下のデバイス(エフェクトなどのコンポーネントのこと)を追加します。
- Max Audio Effect
- Pedal(歪みエフェクター)
- Amp
- Cabinet
- Reverb
Ableton Liveのプロジェクト
このうち、PedalのON/OFFをMax Audio Effectで制御していきます。
3.2 OSCメッセージを受け取る
ここから、Max Audio Effect(Max for Liveデバイス)を編集していきます。
まず、Max for Liveデバイスにudpreceive
というOSCメッセージを受け取るためのオブジェクトを追加し、引数にポート番号を指定します。先ほどOSCSender.cs
でポート番号に9000を指定したので、ここでも9000を指定します。
次にOSC-route
オブジェクトを追加して、OSCメッセージをアドレスに基づいて振り分けて値を取り出します。OSCSender.cs
から送られるOSCメッセージのアドレスはすべて/unity
なので、アドレスが/unity
のOSCメッセージを受け取ったらその値(0または1)を取り出す処理を作ります。
Max for LiveデバイスのOSCメッセージを受け取る部分
3.3 エフェクターのON/OFFを切り替える
そしてLive APIによって、Max for LiveデバイスからAbleton Liveプロジェクトにアクセスして制御します。Ableton Liveプロジェクトの各要素には、Live Object Model(LOM)に基づいてパスが割り当てられています。
今回アクセスしたい要素は、「ギター用トラック」の「Pedalデバイス」の「ON/OFFを示すパラメーター」です。ここでは、
- 「ギター用トラック」はプロジェクトの最初のトラックなので
tracks 0
- 「Pedalデバイス」はトラック内の2番目のデバイスなので
devices 1
- 「ON/OFFを示すパラメーター」は
parameters 0
となるので、「ギター用トラック」の「Pedalデバイス」の「ON/OFFを示すパラメーター」のパスは以下のようになります。
path live_set tracks 0 devices 1 parameters 0
このパスをlive.path
オブジェクトに渡してIDを発行し、そのIDをlive.object
オブジェクトに渡します。
最後に、OSCメッセージから取り出した値もlive.object
オブジェクトに渡すことで、IDが示す要素に値をセットします。これによって、0がセットされるとギター用トラックのPedalがOFFになり、1がセットされるとONになります。
Max for Liveデバイス全体
3.4 完成!
以上の実装によって、ギターの先からレイを飛ばすことでエフェクターのON/OFFを切り替えられるようになりました。レイがCubeに当たるとギターの音が歪み、Cubeから外れるとギターの音がクリーンに戻るようになります。
4 おわりに
2年ちょっと前、ARを始めたての頃に「ギターの弦を街に張り巡らせてみたら?」というアイデアを実装したことがあったので、またARとギターを組み合わせられて原点回帰できた感があります。
今回はエフェクターのON/OFFを切り替える簡単なシステムでしたけれど、Max for Liveで制御できる要素はとても多岐に渡りそうなので、今後さらに深掘りしていきたいと思います。
Iwaken Lab. Advent Calendar 2024の明日の担当はJJさんです。お楽しみに!
-
ギターの先からレーザーを飛ばすといえば、B'zのLOVE PHANTOMのライブパフォーマンス! ↩︎
Discussion