大福未来研究所

大福フューチャーラボのなんか色々なアレ。プログラミング(C++/DirectX/Unity/UE4あたりやりたい)とか音楽とかの。

【Unity】Unity純正オーディオ機能と波形編集ソフトを組み合わせるだけで色々できるよって話

お久しぶりですこんばんは。
本業の修羅場から舞い戻って参りました。

こちらの記事は、

Unityゆるふわサマーアドベントカレンダー 2019 #ゆるふわアドカレ - Qiita
↑こちらのアドカレの8月12日の記事です。
もう一度言います。

8月12日の記事です


はじめに

昨今のゲーム制作で、Unityを使う際はCRI ADX2やWwiseなどのサウンドミドルウェアを使うことは珍しくありません。
しかし、予算の関係でミドルウェアが使えないケースや、個人開発等でもライセンス周りの事情でミドルウェアの導入を断念するケースも多いと思います。
そのため、
・Unity純正のオーディオ機能におけるTipsを共有することにも需要はあるのではないか
・波形編集ソフトの使い方をエンジニアやゲームデザイナーに共有し、波形編集からUnityへの組み込みまでを一括して行えるようになるのは有益なことではないか
と考え、この記事を書きました。

とりあえずお役立ちスライド

基本的なサウンド周りの知識は2018年のUNITE TOKYOでIchijoさんが登壇された際の資料

www.slideshare.net
こちらを御覧ください。
著書発売おめでとうございます!!)

本記事では、こちらのスライドを読み終えた前提のもとで進めます。

波形編集ソフトってなんぞ

波形編集ソフトというのは、主にWavファイルを編集するためのソフトです(そのまんまやんけ)
例えば音のピッチを変えたり、長さを変えたり、無音を挿入したり、エフェクトをかけたり、フェードイン/フェードアウトをさせたり……
DAW(作曲ソフト)とは違い、基本的には1つずつ音声ファイルを加工するためのソフトです。
今回の記事では、MAGIX社の「SoundForge Pro 12」というソフトを使います。
これ実は399ドルぐらいするんですけど、
www.humblebundle.com
Humble Bundleのこちらのバンドルで25ドル払えば作曲ソフトのAcidProなどと一緒にゲットできます。絶対損しないので買いましょう(なお、こちら2019/9/5までのバンドルなので購入はお早めに)
買い逃した場合は、
www.sourcenext.com
こちらの機能制限版でもいいのですが、これだと後述するバッチ処理ができませんのでお気をつけください。

波形編集編その1:イントロループするBGMを作りたい

ゲームのBGMの中には、よくイントロ→メインループとなった後、そのままメインループを繰り返すものが見受けられます。
イントロとループを別々に分けて、それをタイミングよくつなげて再生するのも良いのですが、
どうしてもズレるリスクは捨てきれません。
波形編集ソフトを使うことで、一つのファイルの中で途中からループさせるように設定されたWavファイルを作ることができます。

f:id:dfk_ohnuma:20190903033208p:plain
SoundForgeを開き、BGMのWavファイルをドロップします。
この中で、ループしたい範囲をドラッグします。
f:id:dfk_ohnuma:20190903033557p:plain
あとは、「Alt+L」キーを押してループを設定してやると
f:id:dfk_ohnuma:20190903033651p:plain
このように、「Sustaining Loop」というものが設定されました。
この状態でWavを保存します。

これをUnityにインポートして、出来上がったAudioClipをAudioSourceに
突っ込んでLoopをtrueにしてやれば、最初ではなく先程のSustainingLoopの開始地点へループします。

こちらが動画キャプチャしたものです。



ImportSettingでPCM以外を選択して圧縮をかけても、ループはちゃんと効いてくれます。

波形編集編その2:ゲーム中のサウンドの音量を揃えたい

色んな所から効果音やBGMを寄せ集めたりすると、どうしても音量のバランスがバラけてしまうことが多いです。
また、サウンドを自作していても、数が多くなると音量を統一するのはむずかしくなります。
f:id:dfk_ohnuma:20190903034832p:plain
この「ノーマライズ」という機能を使うことで、音量をある程度整えることができます。
f:id:dfk_ohnuma:20190903035023p:plain
赤で囲った部分は「揃えたい音量値」で、
青線の部分は「揃える際に基準にする値」です。「ピークレベル(そのファイル内で一番音が大きい部分)」か「平均RMSレベル(そのファイルの平均的な音の大きさ)」
これを設定してOKを押すと、処理完了です。
この揃えたい音量値を一定にしてやることで、ゲーム内で使うサウンドの音量バランスを整えることができます。
だいたいの場合は、BGMは平均RMSレベル、SEはピークレベルを元に揃えると良いかと思います。

波形編集編その3:バッチ処理で複数ファイルを一括処理

Sound ForgeのPro以上だと、バッチ処理という機能があります。
これを使うと複数のファイルを一括で処理できるので、色々はかどります。まじで。
「Tools」→「Batch Converter」をクリックして、この画面を出します。
f:id:dfk_ohnuma:20190903035801p:plain
「File to Convert」タブには、コンバートしたいファイルやフォルダを突っ込むことができます。
「Add File」「Add Folder」でガンガン突っ込みましょう。
f:id:dfk_ohnuma:20190903040034p:plain
「Process」タブでは、どんな処理をするかを設定できます。
複数の処理を順番に行うこともできます。今回の画像の場合、
RMS-10dbにノーマライズして、その後逆再生にする」という処理をします。
f:id:dfk_ohnuma:20190903040229p:plain
「Metadata」タブは今回使わないのでスキップ。
f:id:dfk_ohnuma:20190903040326p:plain
「Save」タブでは
・保存するときのファイルフォーマット(圧縮・非圧縮とか)
・ファイル名(元と同じにするか、特定の文字列を追加して保存するか)
・保存先フォルダ(元と同じ場所か、別の特定の場所を指定するか)
を選ぶことができます。
f:id:dfk_ohnuma:20190903040644p:plain
このように複数フォーマットで保存することもでき、フォーマットごとにファイル名や保存先を指定することもできます。

