ぼっちプログラマのメモ

UE4とかVRとかについて書いたり書かなかったり。

UE4標準のTimeSynth機能を使ってイントロ付きループを実装してみた

ガチ勢の皆様へ

少し長くなるかもなので先に結論から

  • ループマーカー対応の話ではありません。イントロ用・ループ用のサウンドアセットを個別に用意する必要があります
    • ゴメンナサイ
  • BPMと小節・伯単位による管理が可能になったという話です
  • アセット側で再生する小節・拍数などの設定ができますが、BPを使った実装も『少し』必要です
  • UE4.24現在でもベータ機能です
  • 処理負荷が増えるのでご注意ください
  • ○DXか○MODか○wise使えばいいじゃん…という言葉は聞こえません。…聞こえないって言ってるだろ!!!

はじめに

ステージ開始時にBGMのイントロ部分を再生し、その後はループ部分を流す『イントロ付きループ』はゲームでよく見ます(聞きます?)。…が、UE4の標準機能で実装すると様々な工夫・妥協をする必要がありました。

詳細は上記の記事を見ていただくとして…問題を簡単にまとめると以下の通りです。

  • BP, SoundCueにおけるDelayノードでは精度が足りず、イントロとループは自然にならない・安定しない
    • シームレスな音楽の連続再生を実現するにはサンプリングレートでのタイミング精度が求められる
      • 原理的に48kHzの音声ファイルなら、1秒間に48000フレーム
    • Fade In/Outによるクロスフェードでごまかす手もあるが使えないケースがある上に実装コストが少し高い

UE4初期からこの問題を抱えており、個人的にもずっとモヤモヤしていたのですが…
UE4.22で入ったTimeSynth機能を使うことで
高精度かつ(比較的)簡単にイントロループを実現可能になりました!

www.youtube.com
ということで実装してみました。素人耳ですが…たぶんいい感じかと思います!!!(音飛びは録画の問題
以降は↑の作業手順について自分用メモも兼ねて書いていきます。

TimeSynthについて

TimeSynth (ベータ)
TimeSynth は、サウンド デザイナーへ音声クリップのサンプルベースの正確な開始、停止、連結を提供することに重点を置いた、新しいオーディオ コンポーネントです。TimeSynth で、インタラクティブな音楽アプリケーションに不可欠な、正確で同期的なイベント オーディオとイベント キューが可能になります。
https://www.unrealengine.com/ja/blog/unreal-engine-4-22-released

f:id:pafuhana1213:20191228145414p:plain
f:id:pafuhana1213:20191228145439p:plain
従来の方法はGame Threadに依存しているため、上図のようなズレが生じたりフェード処理で誤魔化す必要がありました。

f:id:pafuhana1213:20191228145650p:plain
TimeSynth機能はこの問題を解決するため、Game Threadには依存しない上により細かい間隔でサウンドを管理します。具体的には 小節・拍単位での管理 を可能にします。その結果、イントロ付きループやインタラクティブミュージックなどの従来の仕組みでは難しかった表現を可能にしています。(注:簡単にとは言ってない。特にインタラクティブミュージックに関して)

インタラクティブミュージックについて非常に参考になる記事


導入手順・詳細に関しては以下の記事をご確認ください。

また、Epic本社のライブストリームが非常に参考になります。動画・スライドに加えて、なんとイントロループデモ付きのサンプルプロジェクトも!

で、上記の情報を見た人間が「やってみよう->できた!」のでその流れを書こうと思ったのが本記事です。なので、以降は少なくともヒストリア様の記事を見た前提で書いていきます。また、私はサウンドに関してもド素人なので、「使用する素材は公開されているものをお借りする」「ソフトはプロ向けではないフリーのものを使用する」というゆるふわな内容になっています。ご理解くださいましまし

今回お借りした素材はこちらです。「ループのみ」と「イントロ+ループ+フェードアウト」の2種類が公開されています。
フリーBGM素材「弾丸」試聴ページ|フリーBGM DOVA-SYNDROME

使用するBGMのBPM、イントロ・ループの切り替わりタイミングを確認する

まずはTimeSynthClipを設定するために、使用するサウンドBPM、切り替わりタイミング(小節・拍数)を知る必要があります。

BPMに関しては『BPM Analyzer』というソフトが簡単でした!D&Dで放り込むだけでBPMをすぐ計測してくれます!便利!
【徹底解説】BPM(テンポ)を自動で測定する「BPM Analyzer 」が超オススメ!曲のテンポを調べるには計測ツール(無料ソフト)で便利です! | のり部屋

小節・拍数に関しては、『Audacity』のリズムトラックという機能を使いました(もっといいやり方がある気がする…
【Audacity】メトロノーム音を追加する方法

f:id:pafuhana1213:20191228154224g:plain
f:id:pafuhana1213:20191228155656p:plain
こんな感じで小節・拍を可視化してくれるので、イントロ・ループ部分の小節・拍数を手動で数えます(もっといいやり方がある気がする…

TimeSynthClipの設定

BPM Analyzer』と『Audacity』を使って分かった情報は以下の通り。これらの情報をTimeSynthClipに反映していきます。

  • BPM:110
  • イントロ部分:8小節
  • ループ部分:25小節

f:id:pafuhana1213:20191228160554p:plain
今回お借りした素材はキレイに小節で区切られたいたので設定もシンプルです。

再生用BPの実装

f:id:pafuhana1213:20191228161010p:plain
BPMの設定、1小節毎のイベント発行、TimeSynth開始、イントロ用TimeSynthClipの再生を行っています。ここで注意すべきことは、PlayClipノードを実行したタイミングでサウンドが再生されるわけではないことです。TimeSynthClipのClipQuantizationで設定した値を元に再生を開始するので、1Barに設定されている場合は最大1小節分待った後に再生されます(で、ですよね…?少し自信ない)。

f:id:pafuhana1213:20191228161847p:plain
1小節毎に発行されるイベントの処理です。イントロまたはループ部分の再生が完了したタイミングでループ部分を再生する必要があるため、このような実装になっています。なお、Num Barsの初期値は0です。

これで準備完了です!再生開始すると初めに紹介した動画のようにイントロ付きループが再生されます!やったね!

最後に

今回はTimeSynth機能を使ってイントロ付きループを実装してみました。これまでのDelayやFade処理が頑張ってた頃に比べると大分楽になったかと思います!

TimeSynthはイントロ付きループだけでなくこの他にも様々な表現が可能です。ヒストリア様の記事にあるようにサウンドに合わせた演出を入れてみたり、Epic本社のライブストリームのように異なるサウンドをいい感じに切り替えたり…。是非色々試してみてください!

おしまい