[UE5]2024年はUnreal EngineでMIDIが使いやすくなった元年かもしれない！

# Unreal Engine (UE) Advent Calendar 2024 13日目の記事です
https://qiita.com/advent-calendar/2024/ue

## そう、今年の13日は金曜日！

熱心なクリスチャンでもホラー映画愛好家でもない自分は
今夜はライブハウスでセロニアス・モンク[^1]を演奏する人たちが出没する日とか
[こちらのタイムライン](https://x.com/suekichiii)のフレディさん(マーキュリーじゃない方)が主役になる日とかそんな認識です。
ノリと勢いで張り切って枠をGetしたものの深いことは何ひとつ考えてませんでした…

振り返れば今年は念願のMIDI検定1級を受験することができました
結果は残念ながら不合格でしたが1年で2級までの合格と講師資格をフルコンプできたのは良い結果だったと思います。

と言うわけで今年は**MIDIを使ってUnreal Engineを動かしてみた**
お話をいたします。

## そもそもMIDIってなに？

>Musical Instrument Digital Interfaceの頭文字を取った言葉
>電子楽器やコンピューターなどのメーカーや機種を問わず、音楽の演奏情報をやりとりするための統一規格です。
>
>Musical Instrument　Digital Interfaceの頭文字を組み合わせた言葉で、電子楽器やコンピュータ等のメーカーや機種に関わらず音楽の演奏情報を効率良く伝達するための統一規格です。
>MIDIの演奏情報とは、楽器演奏の要素となる「音の高さ、大きさ、長さ」と音色や効果 を、数値化（記号化）したものです。音楽波形そのものを伝達するのに比べ約１００分の１に圧縮された効率のよい音楽の演奏情報です｡

AMEI(一般社団法人 音楽電子事業協会)のサイトより
https://www.amei.or.jp/midi2020.html

本来は電子楽器の操作で使うものとして作られたMIDIですが最近は通信信号としてのMIDIにも注目され始め
VJやバーチャルプロダクションなど音楽用途以外の使われ方もしています。

UE4の頃からMIDIを使ってUnreal Engine上のアクタをコントロールする機能はあったのですが
外部のDAWやMIDIコントローラーを使って何かする、という印象が強かったのです。

今年に入ってからMetaSoundとUnreal Engine5.4の新機能・Harmonixの組み合わせでよりわかり易く、使いやすくなったと感じました。

と、いうわけでMIDIファイルを読み込み演奏と同時にUnreal Engine上のスポットライトを連動させるデモンストレーションを使って説明していきます。

## 今回の作例

2024/09/15に発表したこちらの作例のブラッシュアップ版です
実はこの当時Harmonixのことを知らなくてBlueprintClassでMIDIデバイスを読み取るというUE4時代のような作り方をしています[^2]

https://x.com/kabgoya/status/1834991629960364280

この後職場にて**Fortniteで音ゲーを作れないだろうか？**
という相談をされてサウンドの同期について調べたところ**Harmonix**の存在を知ることになります。

https://historia.co.jp/archives/42309/

Harmonixは2024年12月現在も実験的機能ですが
便利なので個人的にはなんとか生き残って正式版になってほしいと願っています。

ちなみにHarmonixはFortniteでは使えません、念のため。

## 準備するもの
- Unreal Engine5.4以上(今回は5.5で検証)
- Standard MIDI File(以下SMF)
    - フォーマット1
    - 1トラックのみ
    - 1小節目から開始
    - 使用ノートはGM準拠 Kick Drum:36 Snare Drum:40

<iframe width="560" height="315" src="https://www.youtube.com/embed/NPjDyatw2wY?si=WOdKqNPz1ys6fMKd" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

Cubaseにてシンプルなドラムデータを作成後、SMFにて書き出し
サンプリングデータ取得のため整音の上、オーディオデータも書き出す

## 追加するプラグイン
- MetaSound
    - 5.4から正式版になったので5.4以降は何もしなくても大丈夫です
- MIDI Device Support 
    - MIDI信号を音楽以外の用途で使うために便利なプラグイン
- Harmonix(実験的機能)
    - MetaSoundでMIDIやサンプラー(後述)を使うための便利なプラグイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541757/96559621-852e-c32b-8700-dd56d3b2c4b6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541757/ed1e371b-7aae-311b-e577-2b0b53ea1a8d.png)

## Standard MIDI File(以下SMF)を扱う時気を付けること
### SMFはフォーマット1で書き出す
フォーマット0で書き出すとすべてのトラックが一つにまとまってしまうため
現在ほとんどのDAWは初期設定でSMFフォーマット1で書き出すようになっているが設定の再確認はやっておいた方がいい。
### 楽曲の開始小節を確認する
SMFの中には楽曲が2小節目からスタートさせるものがある。
これは1小節目を設定として使うためと最初からベストな音を出すために音源の立ち上がる時間をわざと空けるため。[^3]

## お待たせしました。いよいよ作り方です！

### 1.HarmonixのFusionSamplerを使い簡単なDrum音源の作成

Harmonixには**Fusion Sampler**というサンプラーが入っています

サンプラーをものすごくざっくり説明すると任意の音(サンプル)を鍵盤やパッドでそのまま再生したり音階をつけて再生したりできるシロモノです。
Get Wildの冒頭の小室哲哉さんのサンプラーさばきをイメージしていただければと思います。[^4]

<iframe width="560" height="315" src="https://www.youtube.com/embed/ZUEBJhXB6GU?si=HhqJaqokom77g1at" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

ま、UE5.4からサンプラー機能がついたと。
これでUEがあれば**ご自宅でもご自身の声でTMNのアリーナライブごっこができます！！**

