執筆バージョン: Unreal Engine 5.4
|
ヘイガイズ!エンジニアの片平です!
今回は UE5.4 で追加となった「Harmonix」プラグインを使用して、
プレイヤーの操作に対してBGMに合ったメロディを再生する仕組みをご紹介します。
Harmonix とは
UE5.4 リリースノートより
「Unreal Engine 5.4 の新機能である Harmonix プラグインは、音楽ゲームプレイの作成に使用できる一連のツールとランタイム機能を提供します。」とあります。
主にUE5でMIDIを扱う機能と新たなサンプラー(Fusion Sampler)が提供されるようです。
- MIDI … 電子楽器やコンピュータが音符や演奏情報をやり取りするための規格
- サンプラー … MIDIや人間の入力に対して音声(サンプル)を再生する電子楽器
Fusion Sampler は置いておいて、今回はMIDIを活用した実装例のご紹介です。
例によってベータな機能ですので、今後のアップデートによっては仕様が変更される可能性があります。ご留意ください。
なお、MetaSound の基本的な機能については当ブログの下記記事にてご紹介しております。
再生や出力などの機能の詳細については省略いたしますので、下記記事をご参照ください。
[UE5] ハンズオン! UE5サウンド新機能”MetaSounds”で効果音を加工してみよう!
作るもの
(音量にご注意ください。)
プレイヤーが白いアイテムを取得したタイミングでBGMに合ったメロディが流れています♪
作成手順
プロジェクトの作成
ThirdPersonTemplate から新規のプロジェクトを作成します。
プラグインの有効化
Audio -> Harmonix を探して、有効化しましょう。
Unreal Editorの再起動を求められるため再起動します。
音源ファイルのインポート
今回はメロディが分かりやすい曲をご用意しました。(音量にご注意ください。)
この曲のメロディを抜いてBGMとします。
またメロディとして使うベルの単音も用意しました。C4(下から4番目のドの音)を鳴らしています。
BGMとベルの音をインポートします。

MIDIファイルをインポート
メロディのみを書き出したMIDIファイルをインポートします。
melody

MetaSoundの作成
Audio -> MetaSound Sourceから新しいMetaSoundを作成します。

名前は「MS_BGM」とします。

「MS_BGM」を開き、Outupt Format を Stereo に変更します。

下記の画像の通りにノードを組みます。
WaveAsset は先ほどインポートした BGM を選択します。

再生するとシンプルにBGMが鳴るMetaSoundができました。
BGMを設定する
「BP_ThirdPersonGameMode」 を開き、下記のようにノードを組みます。

これでゲーム中でBGMを鳴らすことができました。
MetaSoundでメロディを鳴らす
一度、MIDI再生の仕組みを理解するために
単純にMetaSound内でベル音でメロディを鳴らすように組んでみます。
ノードが長くなるので2回に分けて解説します。
MS_BGMを開いて下記のようにノードを組みます。

- OnPlay、OnLooped を TriggerAnyノードに繋ぎ、どちらかのトリガーが入ったらMIDIを再生するようにしています
- Trigger To Music Transport ノードで再生とシークを同時に実行します
- melodyのMIDIの頭に2小節の空白があったので SeekTareget に2小節の時点から再生されるように設定しています。
- Metronome MIDI Clock GeneratorでMIDIクロックを生成します
- 今回はBPM(テンポ) と LoopLengh(ループする小節間隔)を設定しています。
- MIDI Player で インポートしたMIDIアセット「melody」を再生します。
次にMIDI Playerに続けて下記のようにノードを組みます。

- MIDI Channel Filterでチャンネルを分離します。今回は 1ch にメロディが入っているので 1ch を取り出します。
- MIDI Note Trigger でNote On(鍵盤を押したタイミング)とMIDI Note #(音符の番号)を取り出します
- Wave PlayerでNote Onのタイミングで「bell」の音を鳴らします。
- 「bell」 は C4(ノートナンバー=60) で鳴らしているので、MIDI NOTE #から60を引きます。
- MIDIがC4を鳴らしたときに、オリジナルのピッチの「bell」の音が鳴るようになります。
- 「BGM」と「bell」の音をStereo Mixerでミックスします。
- 「bell」の音が少し小さいのでGainを1.5に調整しておきます。
MetaSoundの再生ボタンを押すと「bell」の音でメロディが奏でられます。
任意タイミングでのメロディ再生の準備
任意のタイミングでメロディを鳴らすために GameMode と MetaSound を編集します。
WavePlayerの再生中に音程を変えたくないので、メロディの音程をBP側に一時的に保存して、
メロディの再生タイミングと同時に音程を設定するように実装します。
まず、「MS_BGM」を開き、下記のInputs、Outputsを追加します。
- Inputs
- InNote … type:int32
- NoteOn … type:Trigger
- Outputs

MIDI Note Trigger ~ WavePlayer のノードを下記のように組み替えます。

- NoteOn のタイミングで発音するようにしています。
- MIDIのノートナンバーをOutNoteに出力するようにしています。
- InNoteから入力したノートナンバーにWavePlayerの音程を設定します。
「BP_ThirdPersonGameMode」を開き、赤枠のノードを追加します。

- WatchOutputで OutNote を監視し、値が変わったタイミングで「ChangeNote」イベントが実行されるようバインドします。
- ChangeNoteのOutputをInt32で取り出してTempNoteという変数に一時的に保存しています。
OutputWatchingに関しては過去記事でもご紹介しています。
[UE5]MetaSound Output Watchingで音に合わせた演出を作る
続けて下記のようなイベントを実装します。

- InNote に TempNote を入力
- NoteOn の Trigger を実行
OutputName、InName は MetaSound で設定した名前を正しく設定してください。
再生アイテムの作成
新規Actorを作成します。 名前は「BP_Item」とします。

BPエディタを開き、Sphere コンポーネントを追加します。

Sphere コンポーネントのDetailsを編集します。
- Simulate Physics にチェックを入れる
- Collision Presets を PhysicsActorに変更

Sphere の OnComponentHit イベントを下記のように組みます。

- キャラクターがアイテムにヒットしたらGameModeのOnTriggerイベントを実行して消えるように実装しています。
アイテムを配置
作成した「BP_Item」をレベルに大量に配置します。

完成!
冒頭の動画と同じものが出来上がります!
まとめ
今回のようなプレイヤー自身の操作で音楽が奏でられる実装は、
楽器演奏に似た気持ちよさを生み出せて面白いかなと思います。
記事を作っていて思いましたが、アイテム取得だとプレイヤーがボタンを押したタイミングではないので、
UI操作等で同様の演出が入っているほうがより気持ち良いかもですね。
UE5.0 で MetaSound が実装されてはや2年、やっっっっと公式でMIDIが扱えるようになりました!
MIDI対応によって出来ることはかなり増えたと思うので、是非工夫して面白い演出を作ってみてください!