🔈

DXライブラリでADX2LEを使って音量調整オプションを作るまで[1.データ準備編]

2024/11/20に公開

前書き

C++&DXライブラリでの開発にあたって「UnityのAudioMixerで作っていたような音量調整オプションを作りたい」という質問が。

DXライブラリにも音量変更の関数は用意されていますが音源や種類ごとに都度音量を再設定するのはやや手間です…

自分が学生時代にDirectXで開発していたときはXACTというADXに近いようなツールがありそれを使っていました。
また、当時もADXには興味があって少しだけサンプルをかじっていました。
そしてUnityのAudioMixerを使った音量調整オプションを作るために読んだ本が、2019年に発売された「Unityサウンド エキスパート養成講座」だったことから、今回もADX2LEを使ってみることにしました。
https://www.borndigital.co.jp/book/15163/

SDKとツールをダウンロード

公式のダウンロードページから、「ADX LE Native SDK」とツールをダウンロードします。
https://game.criware.jp/products/adx-le/

SDKはわかりやすい場所、若しくはプロジェクト内部に設置すると良いです。
(とりあえず保存先にCドライブ直下にcriフォルダを作って配置しておきました)
ツールの方のtoolsフォルダも同様にcriフォルダに入れておきます。

今回はtoolsフォルダ内部にあるADX2LE > ver.3 > 「CriAtomCraft.exe」を起動します。

初回起動時は認証のアプリが起動するのでメールアドレスで登録してください。
一度登録しておけば次回以降はすぐツールが開きます。

プロジェクト作成

CriAtomCraftを起動したらおそらくスタートページ画面が表示されると思うので、左上らへんの新規作成ボタンからプロジェクトを作成します。

プロジェクト名を決めると次はワークユニット名を決めろと言われます。

ワークユニットとは公式の用語集によると以下のとおりです。

ワークニットはプロジェクト内の共通設定以外のデータを分割する単位です。
作業担当者や作成するデータ区分に応じてプロジェクトデータの分割を行うために使用します。

今回はとりあえず1人で小規模の制作なので名前はそのままWorkUnit_0で進めます(どうしても気になる人は変えても問題ない)
これでたくさんウィンドウの表示されるエディター画面が立ち上がります。

音ファイルの登録

ウィンドウがたくさんあってわかりづらいですが、今回よく使うのは以下のウィンドウです。
1. プロジェクトツリー
2. ワークユニットツリー
3. マテリアルツリー
4. タイムライン
5. インスペクター
6. 非参照リスト
(筆者は若干レイアウトを変えているので各ウィンドウの上部で名前を確認)

さすがに全機能を使いこなすには時間がかかりそうですが、最低限ゲームで音を鳴らすためのデータを作るだけならそこまで覚えることもないです。

とりあえず使いたい音のファイルをマテリアルとして登録していきます。
使えるファイル形式は .wav と .aif(.aiff)のみなので注意してください。
マテリアルツリーウィンドウの「マテリアルルートフォルダー」部分にファイルをドラッグ& ドロップするとマテリアルとして追加できます。

一応マテリアルツリー内でファイルを選択した状態でF5キーを押すと再生の確認ができます(F6で停止)
(もしくはエディタ上部の再生停止ボタンでも可)

キューの作成

続いてワークユニットツリーのキューシートフォルダー内にあるキューシートという部分にキューを作成していきます。
キューの公式用語集解説は以下のとおりです。

ゲームプログラム側からサウンドをリクエストする際に指定するオブジェクトのこと。
キューはタイムラインを持つシーケンスや複数のトラックに置かれたサウンドアイテムによって構成されている。
一番多いのはサウンドを再生することだが、逆にサウンドを止めたり、パラメータを変えたりすることができる。

つまり実際に音を鳴らすときに参照する大事な部分です。
キューシートは複数のキューを持っていて、シーンやキャラクターなどの単位で分けるのが好ましいとの事ですが、
今回はお試しで音数が少ないので「BGM」と「SE」に絞って分別を行います。

