![見出し画像](https://assets.st-note.com/production/uploads/images/68691438/rectangle_large_type_2_319d0f52d61b9d54a7ab1279b43a2fcc.png?width=1200)
UE5 MidiファイルでMetaSoundを演奏させる(Unreal-Midiプラグイン)
【今回のポジティブワード】
四角い枠にこだわるな
キャンバスからはみ出せ
~岡本太郎~
遂にやりたかったMIDIファイル+MetaSoundを実現することが出来ました。
プラグイン開発について学習したことで少し遠回りになってしまいましたが、目的を達成するためには必要なことでした。
無い機能を拡張できるプラグイン開発はキャンバスからはみ出せるので面白いですね。
初めに今回実装する内容について
MetaSoundはMIDI Note Noで音を再生することが出来ます。
![](https://assets.st-note.com/img/1640687316414-SfQS7MKkpt.png?width=1200)
MIDIファイルをUE5で扱うことが出来れば、MIDIファイルを使って音楽を再生できます。
![](https://assets.st-note.com/img/1640686773365-QZ0BDLbII2.png?width=1200)
Unreal EngineでMIDIファイルを扱うことが出来るプラグイン「Midi-Unreal」がGithubに公開されているので、UE5 EAで使用出来るようにします。
Midi-UnrealをUE5 EAで使用できるようにする
UE5 EAでC++のBlankプロジェクトを作成します。
![](https://assets.st-note.com/img/1640663001349-xGwtr2xtqo.png?width=1200)
Midi-UnrealをZipファイルでダウンロードします。
![](https://assets.st-note.com/img/1640686158474-wNjYqiUO1i.png?width=1200)
ダウンロードしたMidi-UnrealのZipファイルを展開します。
![](https://assets.st-note.com/img/1640687641528-Ci7QEEHDdn.png)
プロジェクトフォルダに「Plugins」を作成して、Midi-UnrealのZipファイルを展開したフォルダ内の「MidiAsset」フォルダをコピーします。
![](https://assets.st-note.com/img/1640663528158-uyAoOKGEuB.png?width=1200)
UE5のプロジェクトを閉じます。
![](https://assets.st-note.com/img/1640663564710-zBV9bHKnrU.png)
uprojectファイルを右クリックし、[Generate Visual Studio project files]を実行します。
![](https://assets.st-note.com/img/1640663930638-dN91SxXDz9.png)
[5.0]を選択して、[OK]をクリックします。
![](https://assets.st-note.com/img/1640663948641-sUAUoiBifg.png)
エラー内容が表示されます。
UE5がWin32に対応していないので、Build.csがエラーになっています。
![](https://assets.st-note.com/img/1640663999794-lfrpAJWwDL.png?width=1200)
エラーになっているBuild.csのWin32を判定している処理を削除します。
// Windows
if (Target.Platform == UnrealTargetPlatform.Win32 || Target.Platform == UnrealTargetPlatform.Win64)
{
PublicDefinitions.Add("__STDC_WANT_SECURE_LIB__=1"); // ignore warning
PublicDefinitions.Add("__WINDOWS_MM__=1");
PublicAdditionalLibraries.Add("winmm.lib");
}
↓
// Windows
if (Target.Platform == UnrealTargetPlatform.Win64)
PublicDefinitions.Add("__STDC_WANT_SECURE_LIB__=1"); // ignore warning
PublicDefinitions.Add("__WINDOWS_MM__=1");
PublicAdditionalLibraries.Add("winmm.lib");
}
// Windows
if (Target.Platform == UnrealTargetPlatform.Win32 || Target.Platform == UnrealTargetPlatform.Win64)
{
PublicDefinitions.Add("__STDC_WANT_SECURE_LIB__=1"); // ignore warning
}
↓
// Windows
if (Target.Platform == UnrealTargetPlatform.Win64)
{
PublicDefinitions.Add("__STDC_WANT_SECURE_LIB__=1"); // ignore warning
}
再び[Generate Visual Studio project files]を実行します。
![](https://assets.st-note.com/img/1640663930638-dN91SxXDz9.png)
今度はGenerateに成功したので、プロジェクトを再度開きます。
プラグインを再ビルドするようにダイアログが表示されるので[OK]をクリックします。
![](https://assets.st-note.com/img/1640665080569-lbMYeMtB6k.png)
プロジェクトが開かれると、MidiAssetがプラグインフォルダに追加されています。
![](https://assets.st-note.com/img/1640665182450-4fuHiAp2A8.png?width=1200)
Midiファイルをコンテンツブラウザにドラッグ&ドロップします。
![](https://assets.st-note.com/img/1640665294437-Q2fHiIamPM.png?width=1200)
MIDIファイルがUE5のアセットとして追加することが出来るようになりました。
![](https://assets.st-note.com/img/1640665329394-aS5sLrvFa3.png)
MIDI Noteと音の大きさを変更できるMetaSoundを作成する
MetaSoundの作成に関して分からない方は、MetaSoundの作り方をまとめたマガジンがあります。こちらを参考にしてください。
MetaSoundプラグインを有効にして、MetaSound「MT_Neko」を作成します
![](https://assets.st-note.com/img/1640688540856-GwyOFu3Nni.png?width=1200)
MIDI NoteとGain(音の大きさ)を変更できるMetaSoundを作成します。
![](https://assets.st-note.com/img/1640670776266-ehPpsp3yjp.png?width=1200)
MIDIファイルをMetaSoundで再生するブループリントを作成する
MIDIファイルを再生する処理を実装する
Actorを親とするブループリント[BP_PlayMIDI]を作成します。
![](https://assets.st-note.com/img/1640667322620-tTfhqYazsa.png?width=1200)
コンポーネントに[MIDI Processor Component]を追加します。
![](https://assets.st-note.com/img/1640683687691-BICb5WYKtn.png)
MidiファイルのStartとStopイベントをバインドする処理を追加します。
![](https://assets.st-note.com/img/1640683833519-HMB9Qr8gH4.png?width=1200)
Midiファイルのノートが処理された時に実行されるイベントをバインドする処理を実装します。
イベントをバインドした際に取得できるEvent情報を分解して、各ピンがどんな情報を出力するのかPrintStringで出力するようにします。
![](https://assets.st-note.com/img/1640684006784-7yYiJUfqAD.png?width=1200)
Midiファイルを読み込んで再生する処理を実装します。
Midi Assetにはプロジェクトに追加したMidiファイルを設定します。
![](https://assets.st-note.com/img/1640684257948-kNrA3UjiTS.png?width=1200)
Midiファイルを扱うための処理の全体図になります。
![](https://assets.st-note.com/img/1640684202703-WtY80qOTOx.png?width=1200)
ブループリントをビューポートに追加して、Playボタンをクリックします。
![](https://assets.st-note.com/img/1640684381365-E99igCa1OC.png?width=1200)
PrintStringの出力結果を元に、MidiEventの各ピンが何を出力するのか確認します。
Type:Note Off, Note On
Channel:1, 2
Data1:MIDI Note No
Data2:Volume(0~100)
![](https://assets.st-note.com/img/1640684576943-XbJXcAYzCp.png?width=1200)
MetaSoundのMIDI NoteとGain(音の大きさ)を変更する処理を実装する
MIDIファイルが2チャンネル持っているので、チャンネルごとに再生するようにMetaSoundをコンポーネントに2つ追加します。
![](https://assets.st-note.com/img/1640684723622-u4geGH1f5U.png?width=1200)
名前をChannelが分かるような名前に変更します。
![](https://assets.st-note.com/img/1640684886141-rlzkcLitKk.png)
まずはChannel1を再生する処理を実装します。
Gainは[0.0~1.0]に対して、Data2は[0~100]なので、Data2を100で割った数をGainに設定します。
![](https://assets.st-note.com/img/1640685339622-4ukrPQu7vk.png?width=1200)
MIDIファイルのStart,StopでMetaSoundをPlay,Stopする処理を実装します。
![](https://assets.st-note.com/img/1640685472367-lt3MOEpsMI.png?width=1200)
この状態で[Play]をクリックすると1chのみ再生されます。
2chを再生する処理実装する前に、1chのMIDI Event処理を関数化します。
![](https://assets.st-note.com/img/1640685706254-rbXwn5G8Vt.png?width=1200)
関数名とInputのパラメータを分かりやすい名前に変更します。
![](https://assets.st-note.com/img/1640685898517-T7kXvyMd1L.png?width=1200)
MIDI Eventの処理を関数化することが出来ました。
![](https://assets.st-note.com/img/1640685922665-uofePbA1HV.png?width=1200)
2chのMetaSoundを再生するように実装します。
関数化したことによって処理がシンプルになりました。
![](https://assets.st-note.com/img/1640685967317-hLiuX1XTPE.png?width=1200)
2ch用のMetaSoundもPlay,Stopするように実装します。
![](https://assets.st-note.com/img/1640685691932-Skbp3zNxz7.png?width=1200)
この状態でPlayをクリックするとMIDIファイルをMetaSoundで演奏することが出来るようになりました。
UE5 EAでMIDIファイルをMetaSoundで再生させるサンプル
— ポジTA (@posita33) December 28, 2021
Pluginの勉強をしたことでMidi-UnrealをUE5 EAで使用できることが出来ました
MIDIファイル扱えればUE5でDTMが出来るのでグッと幅が広がります #UE5 #UE5Study #MetaSoundshttps://t.co/c5SktV2eVb pic.twitter.com/sZZDJ1i7SI
まとめ
プラグインの作り方の学習をしたおかげでエラーも自分で直すことが出来るようになりました。UE4とUE5でC++側の大きい変更がないのが分かったのが大きかったです。
少し遠回りをしてしまいましたが、その分自分自身拡張することが出来たので出来ることが増えました。
まだ他人のプラグインを借りている状態なので、少しずつ基礎的な内容で強化して自作のプラグインを作成できるようにしていきます。
この記事が気に入ったらサポートをしてみませんか?