見出し画像

UE5 MidiファイルでMetaSoundを演奏させる(Unreal-Midiプラグイン)

【今回のポジティブワード】
四角い枠にこだわるな
キャンバスからはみ出せ
~岡本太郎~

遂にやりたかったMIDIファイル+MetaSoundを実現することが出来ました。
プラグイン開発について学習したことで少し遠回りになってしまいましたが、目的を達成するためには必要なことでした。
無い機能を拡張できるプラグイン開発はキャンバスからはみ出せるので面白いですね。

初めに今回実装する内容について

MetaSoundはMIDI Note Noで音を再生することが出来ます。

MetaSoundはMIDI Noteを指定して音を再生することが出来る

MIDIファイルをUE5で扱うことが出来れば、MIDIファイルを使って音楽を再生できます。

MIDIファイルはMIDI Note Noの演奏データ

Unreal EngineでMIDIファイルを扱うことが出来るプラグイン「Midi-Unreal」がGithubに公開されているので、UE5 EAで使用出来るようにします。

Midi-UnrealをUE5 EAで使用できるようにする

UE5 EAでC++のBlankプロジェクトを作成します。

UE5 EAでC++のBlankプロジェクトを作成する

Midi-UnrealをZipファイルでダウンロードします。

Midi-UnrealをZipファイルでダウンロードする

ダウンロードしたMidi-UnrealのZipファイルを展開します。

ダウンロードしたMidi-UnrealのZipファイルを展開する

プロジェクトフォルダに「Plugins」を作成して、Midi-UnrealのZipファイルを展開したフォルダ内の「MidiAsset」フォルダをコピーします。

「MidiAsset」フォルダを「Plugins」フォルダにコピーする

UE5のプロジェクトを閉じます。

プロジェクトを閉じる

uprojectファイルを右クリックし、[Generate Visual Studio project files]を実行します。

uprojectファイルを右クリック > [Generate Visual Studio project files]

[5.0]を選択して、[OK]をクリックします。

[5.0]を選択 > [OK]をクリック

エラー内容が表示されます。
UE5がWin32に対応していないので、Build.csがエラーになっています。

エラーが表示(UE5はWin32に対応していない)

エラーになっているBuild.csのWin32を判定している処理を削除します。

MidiInterface.Build.cs

	// 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");
	}

ProceduralAudio.Build.cs

	// 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]を実行します。

再び[Generate Visual Studio project files]を実行

今度はGenerateに成功したので、プロジェクトを再度開きます。
プラグインを再ビルドするようにダイアログが表示されるので[OK]をクリックします。

プロジェクトを開くと、プラグインを再ビルドする

プロジェクトが開かれると、MidiAssetがプラグインフォルダに追加されています。

MidiAssetがプラグインフォルダに追加される

Midiファイルをコンテンツブラウザにドラッグ&ドロップします。

Midiファイルをコンテンツブラウザにドラッグ&ドロップ

MIDIファイルがUE5のアセットとして追加することが出来るようになりました。

UE5でMIDIファイルが追加できるようになった

MIDI Noteと音の大きさを変更できるMetaSoundを作成する

MetaSoundの作成に関して分からない方は、MetaSoundの作り方をまとめたマガジンがあります。こちらを参考にしてください。

MetaSoundプラグインを有効にして、MetaSound「MT_Neko」を作成します

コンテンツブラウザを右クリック > Sounds > MetaSound > MT_Neko

MIDI NoteとGain(音の大きさ)を変更できるMetaSoundを作成します。

MIDI NoteとGain(音の大きさ)を変更できるMetaSoundを作成

MIDIファイルをMetaSoundで再生するブループリントを作成する

MIDIファイルを再生する処理を実装する

Actorを親とするブループリント[BP_PlayMIDI]を作成します。

コンテンツブラウザを右クリック > Blueprint Class > Actor > BP_PlayMIDI

コンポーネントに[MIDI Processor Component]を追加します。

コンポーネント ADD > MIDI Processor Component

MidiファイルのStartとStopイベントをバインドする処理を追加します。

MidiファイルのStartとStopイベントをバインドする処理を追加

Midiファイルのノートが処理された時に実行されるイベントをバインドする処理を実装します。
イベントをバインドした際に取得できるEvent情報を分解して、各ピンがどんな情報を出力するのかPrintStringで出力するようにします。

Midiファイルのノートが処理された時に実行されるイベントをバインドする処理を実装

Midiファイルを読み込んで再生する処理を実装します。
Midi Assetにはプロジェクトに追加したMidiファイルを設定します。

Midiファイルを読み込んで再生する処理を実装

Midiファイルを扱うための処理の全体図になります。

Midiファイルを扱うための処理の全体図

ブループリントをビューポートに追加して、Playボタンをクリックします。

ブループリントをビューポートに追加 > Playボタンをクリック

PrintStringの出力結果を元に、MidiEventの各ピンが何を出力するのか確認します。
Type:Note Off, Note On
Channel:1, 2
Data1:MIDI Note No
Data2:Volume(0~100)

PrintStringの出力結果を元に、MidiEventの各ピンが何を出力するのか確認する

MetaSoundのMIDI NoteとGain(音の大きさ)を変更する処理を実装する

MIDIファイルが2チャンネル持っているので、チャンネルごとに再生するようにMetaSoundをコンポーネントに2つ追加します。

チャンネルごとに再生するようにMetaSoundをコンポーネントに2つ追加する

名前をChannelが分かるような名前に変更します。

名前をChannelが分かるような名前に変更する

まずはChannel1を再生する処理を実装します。
Gainは[0.0~1.0]に対して、Data2は[0~100]なので、Data2を100で割った数をGainに設定します。

Channel1を再生する処理

MIDIファイルのStart,StopでMetaSoundをPlay,Stopする処理を実装します。

MIDIファイルのStart,StopでMetaSoundをPlay,Stopする処理

この状態で[Play]をクリックすると1chのみ再生されます。
2chを再生する処理実装する前に、1chのMIDI Event処理を関数化します。

1chのMIDI Event処理を関数化する

関数名とInputのパラメータを分かりやすい名前に変更します。

関数名とInputのパラメータを分かりやすい名前に変更する

MIDI Eventの処理を関数化することが出来ました。

MIDI Eventの処理を関数化

2chのMetaSoundを再生するように実装します。
関数化したことによって処理がシンプルになりました。

2chのMetaSoundを再生するように実装する

2ch用のMetaSoundもPlay,Stopするように実装します。

2ch用のMetaSoundもPlay,Stopするように実装する

この状態でPlayをクリックするとMIDIファイルをMetaSoundで演奏することが出来るようになりました。

まとめ

プラグインの作り方の学習をしたおかげでエラーも自分で直すことが出来るようになりました。UE4とUE5でC++側の大きい変更がないのが分かったのが大きかったです。
少し遠回りをしてしまいましたが、その分自分自身拡張することが出来たので出来ることが増えました。
まだ他人のプラグインを借りている状態なので、少しずつ基礎的な内容で強化して自作のプラグインを作成できるようにしていきます。

この記事が気に入ったらサポートをしてみませんか?