キューの作成はキューシートを右クリックして新規オブジェクトから作成できるほか、
マテリアルツリーのマテリアルをキューシートに直接ドラッグ&ドロップすることでも作成可能です。
([マテリアルルートフォルダー]部分にドラッグしないと追加できないかも)

ここでは元からあるCueSheet_0を「BGM」にリネームして、新しく「SE」キューシートも作成します。

それぞれのキューシートにマテリアルを一通りドラッグして登録してください。

登録したキューを選んでF5/F6で再生・停止確認できます。
※ちなみにキューは初期の状態だと複数同時に再生できる
F5連打すると大量に同じキューが再生されます。

カテゴリの作成・設定

今回の主目的が音量調整オプションの実装であるため、それぞれのキューにどのカテゴリの音なのかを登録する必要があります。
そのために使うのが「カテゴリ」機能です。

プロジェクトツリーウィンドウの中にあるカテゴリフォルダを確認すると既にCategoryGroup_0というグループがあり、その中にCategory_0というカテゴリが存在しています。

今回はカテゴリグループの名前をSoundCategoryとリネームし、Category_0をBGMにリネーム、新しくカテゴリを追加して名前をSEにします。
BGMとSEの他にマスターボリュームも必要なのでカテゴリグループをもう一つ作成してMasterと命名し、中にもMasterという名前のカテゴリを作成します。
全て終えると下図のようになります。

ADXでは1つのキューに複数のカテゴリを設定することができるので(カテゴリグループ内では1つのみ)、
それぞれのキューにMasterと自分のカテゴリをセットしていきます。

カテゴリを作成したらカテゴリを設定したいキューを選択し、インスペクターウィンドウの中からキュー > カテゴリ の項目を見つけてください。

BGMなら「BGM・Master」に、SEなら「SE・Master」にチェックをつけます。

(この作業を複数選択でまとめてカテゴリ付けする方法が見つからず全て手作業に…)

一応プロジェクトツリーのカテゴリを選択すると、右下の方にある被参照リストに紐づいたキューの一覧が表示されます。
見つからない場合はツール下の「被参照リスト」という部分をクリックしてみてください。

また、BGMカテゴリのみ同時に2曲(2つのキュー)を鳴らすことが無いので、カテゴリ自体にキューリミットという設定を行います。

カテゴリを選択してインスペクターでプライオリティの部分を確認します。
カテゴリキューリミットフラグがFalseになっているのでTrueに変更し、カテゴリキューリミット数を変更してください。

また、音を鳴らすときにボイスプールという仕組みを使うのですが、
例えばBGM再生中にこれの最大数以上の効果音が鳴るとBGMが押し出されて消えてしまう、ということが発生します。

対処法を探してみましたがイマイチうまくいかなかったので、ボイスリミットグループという機能でボイスの発音数を制御して対応することにします。
(サンプルプロジェクトではうまく制御できていたのでちゃんと設定自体はありそう)
プロジェクトツリーのボイスリミットグループにはVoiceLimitGroup_0というものがすでに作られています。

これをBGMにリネームし、SEという名前でもう一つ作成してください。
それぞれ選択してインスペクターで以下のように設定します。

(プログラム側で最大を24にしてBGMは切り替えクロスフェード用に2、SEは23とした。目安なので各自要検討)

各キューを開いていくと最下層にマテリアル(青丸アイコン)があるのでこれを選択します。

選択したらインスペクターのプライオリティ>ボイスリミットグループを探すか、インスペクターの右側で「ボイス」という項目を選択します。

BGMとSEそれぞれ該当するグループに振り分けてください。

BGMのループ

BGMは通常ループ再生をしたいと思います。
ですが普通の音源をキューに設定しただけだとキューを再生しても1回再生されて終わってしまいます。
タイムラインの拡縮(右下の+/-)を調整してキューに登録されているマテリアル全体を見てみると以下のように1回分しか配置されていないのがわかります。

