ガチ勢の皆様へ
少し長くなるかもなので先に結論から
はじめに
ステージ開始時にBGMのイントロ部分を再生し、その後はループ部分を流す『イントロ付きループ』はゲームでよく見ます(聞きます?)。…が、UE4の標準機能で実装すると様々な工夫・妥協をする必要がありました。
- 【UE4】イントロ付きループBGMを実装する方法 - SAT04 CREATIVE SPACE
- UE4 サウンドキュー作成例 - Qiita
- 【UE4】UE4でイントロ・アウトロ付きBGMループを実装する - 大福未来研究所
詳細は上記の記事を見ていただくとして…問題を簡単にまとめると以下の通りです。
- 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
従来の方法はGame Threadに依存しているため、上図のようなズレが生じたりフェード処理で誤魔化す必要がありました。
TimeSynth機能はこの問題を解決するため、Game Threadには依存しない上により細かい間隔でサウンドを管理します。具体的には 小節・拍単位での管理 を可能にします。その結果、イントロ付きループやインタラクティブミュージックなどの従来の仕組みでは難しかった表現を可能にしています。(注:簡単にとは言ってない。特にインタラクティブミュージックに関して)
※ インタラクティブミュージックについて非常に参考になる記事
導入手順・詳細に関しては以下の記事をご確認ください。
また、Epic本社のライブストリームが非常に参考になります。動画・スライドに加えて、なんとイントロループデモ付きのサンプルプロジェクトも!
- Unreal Engine Livestream - TimeSynth in Blueprints - April 25 - Live from HQ - Unreal Engine Forums
- サンプルプロジェクトで見るべきポイント
- DoriansRun_Intro_Lo
- DoriansRun_Intro_Hi
- DoriansRun_MainLoop_Lo
- DoriansRun_MainLoop_Hi
- CompletedDoriansRunActor の StartMusic, OnBarEvent
- サンプルプロジェクトで見るべきポイント
で、上記の情報を見た人間が「やってみよう->できた!」のでその流れを書こうと思ったのが本記事です。なので、以降は少なくともヒストリア様の記事を見た前提で書いていきます。また、私はサウンドに関してもド素人なので、「使用する素材は公開されているものをお借りする」「ソフトはプロ向けではないフリーのものを使用する」というゆるふわな内容になっています。ご理解くださいましまし
今回お借りした素材はこちらです。「ループのみ」と「イントロ+ループ+フェードアウト」の2種類が公開されています。
フリーBGM素材「弾丸」試聴ページ|フリーBGM DOVA-SYNDROME
使用するBGMのBPM、イントロ・ループの切り替わりタイミングを確認する
まずはTimeSynthClipを設定するために、使用するサウンドのBPM、切り替わりタイミング(小節・拍数)を知る必要があります。
BPMに関しては『BPM Analyzer』というソフトが簡単でした!D&Dで放り込むだけでBPMをすぐ計測してくれます!便利!
【徹底解説】BPM(テンポ)を自動で測定する「BPM Analyzer 」が超オススメ!曲のテンポを調べるには計測ツール(無料ソフト)で便利です! | のり部屋
小節・拍数に関しては、『Audacity』のリズムトラックという機能を使いました(もっといいやり方がある気がする…
【Audacity】メトロノーム音を追加する方法
こんな感じで小節・拍を可視化してくれるので、イントロ・ループ部分の小節・拍数を手動で数えます(もっといいやり方がある気がする…
TimeSynthClipの設定
『BPM Analyzer』と『Audacity』を使って分かった情報は以下の通り。これらの情報をTimeSynthClipに反映していきます。
- BPM:110
- イントロ部分:8小節
- ループ部分:25小節
今回お借りした素材はキレイに小節で区切られたいたので設定もシンプルです。
再生用BPの実装
BPMの設定、1小節毎のイベント発行、TimeSynth開始、イントロ用TimeSynthClipの再生を行っています。ここで注意すべきことは、PlayClipノードを実行したタイミングでサウンドが再生されるわけではないことです。TimeSynthClipのClipQuantizationで設定した値を元に再生を開始するので、1Barに設定されている場合は最大1小節分待った後に再生されます(で、ですよね…?少し自信ない)。
1小節毎に発行されるイベントの処理です。イントロまたはループ部分の再生が完了したタイミングでループ部分を再生する必要があるため、このような実装になっています。なお、Num Barsの初期値は0です。
これで準備完了です!再生開始すると初めに紹介した動画のようにイントロ付きループが再生されます!やったね!