ループの継ぎ目で起こること
ゲームのBGMは、曲の終わりまで再生したら最初に戻って繰り返す「ループ再生」にすることが多くあります。このとき、戻る瞬間に一瞬の無音が入ったり、「プツッ」というノイズが聞こえたりすることがあります。
原因は1つではありません。大きく分けると、次の2つがあります。
- 音声形式の仕組みによる原因:圧縮の仕組みのために、曲の頭や終わりに、本来の音ではない無音が入ってしまう。
- 音声データそのものの原因:ループの終わりと始まりで波形がつながっておらず、音が飛んでしまう。
この記事では、この2つを分けて説明します。形式だけが原因とは限らないため、「MP3は使えない」「OGGなら必ず大丈夫」といった言い切りはできません。
原因1:圧縮の仕組みで、頭と終わりに無音が入る
MP3やAAC、Vorbisなどの非可逆圧縮は、音声を一定の長さのかたまり(フレーム)に区切って処理します。そのため、変換した音声には次のような余分な部分が付きます。
- エンコーダ遅延:エンコードの仕組み上、曲の頭に入ってしまう無音に近い部分。
- パディング:曲の長さがフレームの長さで割り切れないとき、末尾を埋める部分。
この余分な部分を再生時に取り除く情報が正しく保存され、さらに再生側がその情報を読み取って処理すれば、継ぎ目に無音は出ません。逆に、どちらかが欠けると、ループの継ぎ目に無音が残ります。
MP3の場合
MP3の規格には、この遅延やパディングの量を記録する仕組みが用意されていません。また、エンコーダによって遅延の量も異なります。そこで、LAMEというエンコーダは、ファイルの先頭のフレームに「LAMEタグ」と呼ばれる独自の情報を書き込み、遅延とパディングの量を残すようになりました。対応した再生ソフトは、この情報を読んで余分な部分を取り除きます。
つまり、MP3でループの継ぎ目が目立つかどうかは、次の2つに左右されます。
- そのMP3に、遅延とパディングの情報が書き込まれているか。
- ゲームエンジンやブラウザなどの再生側が、その情報を読んで処理してくれるか。
Unityの古いバージョン(4.x)のマニュアルにも、標準的なMPEGエンコーダーはループ位置に短い無音を入れ、短い「クリック」や「ポップ」として聞こえる、という趣旨の記述があります。ただし、この記述は古いバージョンのものです。最新のバージョンで同じ症状が出るかは、お使いの環境で確かめてください。
OGG(Vorbis)の場合
VorbisもMP3と同じくフレーム単位の圧縮ですが、Oggの仕組みには、サンプル単位で正確な開始位置と終了位置を示す方法があります。Vorbisの開発者の解説によると、各ページに「granule position」という累計のサンプル数が記録され、最後のページでは、実際の長さより多く復号された分を、デコーダーが捨てる仕組みになっています。仕様の上では、余分な無音を足さずに、元の長さを正確に表せます。
このため、OGGはループ再生に向くとされています。ただし、これは「仕様上そう表せる」という話で、すべてのエンコーダー・再生環境が正しく処理するとは限りません。
Opusの場合
Ogg Opusの規格(RFC 7845)では、ヘッダーに「pre-skip」という値を持たせ、再生開始時に捨てるサンプル数を示します。また、最後のページのgranule positionで、終わりの余分な部分を取り除く方法(End Trimming)も定められています。OGG(Vorbis)と同じく、仕様の上では長さを正確に扱えます。ゲームエンジンによっては取り込めない場合があるため、使う環境の対応状況を確認してください。
AAC / M4Aの場合
AACでも、曲の頭には、エンコーダによって量の異なる無音部分(プライミングサンプル)が入ります。その量は、iTunes形式のメタデータ(iTunSMPB)や、MP4のエディットリストといった情報に記録されます。AppleのQuickTimeファイル形式の資料でも、エンコーダ遅延を、エディットリストなどで明示的に表す方法が説明されています。再生側がこの情報を読まなければ、頭に無音が残ります。
WAVの場合
WAVは、音のデータをそのまま保存する形式です。圧縮による遅延やパディングがないため、形式が原因で継ぎ目に無音が入ることは、基本的にありません。
形式ごとの傾向のまとめ
| 形式 | 長さの情報の扱い | ループへの影響 |
|---|---|---|
| WAV | 音のデータをそのまま保存するため、余分な部分がない。 | 形式が原因の無音は入りにくい。 |
| OGG(Vorbis) | 仕様上、サンプル単位で開始・終了位置を表せる。 | 継ぎ目の無音は入りにくいとされる。 |
| Opus | pre-skipと終端のトリミングで、長さを表す。 | OGGと同様。対応環境の確認が必要。 |
| MP3 | 規格には記録する仕組みがなく、LAMEなどが独自のタグで残す。 | 情報がない、または再生側が読まないと、無音が入る。 |
| AAC / M4A | iTunSMPBやエディットリストなどのメタデータで表す。 | 再生側が読み取るかどうかで変わる。 |
この表は、形式の仕様や、公開されている資料にもとづく一般的な傾向です。実際にどうなるかは、使うエンコーダー、ゲームエンジンのバージョン、再生環境によって変わります。
原因2:ループの始まりと終わりで、波形がつながっていない
形式に関係なく、音声データそのものに原因がある場合もあります。ループの終わりの波形の高さと、始まりの波形の高さが大きく違うと、戻る瞬間に音が急に飛び、「プツッ」というノイズとして聞こえます。WAVで保存していても、この原因は避けられません。
主な原因は次のとおりです。
- 曲の途中で切った:拍や小節の区切りと関係ない位置で、波形を切り取った。
- 余韻を切り落とした:曲の最後の残響やシンバルの余韻が、ループの頭に重ならず、途中で途切れている。
- 前後に余白がある:曲の頭や終わりに、無音が残っている。
非可逆圧縮では、波形がわずかに変わる
MP3やOGGなどの非可逆圧縮は、聞こえにくい情報を削るため、変換前と後で波形がまったく同じにはなりません。無音が入らないように正しく処理されても、理論上は、ループの継ぎ目の波形が元のWAVとわずかに違う可能性があります。多くの場合は聞き分けられませんが、継ぎ目に厳しいBGMでは、実際に聴いて確かめることが大切です。
エンジンごとの扱い
Unityの場合
Unityの公式マニュアルによると、音声ファイルを取り込むとき、Unityはビルドの対象に合った形式へ変換し直します。標準では、その形式はVorbisですが、プラットフォームごとにADPCMやMP3などに変更できます。つまり、取り込む前のファイル形式が、そのまま最終的な形式になるわけではありません。
そのため、ループさせるBGMは、劣化のない元データ(WAVなど)をそのまま取り込み、変換はUnityに任せるのが無難です。すでにMP3になっている素材を取り込んだ場合に、取り込み時に先頭の無音が取り除かれるかどうかは、公式マニュアルに明記が見当たりませんでした。この場合は、実際に確かめてください。
また、Unityの古いバージョン(4.x)のマニュアルには、AndroidとiOSに限り、シームレスにループする音声をMP3に圧縮するときに継ぎ目の連続性を保つための「Gapless looping」という設定が記載されています。現在のマニュアルでは、この設定の説明は見つけられていません。お使いのバージョンのインスペクターに項目があるかを確認してください。
Godotの場合
Godotの公式ドキュメントでは、WAV・Ogg Vorbis・MP3の3つの形式を取り込めると説明されています。音楽や長い効果音にはOgg Vorbis、WAVは短く繰り返す効果音に向くとされ、MP3は、CPUに余裕のないモバイルやWebで、複数の圧縮音声を同時に鳴らすときに便利とされています。
ループの指定にも違いがあります。WAVは、ループの開始位置と終了位置を指定できます。一方、Ogg VorbisとMP3は、ループの開始位置(Loop Offset)だけを指定でき、終了位置は指定できません。Godotの「Advanced」の取り込み設定では、ループ位置をプレビューしながら調整できます。
直し方:順番に確認する
- 元データをWAVで用意する:劣化のないWAVで、ループ用のBGMを作ります。圧縮された音声から作り直すと、形式の影響と波形の影響を切り分けにくくなります。
- ループ位置を、拍や小節の区切りに合わせる:曲の頭と終わりが、拍の区切りでつながるようにします。余韻は、切り落とさず、ループの頭に重ねる形にすることもあります。
- 継ぎ目の波形を確認する:音声編集ソフトで、ループの終わりと始まりをつないだ部分を拡大し、波形が大きく飛んでいないかを見ます。飛んでいる場合は、波形が0を横切る位置に切り替え位置を動かしたり、ごく短いフェードを入れたりして、つなぎ目を整えます。
- 配布用の形式への変換は、できるだけ元のWAVから、1回だけ行う:非可逆形式を何度も変換し直さないようにします。ゲームエンジンが取り込み時に変換するなら、WAVのまま取り込みます。
- 実際の環境で聴いて確認する:エディター上だけでなく、ビルドして、対象の端末やブラウザで、継ぎ目を何度か聴きます。
迷ったときは、まずWAV(または、変換後のOGG)で試し、継ぎ目の無音が消えるかを比べると、原因が形式にあるのか、データにあるのかを切り分けやすくなります。
当サイトのツールを使うときの注意
当サイトの「音声形式変換」は、音声をWAV・MP3・OGGに変換できるツールです。ただし、ループの継ぎ目が完全につながることを保証するものではありません。ループさせるBGMは、できるだけ元データ(WAV)をそのままゲームエンジンに取り込み、必要な変換をエンジン側で行うことをおすすめします。ツールで変換したファイルをループに使う場合は、実際の環境で、継ぎ目を聴いて確かめてください。
音声形式ごとの一般的な違いは、音声形式の違いと使い分けをご覧ください。
この記事は、UnityとGodot Engineの公式ドキュメント、RFC 7845(Ogg Opus)、Xiph.Orgの開発者による、Vorbisのサンプル単位の長さに関する解説、AppleのQuickTimeファイル形式の資料、MP3のギャップレス再生に関する解説を参考にしています。ゲームエンジンの設定名や挙動は、バージョンによって異なることがあります。実際に使うバージョンのマニュアルもあわせてご確認ください。