ループさせたい音源は「マテリアルツリー」のループさせたいマテリアルを選択し、
インスペクターの「ループ情報の上書き」をTrueに変更して、
ループタイプをループに設定します。

これでタイムラインを確認するとマテリアルがループされるようになったのがわかります。

また、音源自体にループポイントを設定することでABループができるようになります(イントロ+ループ部分のような再生)
ループポイントはWavosaurなど別のツールで作る事が可能です。(ADXでも一応できる、詳細は割愛)
もともとループポイントのあるマテリアルがキューに登録されていると、タイムラインで以下のように緑色のラインが入ります(緑下線部をループする)

BGMにフェードイン・アウトを付けてクロスフェード対応

現在、再生するBGMを切り替えるとブツっと切れてしまいイマイチなのでクロスフェードしてくれるように設定しておきます。

ワークユニットツリーでキューを一番深くまで開いて青いアイコンのマテリアルを確認します。

このマテリアルを選択した状態で、インスペクター右側にあるタブのようなボタンから「エンベロープ」を探してクリックします。

ここでアタックを200、リリースを500くらいに変更します。

この時点でBGMを再生中に他のBGMを再生してみると微妙にクロスフェードになっているのが確認できます。
アタックとリリースの値を調整するとフェードのかかり具合を変えることができます。

おまけ:再生時ピッチ変更

足音やヒット音など何回も同じ音が鳴るものは変化が無いと単調に聞こえてしまいます。
力技で解決するなら音データを複数種類用意してプログラム側でランダムに鳴らす方法もありますが、
ADXではツール側でこの設定を行うことができ、プログラム側ではキューを再生するだけで勝手にランダム再生をしてくれます。

複数のマテリアルの中からランダムで鳴らす機能もありますが、今回は1つのマテリアルのピッチをランダムに再生する方法で設定してみます。

設定は簡単で、キューを選択してインスペクターのピッチ > ピッチランダム幅を0~1200の間で設定するだけです。

(↑足音のキューのピッチランダム幅を試しに500くらいにしてみた)
設定したらF5連打でピッチが変化するのを確認できればOKです。

ビルド

全て完了したらプロジェクトを一旦保存(左上のフロッピーディスクのボタン)しておき、その右側にあるビルドボタンを押します。

ビルドに含むキューシートのチェックボックスがあるので、とりあえず全部つけておきましょう。
(更新がなければスキップしてくれるので今回のような規模なら毎回つけておいてもいいと思う)

設定が済んだらビルドを実行します。

「出力パスを開く」というボタンがあるので押すと、プロジェクトフォルダのルートが開きます。

プロジェクトフォルダ > Publicフォルダにビルドデータがあります。
ここで必要になるのが、「.acf」ファイルと、ワークユニットのフォルダ(ここではWorkUnit_0)の中にある「.acb」ファイル、あとはそれらに付随するヘッダーファイルです。

それぞれのファイルの内容は以下のとおりです。
・ACF

プロジェクト1つに対して1つだけ出力されます。
全体設定やグローバルなパラメータが含まれます。

・ACB

キューシート1つに対して1つ出力されます。
メモリ再生設定されたウェーブフォームデータもここに含まれます。

これら3種類のファイルは全てVSプロジェクトのフォルダに持っていく必要があるので場所を覚えておきましょう。

おわり

これでADXを使って音を鳴らすためのデータが完成しました。
普通に再生するだけでABループができたりピッチランダム再生ができたりとそれだけでも便利ですが、
さらにファイル容量が削減できたり、もっと細かく設定すればエフェクトやダッキングなど多彩な表現ができます。
遅延を減らして負荷も抑えて再生ができるため音ゲーやスマホゲームで良く採用される理由にもなっているようです。

このデータを使って次回はとりあえず音を再生する設定を行っていきます!

次記事↓
https://zenn.dev/takodevlog/articles/8c80bdecd88730

Discussion