MetaSound でプロシージャルな音楽を作成する
MetaSound は、高性能オーディオ システムで、サウンド ソースのデジタル信号処理 (DSP) グラフの生成を完全にコントロールできるオーディオ デザイナーを提供します。
このガイドでは、MetaSound ソース とブループリントを使用して、ゲームプレイに応じたプロシージャルな音楽システムを作成する方法について説明します。
前提条件
このガイドでは、「First Person (ファースト パーソン)」テンプレート プロジェクトなど、プレイヤー キャラクターの動きをサポートするプロジェクトが必要です。
1 - 音楽 MetaSound を作成する
画像をクリックするとフル サイズになります。
まず、プロシージャルな音楽を再生する MetaSound を作成します。以下の各サブステップに従って、上記のグラフをセクションごとに作成します。
このプロセスでは、今後のステップでブループリントからアクセスできるように、いくつかの入力パラメータを公開します。
1.1 - 初期設定
永続的なステレオ オーディオをサポートする MetaSound ソースを作成します。
- MetaSound ソースを作成します。
- コンテンツ ブラウザ で [Add (追加)] ボタンをクリックします。
- [Audio (オーディオ)] > [MetaSound Source (MetaSound ソース)] を選択します。
- 新しく作成した MetaSound に「
MSS_Music」などと名前を付けます。
- MetaSound をダブルクリックして、MetaSound エディタ を開きます。
- [Interfaces (インターフェース)] パネルで、UE.Source.OneShot インターフェース エントリの横にある [除去 (ゴミ箱)] ボタンをクリックします。これにより、アンビエンスやミュージックなどの永続的なサウンドでは使用されない On Finished Output ノードが除去されます。
- MetaSound エディタのツールバー の [MetaSound] ボタンをクリックします。
- [Details (詳細)] パネルで、[MetaSound] > [Output Format (出力形式)] ドロップダウンをクリックし、[Stereo (ステレオ)] を選択します。これにより、Out Mono Output ノードが Out Left および Out Right Output ノードに置き換えられます。
1.2 - テンポおよびリズム
[Tempo and Rhythm] セクションを作成して、Trigger ノードで音楽のタイミングを制御します。
- On Play Input ノードを見つけて、ピンを空白の領域にドラッグします。ノード検索で「Trigger Repeat」と入力し、接続先のノードを作成します。ノードをドラッグすると、グラフ内でノードを移動できます。
- Trigger Repeat ノードで次の手順を実行します。
- Period ピンからドラッグして、BPM To Seconds ノードを作成します。
- RepeatOut ピンからドラッグして、Trigger Counter ノードを作成します。
- BPM to Seconds ノードで、次の手順を実行します。
- Divisions of Whole Note を「16」に設定します。
- BPM ピンからドラッグして、Promote to Graph Input を選択します。この操作により、BPM という名前の Float Input ノードが作成されます。
- BPM ノードを選択します。
- [Details] パネルで、[Default Value (デフォルト値)] > [Range (範囲)] を「60.0、180.0」に設定します。
- Trigger Counter ノードで Reset Count を「8」に設定します。
- On Play Input ノードを除くすべてのノードを選択し、選択したノードの 1 つを右クリックして、Create Comment From Selection を選択します。
- コメント ボックスに「Tempo and Rhythm」という名前を付けます。
選択したコメント ボックスの色は、[Details] パネルで変更できます。
1.3 - メロディの生成
[Melody Generation] セクションを作成して、指定した音階でランダムなメロディを生成します。
- 次の手順で、[Tempo and Rhythm] セクションの Trigger Counter ノードを選択します。
- On Trigger ピンからドラッグして、Random Get (Float:Array) ノードを作成します。
- On Reset ピンからドラッグして、Random Get (Float:Array) ノードの Reset に接続します。
- Random Get (Float:Array) ノードで、次の手順を実行します。
- In Array ピンからドラッグして、Scale to Note Array ノードを作成します。
- Seed ピンからドラッグして、Random (Int) ノードを作成します。
- Value ピンからドラッグして、Add (Float) ノードを作成します。
- Scale to Note Array ノードで、Scale Degrees ピンからドラッグして Promote to Graph Input を選択します。これで、Scale Degrees という名前の Enum Input ノードが作成されます。
- Scale Degrees ノードを選択します。
- [Details] パネルで、次の手順を実行します。
- [General (全般)] > [Input (インプット)] を [Scale (音階)] に設定して、インプットの名前を変更します。
- (オプション) [Default Value] > [Default (デフォルト)] を、使用する音階に設定します。これにより、デフォルトが [Major Scale (メジャー音階)] になります。
- Random (Int) ノードで、次の手順を実行します。
- Max を「100000」に設定します。
- Next ピンからドラッグして、Promote to Graph Input を選択します。この操作により、Next という名前の Trigger Input ノードが作成されます。
- Next ノードを選択します。
- [Details] パネルで、[General] > [Input] を [NewMelody] に設定して、インプットの名前を変更します。
- Add (Float) ノードで、Bottom Addend を「48.0」に設定します。これは 4 オクターブのオフセットです。
- 新しいノードを「Melody Generation」という名前のコメント ボックスで囲みます。
1.4 - 合成 (正弦波)
入力音の周波数で正弦波を生成する [Synthesis (Sine)] セクションを作成します。
- [Melody Generation] セクションの Add (Float) ノードで、次の手順を実行します。
- 出力ピンからドラッグして、MIDI To Frequency (Float) ノードを作成します。
- 出力ピンから再度ドラッグして、Add (Float) ノードをもう 1 つ作成します。
- 新しい Add (Float) ノードで、次の手順を実行します。
- 出力ピンからドラッグして、MIDI To Frequency (Float) ノードをもう 1 つ作成します。
- Bottom Addend ピンからドラッグして、Promote to Graph Input を選択します。この操作により、AdditionalOperands という名前の Float Input ノードが作成されます。
- AdditionalOperands ノードを選択します。
- [Details] パネルで、次の手順を実行します。
- [General] > [Input] を [Detune] に設定して、インプットの名前を変更します。
- [Default Value] > [Default] を「12.0」に設定します。
- [Default Value] > [Range] を「0.0、12.0」に設定します。
- 各 MIDI To Frequency (Float) ノードで、Out Frequency ピンからドラッグして、Sine ノードを作成します。
- 最初の Sine ノードで、Audio ピンからドラッグして、Add (Audio) ノードを作成します。
- 2 番目の Sine ノードで、Audio ピンを Add (Audio) ノードの Bottom Addend に接続します。
- 「Synthesis (Sine)」という名前のコメント ボックスで新しいノードを囲みます。
1.5 - 合成 (のこぎり波)
入力音の周波数でのこぎり波を生成する [Synthesis (Saw)] セクションを作成します。
- [Synthesis (Sine)] セクションのすべてのノードを選択し、選択したノードの 1 つを右クリックして、Duplicate を選択します。
- Add (Float) ノードと MIDI to Frequency (Float) ノードの入力ピンが、[Melody Generation] セクションの Add (Float) ノードの出力ピンに接続されていることを確認します。
- 両方の Sine ノードを削除し、Saw ノードに置き換えます。
- 「Synthesis (Saw)」という名前のコメント ボックスで新しいノードを囲みます。
1.6 - クロスフェード
正弦波合成とのこぎり波合成の比率をコントロールするために、[Crossfade] セクションを作成します。
- [Synthesis (Sine)] セクションの [Add (Audio)] で、出力ピンから引き出して Crossfade (Audio, 2) ノードを作成します。
- Crossfade (Audio, 2) ノードで、次の手順を実行します。
- In 1 ピンを [Synthesis (Saw)] セクションの Add (Audio) ノードの出力ピンに接続します。
- Crossfade Value ピンからドラッグして、Promote to Graph Input を選択します。この操作により、Crossfade Value という名前の Float Input ノードが作成されます。
- Crossfade Value を選択します。
- [Details] パネルで、[General] > [Input] を [Crossfade] に設定して、インプットの名前を変更します。
- 「Synthesis (Crossfade)」という名前のコメント ボックスで新しいノードを囲みます。
1.7 - フィルタリング
[Filtering] セクションを作成して、サウンドを滑らかにします。
- [Crossfade] セクションの Crossfade (Audio, 2) ノードで、Out ピンから引き出して Ladder Filter ノードを作成します。
- Ladder Filter ノードで、次の手順を実行します。
- Resonance を「6.0」に設定します。
- Cutoff Frequency ピンからドラッグして、LFO ノードを作成します。
- LFO ノードで、次の手順を実行します。
- Frequency を「0.5」に設定します。
- Min Value を「500.0」に設定します。
- Max Value を「5000.0」に設定します。
- 「Filtering」という名前のコメント ボックスで新しいノードを囲みます。
1.8 - エンベロープ
主旋律からサステインを取り除くために、アタック - 減衰エンベロープを含む [Enveloping] セクションを作成します。
- [Melody Generation] セクションの Random Get (Float:Array) ノードで、On Next ピンからドラッグして、AD Envelope (Audio) ノードを作成します。
- AD Envelope (Audio) ノードで、Decay Time を「0.1」に設定します。
- 「Enveloping」という名前のコメント ボックスで新しいノードを囲みます。
1.9 - エフェクト処理
ステレオ ワイド化エフェクトを生成する [Effects Processing] セクションを作成します。遅延によりモノラル信号がステレオ信号のように聞こえます。
- [Enveloping] セクションの AD Envelope (Audio) ノードで、Out Envelope ピンからドラッグして、Multiply (Audio) ノードを作成します。
- Multiply (Audio) ノードで、次の手順を実行します。
- Bottom Multiplicand ピンを [Filtering] セクションの Ladder Filter ノードの Out ピンに接続します。
- 出力ピンから引き出して、Delay ノードを作成します。
- Delay ノードで、次の手順を実行します。
- Delay Time を「0.02」に設定します。
- Out ピンから引き出して、Stereo Delay ノードを作成します。
- Stereo Delay ノードで、次の手順を実行します。
- In Right ピンを Multiply (Audio) ノードの出力ピンに接続します。
- Delay Mode を Ping Pong に設定します。
- Delay Time を「0.2」に設定します。
- Delay Ratio を「0.2」に設定します。
- Dry Level を「0.7」に設定します。
- Wet Level を「0.2」に設定します。
- Feedback を「0.4」に設定します。
- Out Left ピンを Out Left Output ノードに接続します。
- Out Right ピンを Out Right Output ノードに接続します。
- Delay ノードと Stereo Delay ノードを「Effects Processing」という名前のコメント ボックスで囲みます。
1.11 - MetaSound を再生する
これで MetaSound を再生する準備が整いました。
- MetaSound を保存します。
- MetaSound エディタのツールバー の [Play (再生)] ボタンをクリックし、MetaSound を再生します。
- ウィジェットまたは [Details] パネルを使用して、入力値を調整し、その変化をリアルタイムで確認します。
2 - ブループリント アクタをビルドする
ランタイム時に MetaSound の変化をトリガーする Box Colliders を備える ブループリント アクタ を作成します。
2.1 - ブループリント クラスを作成する
- コンテンツ ブラウザ で [Add (追加)] ボタンをクリックします。
- [Blueprint Class (ブループリント クラス)] を選択します。
- [Pick Parent Class (親クラスを選択)] ウィンドウで [Actor (アクタ)] を選択します。
- 新しく作成したブループリント アクタに
BP_MusicPlayerなどと名前を付けます。
2.2 - コンポーネントを追加する
アクタにコンポーネントを追加して、プレイヤーがそれらのゾーンを出入りすると反応する、3 つの個別のトリガー ゾーンを作成します。
- ブループリント アクタをダブルクリックして、ブループリント エディタ を開きます。
- Box Collision コンポーネントを追加します。
- [Components (コンポーネント)] パネルで、次の手順を実行します。
- [Add] ボタンをクリックします。
- 検索バーに「Box Collision」と入力し、Enter キーを押します。
- [Details] パネルで、次の手順を実行します。
- [Transform (トランスフォーム)] > [Scale (スケール)] を「5.0、5.0、1.0」に設定します。
- [Rendering (レンダリング)] > [Hidden In Game (ゲーム内で非表示)] を無効にします。
- [Components (コンポーネント)] パネルで、次の手順を実行します。
- Text Render コンポーネントを Box Collision コンポーネントに追加します。
- [Components] パネルで、次の手順を実行します。 1.Box Collision コンポーネントを選択します。 1.[Add] ボタンをクリックします。 1.検索バーに「Text Render」と入力し、Enter キーを押します。
- [Details] パネルで、次の手順を実行します。 1.[Transform] > [Location (位置)] を「0.0、0.0、150.0」に設定します。 1.[Text (テキスト)] > [Horizontal Alignment (水平アライメント)] を [Center (中央)] に設定します。 1.[Text] > [World Size (ワールド サイズ)] を「64.0」に設定します。
- コンポーネントのコピーをさらに 2 つ作成します。以下の手順を 2 回実行します。
- [Components] で、Ctrl キーを押しながらクリックして、Box Collision コンポーネントと Text Render コンポーネントの両方を選択します。
- 右クリックして、[Duplicate (複製)] を選択します。
- BPM トリガーをカスタマイズします。
- [Components] パネルで、1 番目の Box Collision コンポーネントを右クリックして、[Rename] を選択し、「
Trigger_BPM」という名前を付けます。 - [Details] パネルで、[Transform] > [Location] を「0.0、350.0、0.0」に設定します。
- [Components (コンポーネント)] パネルで、子の Text Render コンポーネントを選択します。
- [Details] パネルで、[Text] > [Text] を「BPM」に設定します。
- [Components] パネルで、1 番目の Box Collision コンポーネントを右クリックして、[Rename] を選択し、「
- Crossfade トリガーをカスタマイズします。
- [Components] パネルで、2 番目の Box Collision コンポーネントを右クリックして、[Rename] を選択して、「
Trigger_Crossfade」という名前を付けます。 - 子の Text Render コンポーネントを選択します。
- [Details] パネルで、[Text] > [Text] を「Crossfade」に設定します。
- [Components] パネルで、2 番目の Box Collision コンポーネントを右クリックして、[Rename] を選択して、「
- Melody トリガーをカスタマイズします。
- [Components] パネルで、3 番目の Box Collision コンポーネントを右クリックして、[Rename] を選択して、「
Trigger_Melody」という名前を付けます。 - [Details] パネルで、[Transform] > [Location] を「0.0、-350.0、0.0」に設定します。
- [Components (コンポーネント)] パネルで、子の Text Render コンポーネントを選択します。
- [Details] パネルで、[Text] > [Text] を「Melody」に設定します。
- [Components] パネルで、3 番目の Box Collision コンポーネントを右クリックして、[Rename] を選択して、「
- MetaSound のオーディオ コンポーネントを追加します。
- [Components] パネルで、次の手順を実行します。 1.[Add] ボタンをクリックします。 1.検索バーに「Audio」と入力し、Enter キーを押します。 1.[Details] パネルで、[Sound (サウンド)] > [Sound] を「Music MetaSound」に設定します。
2.3 - Trigger イベントを追加する
各ゾーンにコリジョン応答イベントを追加します。
- [Components] パネルで、Trigger_BPM を選択します。
- [Details] パネルで、次の手順を実行します。
- [Events (イベント)] > [On Component Begin Overlap] の横にある [+Add (+追加)] ボタンを選択します。
- [Events] > [On Component End Overlap] の横にある [+Add (+追加)] ボタンを選択します。
- [Components] パネルで、Trigger_Crossfade を選択します。
- [Details] パネルで、次の手順を実行します。
- [Events (イベント)] > [On Component Begin Overlap] の横にある [+Add (+追加)] ボタンを選択します。
- [Events] > [On Component End Overlap] の横にある [+Add (+追加)] ボタンを選択します。
- [Components] パネルで、Trigger_Melody を選択します。
- [Details] パネルで、[Events] > [On Component Begin Overlap] の横にある [+Add (+追加)] ボタンをクリックします。
2.4 - Trigger イベントをビルドする
画像をクリックするとフルサイズになります。
各イベントにノードをアタッチして、音楽を制御します。
以下で使用する Set Float Parameter (Audio) ノードと Execute Trigger Parameter ノードを見つけるには、検索コンテキスト メニューの右上にある Context Sensitive フィルタをオフにする必要がある場合があります。
- On Component Begin Overlap (Trigger_BPM) ノードで、Exec Output (>) ピンからドラッグして、Set Float Parameter (Audio) ノードを作成します。
- Set Float Parameter ノードで、次の手順を実行します。
- In Name を「BPM」に設定します。
- In Float を「120.0」に設定します。
- On Component End Overlap (Trigger_BPM) ノードで、Exec Output (>) ピンからドラッグして、Set Float Parameter (Audio) ノードをもう 1 つ作成します。
- 新しい Set Float Parameter ノードで、次の手順を実行します。
- In Name を「BPM」に設定します。
- In Float を「90.0」に設定します。
- On Component Begin Overlap (Trigger_Crossfade) ノードで、Exec Output (>) ピンからドラッグして、Set Float Parameter (Audio) ノードをもう 1 つ作成します。
- 新しい Set Float Parameter ノードで、次の手順を実行します。
- In Name を「Crossfade」に設定します。
- In Float を「1.0」に設定します。
- On Component End Overlap (Trigger_Crossfade) ノードで、Exec Output (>) ピンからドラッグして、Set Float Parameter (Audio) ノードをもう 1 つ作成します。
- 新しい Set Float Parameter ノードで、次の手順を実行します。
- In Name を「Crossfade」に設定します。
- In Float を「0.0」に設定します。
- On Component Begin Overlap (Trigger_Melody) ノードで、Exec Output (>) ピンからドラッグして、Execute Trigger Parameter ノードを作成します。
- Execute Trigger Parameter ノードで、次の手順を実行します。
- In Name を NewMelody に設定します。
- [Components] パネルで、オーディオ コンポーネントを Target ピンにドラッグします。
- ブループリントをコンパイルして保存します。
3 - レベルをテストする
ブループリントをテストする準備が整いました。
- BP_MusicPlayer を コンテンツ ブラウザ から レベル にドラッグして配置します。
- トランスフォーム ウィジェットを使用して、キャラクターが出入りできるようにアクタを配置します。
- レベル エディタのツールバー で [Play (プレイ)] ボタンをクリックします。
- トリガーに入ったり、出たりすることで、音楽エフェクトを確認してください。