ここまで設定したら「Run Job」ボタンを押すと処理が開始され、
「Status」タブに処理の結果が書き込まれます。
f:id:dfk_ohnuma:20190903040812p:plain
このバッチ機能は非常に便利で、サウンドアセットの管理や一括編集にもってこいです。
是非活用してみてください。

UnityAudioTipsその1:UnityのAudioMixerの処理負荷

AudioMixerの処理負荷は、エフェクトを増やすことでも重くなりますが、
それ以上にグループを増やせば増やすほど重くなります。
f:id:dfk_ohnuma:20190903041242p:plain
こんな簡潔なAudioMixerを作ってみました。
f:id:dfk_ohnuma:20190903041319p:plain
このBGMグループで音を鳴らしてみます。
インポート設定は「Compressed In Memory」かつ「Vorbis」にしました。
使っているマシンは以下のスペックです。
f:id:dfk_ohnuma:20190903041430p:plain

この状況でプロファイラで計測するとこうなります。
f:id:dfk_ohnuma:20190903041709p:plain
全然余裕ですね。


次に、グループを増やして試してみます。
f:id:dfk_ohnuma:20190903041834p:plain
すると……

f:id:dfk_ohnuma:20190903042011p:plain
一気にCPU使用率が上昇しています。
全く使っていないグループであっても、グループの数が増えれば増えるほど、再生時のCPU負荷が増すのです。
なので、グループの数を増やすのはいいんですが、無駄な増やし方はしないようにしたほうがよいです。

ちなみに、AudioMixerにエフェクトを突っ込んだときの負荷ですが、
f:id:dfk_ohnuma:20190903042532p:plain
f:id:dfk_ohnuma:20190903042654p:plain
音が流れる「BGM」グループでエフェクトを有効にした場合の負荷がこちら。

そして、
f:id:dfk_ohnuma:20190903042740p:plain
f:id:dfk_ohnuma:20190903042837p:plain
今回音が流れることのない「SE」グループでエフェクトを有効にした場合の負荷がこちら。
一度も音が流れないグループで有効になっていても、負荷はほぼ変わりません。
ですので、エフェクトもとりあえず突っ込んどけ的な使い方はやめましょう……

UnityAudioTipsその2:スナップショット切り替えと、よくある罠とか

AudioMixerにはSnapshotという機能があります。
これは、AudioMixerのパラメータをSnapshotとして保存し、
ゲーム中にSnapshotを切り替えることで動的に音の聴こえ方を変えることができるというものです。
例えば通常用とポーズ用のSnapshotを作って、ポーズした時にBGMをちょっと小さくするとか、そういう使い方ができます。
更にAudioMixerSnapshot.TransitionTo(float time)のように、秒数指定でトランジションさせることができるのですが……
このとき、トランジションの方法を設定できます。
f:id:dfk_ohnuma:20190903043911p:plain
ItsumonoスナップショットのBGMのAttenuation(音量みたいなもんだと思ってください)のトランジションを設定する際は、
f:id:dfk_ohnuma:20190903044110p:plain
Inspectorの「Volume」の文字のあたりを右クリックすると、このようにパラメータを選べるようになります。

ここで選べるトランジションカーブは、
・Linear(線形)
・SmoothStep(こういうやつ
・Squared (y = x^2)
・SquaredRoot(y=10√x)
・BrickwallStart(トランジション開始と同時に終点、以降動かず)
・BrickwallEnd(トランジション終了時間まで一切動かず、終了と同時に終点)
以上になります。


この設定は非常に設定漏れやミスが起きやすいです。
トランジション設定は、「そのSnapshotに遷移するときに適用される設定」である
トランジション設定は、Snapshotごとに独立して保存される
この2つがとても分かりにくく、いちいち該当のSnapshotをクリックして、それからパラメータを右クリックしてようやくトランジション設定を確認できる、という面倒な手順を踏む必要があります。
なので、Snapshotをある程度増やしてトランジションの設定にもこだわりたい、という方は設定をどこかにメモしておいたほうがいいです。


また、このトランジションですが線形と言っているのに実際に録音してみると結構ガタガタな遷移をしていたりするので、極端に短い時間で遷移させて疑似フェードアウト……みたいなことをしようとすると、音によってはプチノイズの発生原因になりえます。

f:id:dfk_ohnuma:20190903045816p:plain
Sound ForgeでInsert→Synthesisを選び、Simpleをクリックしてサイン波を生成してやると、プチノイズが起きるかどうかの検証に役立ちます。


最後に

Ichijoさんのスライドにだいたい大事なことは書かれていたし、
今後は著書を参考にしてADX2LEを使う人も増えるんだろうなーとも思います。
が、Unityの純正オーディオ機能でも色々できるということはもっと知られてもいいと思いますし、
その補助として波形編集ソフトの恩恵は地味に大きいと思います。
特に個人制作で何でもかんでも自分でやらないといけない人にとってはとても助かると思いますので、お金に余裕があれば是非導入してみてはいかがでしょうか。

以上でこの記事は終わりです。お疲れさまでした。