🎸

ARギターエフェクター with Meta Quest & Ableton Live

2024/12/11に公開

1 はじめに

こんにちは、Ekitoです!こちらの記事は、Iwaken Lab. Advent Calendar 2024の12日目の記事です。

https://qiita.com/advent-calendar/2024/iwakenlab

1.1 自己紹介

あらためてIwaken Lab.に所属しているEkitoと申します。アドベントカレンダーなるものに初めて参加しております。
私は、ARと都市をキーワードとした音楽体験を作っています。最近は、2024年10月に虎ノ門ヒルズで開催されたTOKYO NODE OPEN LAB 2024 “XR PARADE”にて、街の場所に合った音楽をレコメンドするARアプリ「Walking DJ」を展示しました。

https://youtu.be/wLX4vHpueWQ

「Walking DJ」の開発記録も記事にまとめてますので、ぜひ読んでみてください!

https://zenn.dev/ekito_station/articles/tnxr-walking-dj

1.2 今回やりたいこと

私は普段ギターを弾いていますが、以前からギターの音をARで操ってみたいと思ってました。
今回そのファーストステップとなるイメージが浮かんだので、それを実装してみたいと思います。

仕組みとしては、ギターの先から飛ばしたレーザー[1]がARオブジェクトに当たるとエフェクターがONになってギターの音が変化するというものです。


ARギターエフェクターのイメージ

1.3 ARギターエフェクター全体像

使用したデバイスやツールは以下のとおりです。

システム全体像を図にすると、以下のようになります。


システム構成図

  1. まず、ギターをPCに接続してAbleton LiveというDAWを通して音を出します。
  2. 次に、Meta Questを被りARオブジェクトに向かってレーザー(レイ)を飛ばしたら、そのことをOSC通信でAbleton Liveに通知します。
  3. 通知を受け取った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オブジェクトを作る

次に、レイに当たるゲームオブジェクト(レイインタラクタブル)を作成します。以下のサイトを参考にしました。
https://developers.meta.com/horizon/documentation/unity/unity-isdk-create-ray-interactions/?locale=ja_JP

  1. シーンにCubeを配置して、Ray Interactableコンポーネントをアタッチします。
  2. Cubeに空の子オブジェクトを追加して、Box ColliderCollider Surfaceコンポーネントをアタッチします。
  3. CubeのRay InteractableSurfaceに、子オブジェクトのCollider Surfaceを登録します。

2.3 レイが当たったらOSCメッセージを送る

そして、コントローラーからのレイがレイインタラクタブルに当たったときに、OSCメッセージをPCに送る仕組みを作ります。

2.3.1 OSCメッセージを送るためのスクリプトを作成する

シーンに空のゲームオブジェクト(EffectorSwitchDetectorとします)を配置します。OSCメッセージを送るためのスクリプト(OSCSender.cs)を作成して、EffectorSwitchDetectorにアタッチします。

OSCメッセージを送るために、OscJackというライブラリを使用します。

https://github.com/keijiro/OscJack

レイがレイインタラクタブルに当たったとき、およびレイがレイインタラクタブルから外れたときにOSCメッセージを送る処理を以下のように作ります。

OSCSenderの内容
OSCSender.cs
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 StateInteractorにコントローラーのRay Interactorを登録し、PropertyIs Hoveringを選択します。


Interactor Active StateのInspector


コントローラーのRay Interactorの場所

Active State Unity Event Wrapper

Active State Unity Event WrapperActive 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の使い方は、大黒淳一さんの動画シリーズで勉強させていただきました。大変参考になりました!

https://youtu.be/zbR2oc3VGk8?feature=shared

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から外れるとギターの音がクリーンに戻るようになります。

https://youtu.be/0UXjz2GF3VU

4 おわりに

2年ちょっと前、ARを始めたての頃に「ギターの弦を街に張り巡らせてみたら?」というアイデアを実装したことがあったので、またARとギターを組み合わせられて原点回帰できた感があります。

https://youtu.be/p2rnRnbST_o

今回はエフェクターのON/OFFを切り替える簡単なシステムでしたけれど、Max for Liveで制御できる要素はとても多岐に渡りそうなので、今後さらに深掘りしていきたいと思います。

Iwaken Lab. Advent Calendar 2024の明日の担当はJJさんです。お楽しみに!

脚注
  1. ギターの先からレーザーを飛ばすといえば、B'zのLOVE PHANTOMのライブパフォーマンス! ↩︎

GitHubで編集を提案

Discussion