LoginSignup
1
0

More than 1 year has passed since last update.

UE5+サウンドミドルウェアADXで、BGMに動的なドラムパートを(発展編)

Last updated at Posted at 2023-01-20

はじめに

アンリアルエンジンとサウンドミドルウェア「ADX for UE」を連携させ、パーカッションのないメロディラインに動的にドラムパートを追加し、さらにランタイムでドラムパターンを変化させていけるシステムの実装チュートリアルです。

ゲーム内のシチュエーションに合わせてパートを追加するだけでなく、細かな状況に合わせて使用する打楽器を変えてみたり、はたまたユーザーがドラムパターンを作れてしまう、といった活用も可能です。

当記事は「UE5+サウンドミドルウェアADXで、BGMに動的なドラムパートを(再生編)」の発展編として書かれています。
まずは次の記事で、基本的な実装を試してみてください。

前提

当記事ではUE5.0を使用しています。基本的にブループリントのみでの実装を想定します。
ADXはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/

なお、ADX2は「ADX」へ名称が変更になりましたが、ツール構成は変更ありません(2がないから古いほう、というわけではありません)。

記事執筆時点のADX for UEのSDKバージョンはADX LE UE SDK(1.31.00.01)です。

ADX for UEの導入や基本的な使い方は以下の記事にあります。必要に応じて参照してください。
ADX for UEの導入で、一歩上のサウンド表現を(導入編)

ADX for UEの導入で、一歩上のサウンド表現を(実践編)

実装

AtomCraftでBeatSyncタイミングを細かくする

再生編で構成したキューでは、1小節にコールバックイベントが4回実行されます。UEで処理を加え1小節につき8回の実行になりましたが、ドラムパターンを構成するなら16分割ほど欲しいところです。

AtomCraftに戻り、BeatSyncのタイミングを変えてみましょう。

BeatSyncの設定変更

まずはメロディのキュー内にある「BeatSync」マーカーを選択します。
A01.png
正攻法ではなさそうですが、bpmを4倍、分子を16にすることで1小節を16分割します。
A02.png
本来のbpmが124の場合、4倍して「496」を入力します。

すべてのメロディキューに対して同様の手順を踏みます。

キューシートのビルド

通常と同じ手順でキューシートをビルドします。

UEで動的なドラムパターンを構成する

ここから再びUEでの作業に移ります。

キューシートのインポート

キューシートを再インポートします。
すべてのキューがコンテンツブラウザにあることを確認しておいてください。
B01.png

BeatSyncの動作確認

一度そのまま実行して動作を見てみましょう。
より細かいタイミングで、慌ただしくドラムが鳴るようになったはずです。

ドラムパターン用変数を読み取り、再生する

再生編で使ったブループリントアクターを開きます。
作成した一連の処理ですが、次の画像で選択している部分を一度消してしまいましょう。
B02.png
新しく処理を書いていきます。
B03.png
MyBlueprintパネルにて、新しくBool型の変数を追加します。
B04.png
これはドラムパターンを記憶しておくための変数です。1小節につき16回ぶんのパターンを記憶したいので、配列(Array)変数に変更します。
Detailsパネルにて、「Single」から「Array」に設定します。
これでひとつの変数にいくつもの値を持つことができます。
B05.png
一度コンパイルし、初期値を設定します。
Detailsパネルの「Default Value」にて、+(Add Element)ボタンを押し最大が「Index 16」になるまで追加します。
本来なら要素は16個(Index 15まで)あればいいのですが、DAWなどのツールではパターンの表記が1~16までとなっていることが多いためそれに合わせています。
(変数は0からカウントされるので、後でオフセットを計算する必要があります)
ややこしいと感じたらとりあえず画像を真似して設定してみてください。
B06.png
基本のキックパターンとして次の画像のようにチェックをつけてみましょう。
B07.png
ドラムパターンを実際に再生する処理を書きます。
変数「Pattern_Kick」をGetし、そこから線を伸ばしGet(a copy) ノードを配置します。
B08.png
配列変数のGetノードはインデックス番号をInt型で指定してあげる必要があります。
先ほどDAWの表記に合わせるためにインデックス番号を余分に追加したので、そのぶんを加算してつなげます。
B09.png
Branchで現在の再生位置のドラム再生が有効かドラムパターン上で照合し、TrueであればSpawn Atom Sound 2Dでキック音を再生します。
B10.png

ここで試しにゲームを再生してみましょう。チェックをつけた場所でのみキック音が鳴るはずです。

レベル上でパターンをカスタムできるよう、変数の目玉アイコンをクリックして公開しておきましょう。
B11.png
ためしにレベル上でIndex15を「True」にしてみます。
B12.png
小節の終わりにのみキック音が連続で鳴るようになりました。

ハイハット、スネアも再生してみる

他のドラム、ハイハットやスネアについても再生されるよう実装してみます。
既に作成している変数「Pattern_Kick」を右クリックして「Duplicate」(複製)します。
C01.png
3つ複製したら、それぞれに名前をつけます。
C02.png
一度コンパイルし、初期値を適当に設定してみましょう。
次の画像はひとまずの設定例です。
C03.png

並行して各パートの再生が行われるよう、Sequenceノードを噛ませます。グラフの視覚的な整理にもつながります。
C04.png
キック音と同じように処理を組みます。
複製してもいいのですが、参照する変数とサウンドを変更するよう注意してください。
C05.png
すべてのドラム音について同じように書いていきます。
C06.png

キックに加え、ハイハットやスネアもパターンに応じて再生されるようになりました。
こちらも同じようにレベル上でカスタム可能です。

打楽器を差し替え可能にする

さらに、ドラムパターンで使用している音(キュー)を差し替え可能にしてみましょう。
使用する音を増やすため、AtomCraftに戻ってマテリアルを追加しました。
D01.png
こちらも専用のキューをそれぞれに作成します。
(他にも、専用のキューを作らずAisacコントロールやキュータイプ「セレクト」でサウンドを変更する方法もあります)
D02.png
キューシートをビルドし、UEで再インポートします。
「Sound Atom Cue」型の変数を4つ追加し、それぞれに名前をつけます。
D03.png
ドラムパターン用の変数から続けて作った場合、配列変数として作成されるケースがあります。
タイプが「Single」になっているか確認し、それ以外なら手動で「Single」に設定しましょう。
D04.png
コンパイルし、初期値として基本のドラムサウンドを指定します。
D04b.png
こちらも外部からアクセスできるよう変数を公開します。
D05.png
Spawn Atom Sound 2Dノードの対象として、この変数をつなげます。
これで現在指定しているサウンドが再生されるはずです。
D06.png
他のハイハット、スネアに対しても同じようにノードをつなげます。
D07.png
変数を公開しているので、レベル上でサウンドを差し替えられます。
別のキューを指定すると、ドラムのサウンドが異なるものに置き換わりました。

D08.png

ランタイムでドラムパターンをカスタムする

今回作成したドラムパターンは変数として外部からもアクセス可能なので、別のブループリントやレベルブループリントから、キーやボタン入力に応じてパターン上のBoolのON/OFFが可能となっています。
E01.png

冒頭で紹介したように、レベル上にスイッチを置いておきランタイム上でドラムパターンを編集する、という遊びも実現できてしまいます。
ゲーム中の敵の数に応じてドラムの密度が上がったり、パズルのギミックの一部に組み込んでみても面白いかもしれません。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0