さわぐちFMオキーステーション

幸せの鐘が鳴り響き僕はただ嬉しいふりをする

Oculus Questで俺のギターをコントローラーにする

この記事はUnity #3 Advent Calendar 2019の25日目の記事です。

僕が書くのは完全に趣味と自己満の記事です。

あぁーVRでもギターが弾きてぇよー

僕はギターが大好きだ。中一でベンチャーズ(パイプラインとか....)をコピーし、今でも歪ませた音ばかりを出している。30後半になったけども必死にスウィープ奏法を練習している。そんな大好きなギターをなんとかVR上でコントローラとして使えないかなーと思ったのがこの記事のきっかけです。

ということで手元にあるギターをOculus Questのコントローラーとして使用できないかを考えてみよー

f:id:amidaMangrove:20191225011133p:plain

これだ!多分これでいけるんじゃあないかと思うのでやってみる。おそらくコーディング量はほぼ0です。

用意するもの

Keijiroさんが公開している「Lasp」と「OscJack」を使用します。Unityは2019.3.0fを使用。

github.com

github.com

他必要なものはどのご家庭にもある

となります。さらにOculus Questがケーブルレスなのを考慮し

  • ワイヤレスシステム(あれば)
  • ワイヤレスヘッドフォン(あれば)

この辺まで揃えられればなんか良さそう

まぁぶっちゃけオーディオインターフェース経由ならギターである必要はないのです。もっといえば、PCにマイクが内臓できてればとりあえず入力は取れます。

Oculus Questのipアドレスを調べる

Oscを使用するためOculus QuestとPCをUSBで繋ぎ以下のコマンドをcmdに入力してipアドレスを調べます。(事前にadbがインストールされている前提)

adb shell ip addr show wlan0

「inet xxx.xxx.xxx.xxx brd ~」とipアドレスが表示されるので覚えておきましょう。 このipアドレスを送信アプリに埋め込みます。

Lasp → OSC送信用のプロジェクトを作成する

変換とOSC送信するPCアプリと、受信側のOculus Questアプリの2つを作ります。

まずは送信側のプロジェクトを作りそれぞれ「Lasp」と「OscJack」をインポートしておきます。

Laspを使用してオーディオ入力を受け取る

低・中・高の音域を取り出したいのでSphereヒエラルキーに3つ追加しそれぞれ「AudioLevelTracker」をアタッチして「Filter Type」を「Low Pass」「Band Pass」「High Pass」に設定しておきます。

f:id:amidaMangrove:20191221184302p:plain とりあえず左から「Low」「Band」「High」。きちんとオーディオ入力が取れているか確認するため簡単なスクリプトを作りアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NormalizedLevelView : MonoBehaviour
{
    public float Level { get;  set; }
    
    void Update()
    {
        transform.localScale = new Vector3(Level, Level, Level);
    }
}

アタッチしたら「AudioLevelTracker」の「Normalized Level Event」にプロパティの「Level」を設定します。 f:id:amidaMangrove:20191221221638p:plain

この段階で実行しオーディオ入力が取れているか確認しましょう。 f:id:amidaMangrove:20191221221900g:plain

※注意:Laspには「デフォルトデバイスを使用する」と「モノラル入力」の制限があるのでデバイス側で少し設定いじらないと入力取れないケースもあるかもしれません。その場合はサウンド設定を見直すといいかと。

OscJackを使用し入力結果を送信する

先ほど作成した3つのSphereに「OscPropertySender」もアタッチし、とりあえず以下の値を設定します

  • IP Address:調べたOculus Questのipアドレス
  • OSC Address:それぞれ「/low」「/band」「/high」
  • Data Source:自身のオブジェクト
  • Component:AudioLevelTracker
  • Property:normalizedLevel

f:id:amidaMangrove:20191221222758p:plain

ひとまずこのプロジェクトで送信できているか確認するため、適当なGameObjectを置き「OscEventReceiver」をアタッチ。Window→OSC Monitorを開き確認します。

f:id:amidaMangrove:20191221223222g:plain とりあえず送れてるっぽい。

Oculus Quest向け受信用のプロジェクトを作成する

Oculus Quest用のアプリの作り方は先人の方々がまとめてくださっているので「Oculus Quest Unity ビルド」でググってもらえれば色々ヒットします。

ひとまず先ほど作成した送信アプリから値を受け取り、Oculus Quest上でもSphereが動作するアプリを作ってみましょう。

新しく作成したプロジェクトに「OscJack」と先ほど作成した「NormalizedLevelView.cs」を追加します。

で、先ほどと全く同様にSphereで「Low」「Band」「High」を作っておき....(↓の画像は使いまわし)

f:id:amidaMangrove:20191221184302p:plain

それぞれに「NormalizedLevelView」と「OscEventReceiver」をアタッチします。

f:id:amidaMangrove:20191221231648p:plain イベントの取得先をNormalizedLevelViewのLevelに設定するのを忘れないように。

これでビルドを行いOculus Questで実行します。

結果

www.youtube.com

やりたかったことはだいたいできた!!

ギターの音自体はオーディオインターフェースから出力。入力はPCを通してOsc送信→Oculus Questで受信→ビューに反映って感じで。遅延どうかなーと思ったけど自宅環境でやる分には個人的に気にならなかったです。そしてやっぱりkeijiroさんは神でした。

まとめ

今回の内容で何ができそうか考えてみると

  • リアル楽器をコントローラーとして使ったインタラクティブな遊び
  • VFXGraphとかを使用して音のビジュアライズ化(QuestではVFXGraphうまく表示されないけど..)
  • Hapbeatとかと組み合わせるのも良い?
  • タブ譜とかVR内で見ながら弾けたら良いかも

まぁ実際やってて思ったのは機材の準備が面倒。あと手元がよく見えない自宅以外の環境でちゃんとできるのか?とか

まぁ....というわけで、Unityも楽器も....楽しんだもん勝ちだぜ!!

f:id:amidaMangrove:20191225010051j:plain

(おしまい)