5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Unreal Engine (UE)Advent Calendar 2021

Day 4

[UE4] MIDIシーケンスをSequencerにトレースする

Last updated at Posted at 2021-12-03

前段

UE4は Sequencer(以下、シーケンサー)が素敵です。

リアルタイムと非リアルタイム

UE4のシーケンサーは、

  • リアルタイム(ランタイム)でインタラクティブ要素と混在しながらライブ映像を出力する目的
  • 非リアルタイム(オフライン)で高品質なレンダリングをする目的

の2つの異なる目的を達成できるようになっており、ときにはその良いところを両立することができます。また Blueprint の関数を連続・非連続で呼びだすことができるために本質的な拡張性が高いです。

バーチャルプロダクションなどの領域で仕事をさせていただくときに、ハイクオリティなレンダリングはしたいけれど、リアルタイムにフィジカルコントローラーでライブ制御したり演者の音や映像を高解像度で取り込みたいといったトレードオフとなるようなニーズが混在しています。

UE4では、これに答えるかたちで

  • 撮影段階ではリアルタイム入力・出力して確認をクイックに行いつつ、
  • 撮影素材を持ち帰って品質を高めて(解像度をあげたり、RayTracingを使ったりして)オフラインレンダリングをする

というようなワークフローを一つのプロジェクトで完結できるようになっています。

とはいえ、扱われるデータは高解像度な映像に加えて、センサーやトラッカー、フィジカルコントローラーなどのリアルタイム情報が多くあり、これらも同時にレコーディングして、シーケンサーにマッピングしてあげる必要があります。今回はこのあたりの具体例がテーマです。

やること

本記事でやることは、

DAWのMIDI再生によってアクターを制御し、かつシーケンサーで再現可能にする

です。DMX、OSC、LiveLinkなど別のIOにも横展開する念頭で今回は、外部ソフト上でのMIDIトラック連携を扱います。

1. MIDI送受信の環境をつくる

ローカル内のDAWソフトのMIDIアウトをUnrealEngineにルーティングするために、MIDIの仮想デバイスを用意する必要があります。macOSではデフォルトでルーティングができるのに対し、WindowsではLoopMIDIなどをインストールして起動する必要があります。

今回はAbletonLiveを再生環境としました。MIDI InstrumentのトラックにExternal Instrumentを設定し、MIDIの送信対象にLoopMIDIを設定しました。

image.png

次にUnrealEngineのMIDI受け口としては、ブループリントをかきます。まずMIDI Device Supportプラグインを有効化します。

image.png

MIDIデバイスを見つけて監視するブループリントをレベルなどに記述します。

image.png

MIDIのアタックの際にノート番号に応じて処理をかいてあげるとランタイムで動くようになります。BP_MidiHandlerというアクターがパーティクルやライティングの制御をラップしています。

image.png

2つの音を使って、片方でライティング制御、もう片方でパーティクルスポーンを割り当ててみました。

Animation_5.gif

2. MIDIで任意のアクターのパラメータを動かし、レックする

ランタイムやエディター上のアニメーションをシーケンスとしてレコーティングしたい場合、テイクレコーダーという便利な機能があります。代表的なアクターのパラメータ制御情報やLiveLinkの情報をシーケンサーで使えるテイクとしてレコーディングするものです。

しかし残念ながら、テイクレコーダーはすべてのコンポーネントのすべての挙動をレコーディングすることができず、代表的なコンポーネントの値しかレコーディングすることができません。StaticMeshのVisibilitiyやTransformはレックできても、自前のブループリントアクターの変数や関数コールをレックできるわけではありません。

今回は、MIDIによって

  • Materialのパラメータ
  • LightのIntensity
  • Niagara Systemのスポーン

を制御したいのですが、LightのIntensity以外はテイクレコーダーの対応がありません。コードを読み解いて改造することも手ですが、実際のスコープに対して現実的ではないので、ワークアラウンドがないかを検討しました。

MIDIをつかって目的の動作を達成するために、ここでは任意のアクターのパラメータ操作をレックして、それをあとからコピペして別のシーケンサートラックに持ってくる、というワークアラウンドを思いつきました。

例えば、2つのMIDIノートのアタックをとりたい場合、2つの任意のアクターを用意します。ここではキューブのStaticMeshを用意しました。

image.png

先程の用意したBlueprintのNoteOnのイベント監視で、この2つのStaticMeshをアタック毎に可視性をトグルします。これをランタイムでレコーディングします。

image.png

テイクレコーダーでのレコーディングの手順は以下です。

  • Windowメニューから Cinematics > Take Recorder を選択してパネルを表示
  • 先程のキューブをレコーディング対象に追加(+ SourceからLevel内のアクターを選択)
  • ランタイムに入ったのち、レックボタンを押す

Animation_2.gif

ただ四角がピコピコするだけの絵ができただけですが、録画したシーケンサーを見てあげると、Visibilityのレーンが入っていることが確認できます。

3. レックしたアタックをEventトリガーに使う

image.png

ここが今回の一番の重要なポイントなのです。できたVisibility変化はEventレーンにコピペができます。つまり、MIDIのアタックをレックして、シーケンサー上のトリガーEventを置くことができるわけです。

Animation_3.gif

バインドする関数をそれぞれのキーフレームに登録しないといけないところがめんどくさいですが、それぞれ登録せず(個数増えたら辛いので)、うまくコピペしてあげます。一つのキーフレームに関数をバインドし、もとのキーフレームの同一タイミングにグリッドする形でペーストしてあげます。

Animation_4.gif

これで任意の関数を使えるようになりました。勝利です✌
イベントレーンはブループリント含む任意なアクターの関数やイベントに対して有効になります。ランタイムで使っていたBP_MidiHandlerの関数をそのままシーケンサー上でバインドします。

利用シーン: Neonify by Sertac TASDEMIR

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?