…話を戻します。
音も同時に再生したいのでDAWで鳴らしたDrum音源からスネアとドラムを切り抜きFusion Patch(サンプラーの素材集)を作りました。
![FusionSampleIcon.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541757/479cc975-c19b-247f-c979-ec584c32a31f.jpeg)

![FusionPatchを作成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541757/b01d37b7-f84c-bef9-8e0e-601082aae7e9.jpeg)
素材をインポートし、まとめて選択、右クリック、フュージョンパッチを作成を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541757/131a0ffd-b857-bdd6-58e1-5d869eae08d7.png)
新規フュージョンパッチオプション画面
変更したのは最小ノートと最大ノートの設定のみ
Kick 36
Snare 40
になっているか確認
ファイルを開いて修正できるのでこの段階で上手く割り当てが出来なくても大丈夫です。

これをMeta Sound内のFusion Samplerで呼び出して使うわけです。
Harmonixにはシーケンサー(サンプラーの再生装置)もあるのですがこちらは使っていません。

### 2.SMFをインポートして1.の音源を再生
用意したSMFをインポートします
![長さアラート.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541757/1c1aa914-fd20-db58-3d60-e68db6b78fb4.jpeg)
SMFをインポートする時、このようなメッセージが出ますが『はい』で、で大丈夫です。
理由は後ほど調べます…

次に右クリック>オーディオ>MetaSoundソースでMetaSoundソースを作成しを以下の通りに組みます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541757/5282dc54-6a35-9163-fecf-adc9fa6677c8.png)

元の音源がモノラルなのでデフォルトのモノラル設定でも大丈夫なのですが、~~自己満足のため~~聴く側にリッチな気分に浸ってもらいたいのでステレオに切り替えています。

そして最初からあるOutputが余り、WARNING!を表示していますが**今は気にしないで下さい(;^ω^)**
音はきちんと鳴ります。
消す方法がわからないので対処法教えてほしいです…

保存したMetaSoundソースをビューポートに配置すると**ドラムの音が再生されます！**

<iframe width="560" height="315" src="https://www.youtube.com/embed/4rThar2lb6E?si=LIpAPKk34gcN30cy" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

### 3.MetaSound Output Watchingを使いNote On,Off情報を取得しSpotLightをOnOff  (赤:Kick Drum 青:Snare Drum)
ここではUE5.3から追加された**MetaSound Output Watching**という機能を使います
詳細はこちらから。

https://historia.co.jp/archives/37920/

**MetaSoundからSMFのNote On,Off情報を取得します**
先ほど作ったMetaSoundソースにMIDIデータを取得するノードを追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541757/e20223ee-81bf-1489-84d5-548c5e1dd78c.png)
通常はNoteOnのデータだけ取れば『SpotLightをOnにする』機能は果たすのですがNoteOffを取ることで『SpotLightをOffにする』タイミングを取ることができ『どれだけの間SpotLightをつけておきたいか』を取ることができます。

同じ4分音符でも次の泊ギリギリまで抑えるか鳴らしてすぐに鍵盤を離すかで同じ音符を演奏してもニュアンスが違ってくるので演奏表現にライトを合わせていきました。
![楽譜説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541757/0a337bdc-d30a-e0db-d5e6-a9c437962cd0.png)
同じ色の楽譜とピアノロールの長さを比べてください。
用意したSMFのデータはこんな感じで同じ拍をランダムな長さで再生するように作っています。


**次にSpotLightを制御するBlueprint Classを作成します**
親クラスはアクタ

ビューポートの配置はこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541757/04319867-da3e-6df0-7836-a0bf003c95a5.png)
Frontビューで左が青・右が赤です(このままビューポートに置くと配置が逆になる)
赤をKick Drum 青をSnare Drumと連動させていきます。

イベントグラフの配置はこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541757/da0b30d5-b3d9-471a-1bcb-a13d6e6d5032.png)
**Watch Output**ノードを使いそれぞれの楽器のNoteOn・NoteOffを取得しそれぞれのライトに同期させています。

コンパイルしたらビューポートに配置してプレイしてみましょう
それぞれのドラムと連動してライトがOnOffしています。

<iframe width="560" height="315" src="https://www.youtube.com/embed/Qk8h2fQPgbY?si=aOigwUUC1BxLPcf4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

DAWと照らし合わせた動画がこちらです

<iframe width="560" height="315" src="https://www.youtube.com/embed/UqKd7WRYYq8?si=ikLmyqPubhYdVa-H" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## さいごに
今回はMIDIでスポットライトを動かすだけのお話でしたが
応用次第ではコンポーザーさんから直接いただいたSMFデータからゲームやバーチャルプロダクションのネタにできる可能性が出てきたと思うと個人的にワクワクします。

MIDIには他にもビジュアル演出に活かせそうな面白いパラメーターがたくさんあるのでこれを機にガチMIDI勢らしい？UEコンテンツを作っていきたいと考えています[^5]

また、来年から積極的にLTや講演をしたいと考えていますのでこのようなネタでお話させていただける勉強会主催者さまのオファーもお待ちしております。

13日の金曜日ガン無視の内容でしたが楽しんでいただければ幸いです。
みんな、生き延びよう！
そして**Happyなクリスマス、そして年末年始を！**


[^1]:これでピンと来たあなたはかなりのジャズ通かと思います
[^2]:UE5.4のリリースが2024年4月なのでもうちょっと調べてたらラクできたと思うんだけどこんな遠回りも自分らしくていいと思う…(;^ω^)
[^3]:昔ながらのDTMer、おまじないかもと思いながらもだいたい2小節目から楽曲を開始する設定にしている。
[^4]:めちゃくちゃ個人的視点です。執筆中、Get Wildのあらゆるバージョンを聴きすぎて危うくゲワイ祭りにハマるところでした…
[^5]:そこだけに囚われる悪いクセは発動させぬようなるべく気を付けます…