
マイケル
みなさんこんにちは!
マイケルです!

エレキベア
こんにちクマ〜〜〜

マイケル
前回の記事に引き続き、CRIADXを使用したサウンド制御について触れていきます!
今回はサウンドミドルウェアの醍醐味である「インタラクティブミュージック」の実装例について紹介します!
具体的には下記のようなサンプルになります。

【Unity】第一回 CRI ADXを使用したサウンド制御 〜基本動作、周波数解析編〜
2024-03-28
▲前回の記事

▲実装したインタラクティブミュージックのサンプル

エレキベア
おお〜〜〜
サウンドに合わせてオブジェクトが反応するのは見ていて楽しいクマね

マイケル
サンプルプロジェクトのリポジトリと、CRI関連処理については下記になります!
こちらも合わせてご参照ください!
GitHub - unity-multi-audio
▲サンプルプロジェクト
フォルダ | 内容 |
---|---|
CriAtomCraftプロジェクト | |
APIを実行する処理 | |
サンプルゲーム固有のオーディオ関連処理 | |
サンプルゲームに関する処理 | |
CriAtomCraftプロジェクトから出力したサウンドデータ |

エレキベア
中々ボリュームのあるサンプルクマ
参考書籍

マイケル
今回実装するにあたり、下記書籍を参考にさせていただきました!


マイケル
UnityAudioとCRIADXを使用した実装について紹介されています。
ゲームサウンドにフォーカスした数少ない書籍なので、ぜひご一読ください!

エレキベア
Unityでのサウンド実装について幅広く知れる一冊クマね
インタラクティブミュージックの実装

マイケル
それでは早速実装内容について見ていきます!
インタラクティブミュージックの実装について、今回は下記について盛り込んでみました!
- イントロループからのブロック遷移
- オーディオ側からのイベント発行
- ビート同期によるオブジェクト伸縮
- AISAC値によるサウンド変化

エレキベア
いろいろ盛り込んでるクマね・・・

マイケル
今回のために、サンプル実装がしやすい曲も作りました・・・
それぞれ見ていきましょう!
イントロループからのブロック遷移

マイケル
最初に行ったのが「イントロループからのブロック遷移」処理です。
具体的にどういうことかというと、はじめはイントロをループしておき、プレイヤーが動き始めたらメインとなるブロックに遷移させるといった内容です!

▲プレイヤーが動き始めるまでイントロをループさせる

エレキベア
なんかペルソナのダンジョン出発前とかで見たことがある気がするクマ

マイケル
これを行うには、Cue内でブロックを作成して分割しておく必要があります。
今回は
・イントロ
・イントロループ
・メイン
・メインループ
の4つのブロックに分割しました。
参考:CRI ADX Tools マニュアル - ブロック遷移

▲Cueをブロック分割設定する

マイケル
あとは下記のような関数を用意して、プレイヤーが動き始めたタイミングで遷移するブロックのインデックスを指定すれば完了です。
今回はメインブロックに遷移させたいので、インデックスは2になります。
▲ブロックインデックスの指定
▲ブロック遷移処理

エレキベア
ツール側との連携で実装するクマね
オーディオ側からのイベント発行

マイケル
次は曲がメインの部分に入ったらオブジェクトを表示&背景色を変更するという処理になります。

▲メインの小節に入ったらオブジェクトと背景を表示する

マイケル
これにはCueの中にコールバックを設定することで検知できるようにしました。
設定したタグ名をスクリプト側で受け取ってコールバック登録すれば実装は完了です。
参考:CRI ADX Tools マニュアル - シーケンスコールバックマーカー

▲曲にコールバックを埋め込む
▲シーケンスコールバックの設定
▲再生時に設定している

エレキベア
任意のタイミングで実行できるのはいろいろと応用が効きそうクマね
ビート同期によるオブジェクト伸縮

マイケル
次はBGMのリズムに合わせてオブジェクトを伸縮させる処理についてです。
こちらはHi-Fi Rush等でよく見られるような挙動ですね

▲今回はSphereとBoxを対象とした

マイケル
これを行うには、予めキューにBGMや小節等のビート同期情報を設定しておく必要があります。
コールバックを設定する際に、設定ラベル名を見て判別するようにすれば実装は完了です。
参考:CRI ADX Tools マニュアル - ビート同期

▲ビート同期情報を予め設定しておく
▲ビート同期イベントの設定

エレキベア
これだけでリズムを取得することができるクマね

マイケル
なお、SphereやBoxといった伸縮させるオブジェクトには、下記のようなインターフェイスを実装してビート数を受け取るよう実装しています。
こちらも気になる方はリポジトリの実装を参照してみてください!
▲ビート同期オブジェクトのインターフェイス
AISAC値によるサウンド変化

マイケル
最後に味付けにはなりますが、ボスに近づくほどに別のギターパートの音量を上げるよう変化させてみました。
こちらはAISACという機能を使用して、ゲームから設定したパラメータに応じてサウンド側のパラメータも編集させることで実現しています。

▲ボスに近づくほどにギターパートの音量を上げるように変化させる

▲AISAC値によるボリュームコントロール設定例

マイケル
スクリプトからの呼び出しは簡単で、下記のようなAISAC値の設定関数を用意します。
ボスとの距離に応じてこの値を0-1の間で設定するようにすれば完了です!
▲AISAC値の設定
▲ゲーム側の設定

エレキベア
ゲームパラメータに応じてサウンドを変化させるクマね
これもいろいろと応用が効きそうな機能クマ
おわりに

マイケル
というわけで今回はCRIを使用してインタラクティブミュージックを実装してみました!
どうだったかな?

エレキベア
ミドルウェアに搭載されている機能を活用して
いろんな演出が出来て楽しかったクマ〜〜

マイケル
今回は無理やり詰め込んだサンプルになったけど、こんな感じでサウンドの細かい調整や凝った演出ができるのがサウンドミドルウェアの大きな魅力だね!
他にもいろんな機能が用意されているから、ぜひ活用していこう!!

マイケル
CRIの実装解説は以上になります。
次回以降はWwiseの実装について触れていきますので、お楽しみに!!

エレキベア
クマ〜〜〜〜〜
【Unity】第二回 CRI ADXを使用したサウンド制御 〜インタラクティブミュージック編〜 〜完〜

【Unity】第一回 UnityAudioを使いこなす 〜サウンド再生処理編〜
2024-01-22

【Unity】第二回 UnityAudioを使いこなす 〜AudioMixer活用編〜
2024-01-22

【Unity】第一回 Wwiseを使用したサウンド制御 〜基本動作編〜
2024-03-30

【Unity】第二回 Wwiseを使用したサウンド制御 〜インタラクティブミュージック編〜
2024-03-30

【Unity】サウンドミドルウェアに依存しない設計を考える【CRI ADX・Wwise】
2024-03-27