Oculus Questで俺のギターをコントローラーにする
この記事はUnity #3 Advent Calendar 2019の25日目の記事です。
僕が書くのは完全に趣味と自己満の記事です。
あぁーVRでもギターが弾きてぇよー
僕はギターが大好きだ。中一でベンチャーズ(パイプラインとか....)をコピーし、今でも歪ませた音ばかりを出している。30後半になったけども必死にスウィープ奏法を練習している。そんな大好きなギターをなんとかVR上でコントローラとして使えないかなーと思ったのがこの記事のきっかけです。
ということで手元にあるギターをOculus Questのコントローラーとして使用できないかを考えてみよー
これだ!多分これでいけるんじゃあないかと思うのでやってみる。おそらくコーディング量はほぼ0です。
用意するもの
Keijiroさんが公開している「Lasp」と「OscJack」を使用します。Unityは2019.3.0fを使用。
他必要なものはどのご家庭にもある
- ギター
- オーディオインターフェース
となります。さらに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」に設定しておきます。
とりあえず左から「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」を設定します。
この段階で実行しオーディオ入力が取れているか確認しましょう。
※注意:Laspには「デフォルトデバイスを使用する」と「モノラル入力」の制限があるのでデバイス側で少し設定いじらないと入力取れないケースもあるかもしれません。その場合はサウンド設定を見直すといいかと。
OscJackを使用し入力結果を送信する
先ほど作成した3つのSphereに「OscPropertySender」もアタッチし、とりあえず以下の値を設定します
- IP Address:調べたOculus Questのipアドレス
- OSC Address:それぞれ「/low」「/band」「/high」
- Data Source:自身のオブジェクト
- Component:AudioLevelTracker
- Property:normalizedLevel
ひとまずこのプロジェクトで送信できているか確認するため、適当なGameObjectを置き「OscEventReceiver」をアタッチ。Window→OSC Monitorを開き確認します。
とりあえず送れてるっぽい。
Oculus Quest向け受信用のプロジェクトを作成する
Oculus Quest用のアプリの作り方は先人の方々がまとめてくださっているので「Oculus Quest Unity ビルド」でググってもらえれば色々ヒットします。
ひとまず先ほど作成した送信アプリから値を受け取り、Oculus Quest上でもSphereが動作するアプリを作ってみましょう。
新しく作成したプロジェクトに「OscJack」と先ほど作成した「NormalizedLevelView.cs」を追加します。
で、先ほどと全く同様にSphereで「Low」「Band」「High」を作っておき....(↓の画像は使いまわし)
それぞれに「NormalizedLevelView」と「OscEventReceiver」をアタッチします。
イベントの取得先をNormalizedLevelViewのLevelに設定するのを忘れないように。
これでビルドを行いOculus Questで実行します。
結果
やりたかったことはだいたいできた!!
ギターの音自体はオーディオインターフェースから出力。入力はPCを通してOsc送信→Oculus Questで受信→ビューに反映って感じで。遅延どうかなーと思ったけど自宅環境でやる分には個人的に気にならなかったです。そしてやっぱりkeijiroさんは神でした。
まとめ
今回の内容で何ができそうか考えてみると
- リアル楽器をコントローラーとして使ったインタラクティブな遊び
- VFXGraphとかを使用して音のビジュアライズ化(QuestではVFXGraphうまく表示されないけど..)
- Hapbeatとかと組み合わせるのも良い?
- タブ譜とかVR内で見ながら弾けたら良いかも
まぁ実際やってて思ったのは機材の準備が面倒。あと手元がよく見えない。自宅以外の環境でちゃんとできるのか?とか
まぁ....というわけで、Unityも楽器も....楽しんだもん勝ちだぜ!!
(おしまい)