Unreal Engineでイントロ付きループ曲を扱うあれこれーサウンドデザイナー向けー
今ではありとあらゆる場面で聞くことが出来るイントロ付きループ曲をUnreal Engineで実装するために様々な試行錯誤をした、してるので、ここに自分用の為も含めた上まとめる。
初めに
サウンドデザイナーとしての一つの理想はwavが読み込まれ、LoopEndのsample数まで来たらLoopStartのサンプル数まで戻ってループしてくれると大変うれしいのだけれどUE上ではそれはただの幻想郷にすぎない。
この理想が出来るのか否か自分が試したのは以下の三つのブループリント(モジュール?ノード?)
- Cue
- Time Synth
- Quartz
Cue
まずCueでイントロ付きループ曲を作成した場合簡単にこうなる。
これはIntroファイルが終わるとConcatenatorが自動でLoopファイルを読みこんでくれる。
大変シンプルでUE初心者の私でも簡単に構築できるが、問題点もある。
単純にIntroからLoopに移る際、空白が出来てしまうのだ。
原因は以下のブログが示す通りゲームスレッド依存によって人間が感知可能なレベルで空白期間が出来てしまうのが問題点。
note.com
上記ブログにもあるようこれを何とかしようと先達の方々があれやこれやしていた痕跡がフォーラム等で見られるが、素晴らしくも恐ろしくもあるのでここでの紹介は割愛する。
Time Synth
さて次に試したのはTime Synth。
何とこれを用いるとゲームとは別に独自のクロックを持つスレッドによってオーディオを任意の再生タイミングで鳴らせるすごいプラグインだ。
有効化並び簡単な使い方は以下のブログにて教えてくださっている。
historia.co.jp
こちらの方も動画を添えた上解説してくださっている。感謝。
pafuhana1213.hatenablog.com
確かにBPMが定まっている曲の場合これでかなり本格的なイントロループができる。
しかしBPMが定まっている曲というのはそれはそれで珍しい存在で、人間味あふれる曲だといとも簡単に拍のズレが生じてしまう。
一応幾つかの可能性は試した。
- BPMをサンプリングレートと同じクロックになるよう値をぶち込み、サンプル数換算で制御できるようにする。
→BPMを256万6000に設定しプレイボタンを押した瞬間UEが落ちた。彼には速すぎたようだ
- On Playback Timeを用いてintro曲終了直後に流すようにしてみる。
→Cueで生じたような空白は無いもののノイズが生じてしまう
Synth Playback TIme SecondsはFloatなのでサンプル数より細かく受け取れるはずなのだが、Nearly Equalを用いて動作を見るに1/100秒しか判断できないらしい。
ちなみに整数で等しくなった際のみにしても同じようなノイズが生じるので意味がない。
ではなぜUnrealEngine公式のLiveDemoでは奇麗なループになっているのか。
youtu.be
これはオーディオファイルレベルでインタラクティブミュージックをデザインする事を前提とした状態になっているからである。
このようにこの記事最初の理想郷とはかけ離れた方式で作られており、
BPMさえそろっていれば重なっていても問題ように作られている為だ。
その為、曲頭と終わりの波形がノイズを生み出さない形に納まっているので上記Live Demoではシームレスなループが完成している。
そして次に試したQuartzを触ってみた限りUnreal Engineは理想郷は理想郷のままサンプル数ではループさせない強い意志が垣間見える。
Quartz
4.26で追加されたこの機能はTime Synthと似たアプローチだが、より使いやすくなっておりインタラクティブミュージックもTime Synthと同じく可能だ。
公式ドキュメントはこちら。
docs.unrealengine.com
こちらを使用した日本語記事はなく、UE初心者であるにもかかわらず手探りの状態で始めたので間違っている箇所があれば指摘してほしい。
最初に書いたようにTime Synthと似たようなアプローチをしておりQuartzという独自のクロックを用意しその中でオーディオの再生位置が決められる
Time Synthと同じようにBPMを指定し小節または拍毎にカスタムイベントを発行しそれらを用いてインタラクティブなサウンドを持つゲームが作れるようになっている。
TimeSynthと大きな違いはサウンドに既存のノードを使用することができ、TimeSynthのようにPlayClipで鳴らす必要はない。
その代わり、既存のサウンドノードの後にPlay Quantizedノードに繋げ、来たサウンドをQuartzが持つクロックのタイミングで再生する形だ。
この為Time Synth Clipでわざわざクリップ自体のデータを作る必要が無くなっており、解りやすくなっている。
そして何よりも時間の指定方法が豊富であることがQuartzの強みではないだろうか。
公式ドキュメントにもあるように以下の指定方法が存在する
- Beats per Minute
- Milliseconds per Tick
- Ticks per Second
- Seconds Per Tick
- Thirty-second Notes per Minute
しかし何れの指定方法を用いてもサンプル単位で指定させる事は不可能だった
上のBPはこちらを参考に作成した。感謝感謝
chriszuko.com
まとめ
sample単位でのループ指定が不可能という事はTime Synthと同じようなアプローチで曲を作る必要があり、理想郷とは程遠い位置になる。
この為Loop EndからLoop Startに行く従来の方法が使いたい場合はCRIwareやWwise、FMODを用いるのがベストなのかもしれない。
あとはこの方のプラグインを使うとか…
github.com
以上のことからBPMが変動する曲をUnreal Engineで使おうとしているならば注意してほしい。
sample単位での指定は現状できない。
もし良い方法があればご教授いただければ幸いです。
良いミックスを作る方法~ミックスを始める前に~
良いミックスにしたいという願いはDAWで曲を作る人なら誰しも持っている欲だと思います。
しかし、実際にミックスを行っていると、これは曲が悪いのかそれともミックスが悪いのか解らなくなっていき、困り果てる人も多いのではないでしょうか。
さて、良いミックスを作っていきたいと思いますが、そもそも「良いミックス」とは何かをまず定義付ける必要があります。
こうすると様々な主張が飛び交うことが予想されますが、誰しもが目指すものは「良い音楽に聴こえるミックス」になるかと考えます。
さて!!「良い音楽に聴こえるミックス」とは何でしょうか。これは先ほどとは比べ物にならないほどの沢山の意見が出るはずなので少々怖い部分があるのですが、如何なるジャンルであろうとも「良い音楽に聴こえるミックス」はある意味「奇麗な音楽(またはミックス)」ではないでしょうか。私はそう考えています。
音楽表現上「汚い物」であってもそれは「奇麗」に整えられたものであることが常なので恐らく殆どの場合に当てはまる答えの一つだと思います。
さらに深く掘り下げる
では奇麗な音楽(ミックス)を作るにはどうすればよいでしょうか。
奇麗を定義付ける必要性を感じますよね!
しかしここから難しくなり、この楽器のEQはこんな感じ~、ディレイはこうで、コンプはこう。あの楽器はここに配置して~等、途端にごちゃごちゃしだします。
書店で売ってるミックス関係の本もその傾向が強いですね。
これらは特に間違いではないのですが、木を見て森を見ずという状況に大変陥りやすい罠だと思います。
方法なんて何でもいいんですよ、奇麗になればおっけーです!
書店にある本やネットの小言は偶々その場では良い解だったということです。
奇麗なミックスって?
んじゃ奇麗なミックスって何だよって話なのですが、これは身の回りにあふれてるご自身が好きな音楽(曲)が答えになります。
聴いていて心地よいな、良い感じに聞こえるなと思える作品があればそれはもうご自身専用の「奇麗なミックス」の手本です。
後は如何にしてお手本に近づいていくかという段階に入りますが、ここでお手本の真似をする為に書籍に乗っているような所謂小技を使っていきます。
しかし、小技は所詮小技にすぎません。自分の曲と反している方法ならばそれはただの毒です…
結局どうすれば?
ではどうすればよいかという話になってきますが、まずお手本の曲を解析する所から始めます。
解析となるとアナライザープラグイン並びに類似の機能があるソフトウェアが必要になってきますが、とにかくこの段階で必要なのは、音の定位と各周波数の大きさが解るものです。
解析1
まず単純に参考曲の波形を見ましょう。
この波形の図から読み取るものはダイナミクス(音量増減の変化量)とピーク時の音量です。
好きな曲がどのぐらい音量変化しているかの確認と最大でどこまで大きな音量が成っているのかを知るのは重要な情報となります。
そしてこれらは数値化して見れるので簡単に真似することが出来ますね。それ以上大きく(小さく)しないようにすればいいわけですから。
この時、ピーク時の音量について気を付けます。
ネット上から拾った音源やyoutubeなどで再生されている曲たちは総じてサイト側のノーマライズ処理がかけられている為本来の音量と異なることがあります。
もちろん、それを踏まえてのミックスが欲しい、また好きな場合は問題ありません。
奇麗なミックスがなされてる曲はこの時点で美しい波形を持っています。
解析2
次は参考曲の音が鳴っている定位です。
音の定位と言えばどの楽器がどこで鳴っているかという点に着目しがちですが、ここでは参考曲がどの程度まで定位を広く使ってているか。という所を見ます。
もしかしたら想像以上に広くとっていたり、はたまた狭くとっているかもしれません。
全体としてどの程度広く使っているか確認が出来たら、次にどの音域(周波数帯)がどのような位置で鳴っているか確認できるとより良いですね!
解析3
最後にスペクトルアナライザによる各周波数帯域の音の大きさ(強さ)です。
これは上記に書いた解析結果よりも慎重に見ていく必要があります。
スペクトルアナライザは各社から様々なプラグイン、ソフトウェアが出ていますが、グラフィカルなものではなく解析としてのニーズに答えられるソフトが必要になります。
よくあるスペクトルアナライザが表示されたEQやコンプなどありますが、あれは解析用としては機能不足でありFFTを調整できるものを使用します。
※FFTというのは高速フーリエ変換という代物なのですが、ここでは周波数分解能として捉えていれば過不足なく問題ありません。
さてこれで何を見るかというと各周波数帯域の相対関係です。
例えばリッチで良い環境で聞かれる前提である映画音楽は顕著に解りやすく、低音域から高音域にかけて緩やかにカーブを描いています。
このカーブが非常に大事になってきます。0.5dbでも違えば別のミックスになるといっても過言じゃありません。
全体の状態を見た後は細かく無作為に1sample単位で見ていきます。
ピークを点で結ぶと奇麗なカーブを描いてますね!
こちらも似たような状況で同じような音域が成るシーンですが、高音域のカーブが弱く高い音が残っており上の有名曲と比べ、がなり立てたような状態になっていることが解ります。
また低、中音域でもバラツキのあるピークを持っていることが確認できます。
※16000Hz付近で突如崖が出来ているのはmp3の圧縮関係です。
このsample単位の解析は様々なところを見て特徴を掴んでください。
するとこの部分は飛び出しているor引っ込んでいるというのが解るようになり自身のミックスで崩れている部分が視覚的に把握できるようになります。
この比較は大変便利なプラグインが出ており、iZotopeのTonal Balance Controlを使えばわざわざ書き出さなくても簡単に比較することが出来ます。
解析3が慣れると他人のミックス感覚をコピーしやすくなります。
またより曲に合ったミックスにもしやすくなります。
ミックスのための下準備終了
以上で解析は終わりです。全体として自身の好みを知り何が手本と違うのかを見比べ修正していくわけですので大変地道な作業です。
しかし、大変便利なツールが世の中には溢れているので各解析のように活用していきたいですね!
こうして参考曲がどのような状態であるかを把握することによって次のステップへ進むことが出来ます。
何故この3つの解析をしないと次のステップに進めないかというと、環境依存によるバランスの違いから抜け出
す必要性がある為です。
例えば今ヘッドフォンを使い曲を作っている人はどうしてもそのヘッドフォンで良い感じに聞こえるバランスにしがちです。
ヘッドフォンというのは全ての音が満遍なくそれらしく聞こえる為あたかも全てのバランスが良い様に聞こえるので崩れたバランスになりやすい為です。
スピーカーの場合も価格帯や部屋によってバランスが変わるので実は崩れていても気づきにくい場合があります。
しかし上記解析はお手本を元にミックスを行う下準備なので環境依存の問題点を洗い出しやすく、どのような場所でも安定したバランスを生み出しやすくなります。
ここからはそれぞれのジャンルで違う技法を使ったり工夫を凝らしていくので専門書や誰かに聞くと良いかもしれません。
これらが少しでも参考になれば嬉しいです。
人によっては大変初歩的な内容ではあるかもしれませんが、あまり言及されたり書かれたりしない事柄なので書きました。
不明点などありましたらツイッターなりコメントなり書いてもらえれば反応すると思います。
バリチュー四重奏の楽譜&音源公開
お蔵入りになっていたバリチュー4重奏の楽譜が出てきたので公開します。
元々某所で演奏される予定だったのですが、他の私の曲になり以降使う機会に恵まれませんでした。
演奏レベルはそこそこ吹ける高校生から音大生ぐらいなら難なく吹ける程度にはなっておりますが、Tu1はF管想定で書かれている為音域が若干高めです。ご注意ください。
参考音源
Unity & Wwiseで足音を付ける Unity編
Wwise編で下準備が整いましたのでいよいよUnity側で音を付けていきます!
Unityで足音を付ける記事はすでに幾つかネット上にあります。
ですのでWwiseがかかわる部分のみ書いていきます。
上記Qiitaにも記載されていますが、Animation Eventを用いて音を鳴らしていくので、
ざっくりですがこの流れが発生します。
モーション中にイベントを発生させる方法は上記Qiitaに記載されておりますので、ここでは割愛させて頂きます。
最初にいきなりUnityのプロジェクトを立ち上げてもそれはWwiseと結びついていないのでUnityにWwiseをintegration(統合)する必要があります。
方法はこちらでも参考にしていただければ。
integrationができ、Audio Listenerの位置とAkBankの読み込みが出来れば以下へ。
イベントを受け取ってWwiseに渡す
アニメーション中に発生したイベントは誰に渡すか教える必要があり、サウンドデザイナーには難易度の高いC#を書く必要が出てきます。
とは言えこれを書けるようになってしまえばモーション中の音は何でも鳴らせるようになるので頑張りどころです。
今回必要なプログラムは以下です。
数行しかありませんが、これでモーション中のサウンドが再生されるようになります。
文字列の意味
各文字列の意味はこちらに詳しく記載されております。
雑に答えるとfootstep_soundという箱の中にfssoundというイベントが呼び出されるとfootstepsに割り当てられてるサウンドが再生されるという内容が含まれています。
ですので、逆にアニメーションの中でfssoundというイベントが発生しなければ音は再生されません。
これでアニメーションが再生されれば音が鳴る状態になりました。
マテリアルに合わせた音を鳴らしていく
さてここからはいよいよサウンドデザイナーなのにも関わらず3Dオブジェクトも触れていきますが、ステージを実際に作られる方にお任せしたほうが良いと思います。
考え方としては決められた空間の中に入るとSwitchが切り替わるという形です。
まず、シーンの中で3D Object>Cubeを選択し箱を出現させます。
ですが実際にゲーム内にで表示されてはいけませんので、Cubeを選択すると右のInspectorにコンポーネントが一覧で表示されますので、Mesh Rendererのチェックボックスをオフにします。
この状態ですと見た目は消えていますが、characterは移動すると箱の当たり判定によって阻まれますので、CubeのコンポーネントにあるBox ColliderにIs Triggerというチェックボックスがあるのでこれをオンにします。
これで、この箱がトリガーとしての役割を果たしてくれるようになります。
次にCubeにAdd ComponentからAk Switchを選択しこの箱にWwiseに対してのスイッチの役目を果たすよう命令することができるようになります。
今回はこのCubeにcharacterが入ると音が変わるという動作を行いたいので、Trigger On:をAkTriggerEnterにし、Cube以外の対象物が入った時点で変わるのでUse Other Objectにチェックを入れます。
そして、Name:に作成した鍵名を入れるとcharacterが箱に入った瞬間指定された足音が出てくるようになります。
あとは箱の形を地形に合わせて変更すれば見事地形に沿った足音が再生されるようになり、さらにランダムで再生され、同音連打を回避できるようになります。
なるべく丁寧に書いたつもりではありますが、自分に対してのメモという点もあり、ところどころ端折っていますので解らないことなどありましたら、コメント書いていただけますと幸いです。
Unity & Wwiseで足音を付ける Wwise編
3D空間において人物、または動物などの足音は対象物は動いていることを示す重要な要素で、世に出ている3Dゲームで足音が無い作品は無いと言い切っても過言ではない。
そんな大役を担っている足音を今回はWwiseを通して追加する方法を記載します。
Wwiseで足音を制御するメリット
大きく二つの要素を簡単に行うことができます。
- 足音のランダム化(同音連打を回避)
- 地面のマテリアル(素材)に沿った足音の再生
どちらもゲームへの没入感を高めるにあたって非常に重要な要素となっています。
勿論Wwiseを使用しなくてもできますが、Wwiseを使うことによってこれらの要素を簡単にサウンドデザイナー側が設定できるので、プログラマーさんのコストをかけずにプロジェクトが進められます。
Wwise側の準備
今回の足音は上二つのメリット推していきたいので2種類のコンテナを使っていきます。
まず一つ目はSwitch Container。
このコンテナはUnity側で指定された情報、今回だとマテリアル(地面の素材)を読み取りそれに応じたサウンドをならすためのコンテナです。
そして二つ目はRandom Container。
これはコンテナの中にある音源の中からランダムに選び再生するコンテナで、今回だと同音連打を回避するために使用します。
今回は効果音ですのでWwiseのProject ExplorerよりAudioタブにあるActor-Mixer Hierarchyの中にswitch Container、Random Containerの順でコンテナを追加していきます。(右クリックのメニューから追加できます)
ほぼ上記画像のような状態になりますが、Default Work Unitの下にWork Unit(プレイヤーキャラの階層)を作っておくとより便利です。
さて、オーディオファイルの追加です。
オーディオファイルの追加はとても簡単で、このAudioタブの中で作成したRandom Containerに直接ファイルをドラックアンドドロップします。
あとはダイアログの内右下にあるImportボタンを押下すれば取り込みしてくれます。
次に同じくProject ExplorerよりGame SyncsにてSwitch Containerの切り替えに必要な鍵を作っていきます。
SwitchフォルダのDefault Work Unitの中に新しくSwitch Groupを作成し更にその中に鍵となるSwitchを作成します。
※このSwitchは実際にUnity側で選択されるSwtichと同名になります。
次にAudioタブに戻り作成した足音Switchを選択します。
そしてSwitch Container Property Editorの中にあるGroupから先ほど作成したSwitchを選択します。
これで鍵とSwitch contatinerが結び付きました。
その下にあるDefault Switch/stateにてSwitchで何も選択されなかった際に再生される音を選択することができます。
そしてさらにその下のAssigned Objectにも作成したSwitchが追加されていることが解ります。
ここにProject ExplorerからRandom Containerを直接ドラックアンドドロップしてきます。
次に実際にUnityから呼び出されるイベントを作る必要があります。
Project ExplorerからEventsタブを選択しEventsフォルダのWork Unit内にゲームで呼び出すイベントを右クリックメニューから作成します。
そしてこのイベントがUnityで呼び出された時に音声をどうしたいかを指定するために、
Event Editor内で右クリックメニューよりPlayを選択します。
すると新しくイベントが追加されるので赤枠で囲まれてるTargetへProject ExplorerからAudioタブ内の作成したswitchをドラックアンドドロップします。
これでUnity上でFootstepイベントが呼び出された際地形に合わせた足音がランダムで再生されるようになります。
そして最後にキーF7のSoundBank(もしくはLayoutsメニューからSoundBank)を選択し、作成したイベントをSoundbank Editorの中にドラックアンドドロップ、適当なPlatformsとLanguagesを選択しGenerate Allを選択すると無事SoundBankが作成されWwise側での操作は終了となります。
お疲れさまでした!
次はUnityに移ります。
Vienna Ensemble Pro7でPhoenixVerbを使用した際にモノラルで出力されてしまうまとめ
iZotopeから出てるPhoenixVerbをViennna Ensemble Pro7のFXにinsertするとモノラルになってしまうバグがあります。(VSLには報告済み)
どうやら同じ症状がRX2でも起こるようでExponential Audioがかかわったプラグインは全て同様の症状が起こる可能性があるのかもしれません。
解決方法としてはPhoenixVerbをinsertする際にMono to Monoを選択してinsertすること。
単にプラグイン名を選択しただけではStereo to Stereoでinsertされてしまうので注意。
また、Stereo to StereoでinsertされているPhoenixVerbをあとからMono to Monoに変更してもステレオでは再生されずMono to Stereoで再生されるので刺し直しが必要です。
PhoenixVerbはiZotopeに買収され、知名度が上がったプラグインなので恐らくなるはやで修正されるとは思いますが、今後のアップデートに期待します。
以下再現した際のバージョン情報とか
Host application Cubase10(10.0.50 Build 301)
Vienna Ensemble Pro 7 7.0.922 - oct29 2019
Phoenixverb Version 6.0.0 Release
自動マスキングプラグイン「ClearMixer」のレビュー
「音圧爆上げくん」という一風変わった社名の会社から出てるプラグイン、「ClearMixer」についてつらつら書いていきます。
このプラグイン何をしてくれるかというとトラック同士の帯域のかぶりを自動で検知し棲み分けてくれるとても便利なプラグインです。(自動マスキング)
自動というと、izotopeが自動ミックス&マスタリングしてくれるプラグインを出していますが、izotopeには自動マスキングの機能はなく今のところ唯一のプラグインだと思います。
大変丁寧なマニュアル(しかも日本語ネイティブ)が付いておりある程度DAWを触れている方ならば即使える代物ではないでしょうか。
メリット
- 自動でマスキングをしてくれる
- 時間短縮
- 32トラックまで可能(去年の冬から倍のトラック数になった模様)
特に上二つは大きいですね、izotopeのneutron2でもマスキングのアシスタント機能があるにはあるのですが自動ではしてくれません。
デメリット
- PCへの負荷が高い
たった一つのデメリットではあるのですが、これが中々の高負荷プラグインで結構困ります。
詳しく見てみるとシングルスレッドに依存しているプラグインらしく簡単に頭を打ちやすいようです。
使ってみたい方はデモがありますので一度試してから買うことをお勧めします。
プラグインの気になる点
自動でマスキングしてくれる優秀なプラグインですがいくつか使いにくい点もあります
・アサイン済みのトラックが判らない
・任意トラックへのアサインやりにくい
・確認しやすいとは言えないスペクトルアナライザ
私のDAWはCubaseですので本プラグインを使う際はトラックにClearMixerSenderというプラグインに渡してからClearMixerに統合されますが、このClearMixerSenderが使いやすいとは言えません。
プラグインの性質上ClearMixerSenderを挿した際にどのトラックを使用しているか把握する必要があるにも関わらずそれらを示すUIは無いので実際に再生しClearMixer側で確認するもしくはすべてのClearMixerSenderを確認する手間が発生してしまい、トラック数が増えてくるとメモに書く等して把握する必要があります。すでにアサインされてるトラックはトラックの数字横に何かマークがあると解りやすくなる気がします。
またClearMixerSenderで任意のトラックへアサインする際もこの細かい線に合わせる必要があるので面倒です。つまみダブルクリックして任意の数字を打ち込むとかできれば良いのですが…
ClearMixerのスペクトルアナライザは奇麗ですが、どのトラックがどの帯域を占めているか確認する意図をモーションブラーが破壊していて残念です。
対策としてSpeedの値をSlow側に振り切ると各トラックのピークが薄っすら見えつつ現在の状況が見えるのでお勧めです。
幾つか不満のあるプラグインではありますが、機能としては大変優秀なのでマスキングに困ったときには活躍してくれます。
ただし前述したように高負荷なのでいざって時に活躍する闇のプラグインですね
デモ版及び購入はこちらから出来ます。