見出し画像

ゲーム制作における音声フォーマットについて

※当記事は元々はTeamUp企画の参考用として執筆していますが、無論、それ以外のケースでも汎用的に通用する内容を意識しています。(再びコピペ) なお今回はプレゼン会発祥ではない

あ、あと自分(BMS界隈にも長くいたわけで)音声周りの知識全く素人だとは思ってないけど、それでも全部を正しく書いている保証はないので、ここちげえってのがあったらマサカリ飛ばしといてください。


■概要

画像編を書いたのでせっかくなら音声編も書こうと思いました。

ところで最初は(TU内で)ホットなIM絡みのこと書こうとしましたが、それやるとどうにも長くなりそうなので、まず前編として音声ファイルの基本的なことを一つの記事に書くことにしました。IM絡みのTIPSは後編でやります。unity1week制作期間前に間に合うかは知らん。

■本論:音声フォーマットについて

◆前提

画像ファイル同様、一度インポートしてしまえばUnity内ではAudioClipというフォーマットのアセットとして扱われるので、インポート後の扱いは元の音声ファイルの形式が何であろうが変わりません。なので、音声フォーマットの是非はインポート前の扱いやすさでだいたい決まります。

◆代表的なフォーマットとその是非

音声フォーマットとして有名なのは、wav、mp3、ogg(厳密にはOgg Vorbisと称するのが正しいんですがめんどいのでoggと呼びます。拡張子もだいたいoggだし)の3種です。これまた結論からいえば、音声ファイルの受け渡しはwavかoggを推奨します。以下各フォーマットの簡単な解説。

◆wavファイル

一番基本的な音声ファイルで、波形(を標本化したもの)をそのまま記録しています。画像ファイルならbmpファイル相当。なので最も正確に波形を再現し、そして最も容量がでかいです。効果音やジングル相当ならwavでやりとりしても良いとおもいますが、まとまった長さのBGMなどは結構な容量になります。……といっても、最近は回線もPCやクラウドが受け持てる容量も相当大きくなっているので、wav直渡しでもなんとかなる気もしますが。

◆oggファイル

オープンフォーマットの非可逆圧縮音声ファイルです。mp3が後述する問題を抱えているので、圧縮フォーマットとしてはこちらの方が扱いやすい印象です。公式のエンコーダ/デコーダを入手しやすいのも〇。

ここのoggdropXPdというやつを落とせばOKです。おさかなアイコンです。

◆mp3ファイル

オススメしない。しねえ。 以下理由。

・パディングという仕様があり、先頭や末尾に無音部分が入ることがあります。これはループBGMを作る際には致命的ですし、ワンショット系の効果音でも先頭の無音は無視できない問題です。

このへんにもmp3におけるループBGMの格闘記録が載っています。がんばっているようですが、ぶっちゃけoggでやればいいでござる。

・mp3は2017年、失効するまでライセンス(特許)の問題があり、ゲーム制作に用いるには敬遠されていた風潮がありました。2023年の今でこそライセンスの問題は解決されているものの、ゲーム制作付近のツールに関してはこのへんの背景が災いしてoggより後れを取っている印象があります(ていうかこの特許の問題がきっかけでoggが開発された経緯がある)。具体的に言うとエンコーダ/デコーダが入手しづらい。うかつに検索で調べようとするとステマ記事がわんさか先頭に出てきます、f**k。やっぱり公式で入手できるoggが正義。

一応後述するaudacityはデフォルトでmp3に対応しているのでaudacityを使うならまあ。でもパディングがやはり致命的なのでoggのほうがいいかなあ。


以下tips。

■音声編集ソフトについて

エンジニア側でも、音声ファイルにちょっとした調整や加工を加えたいケースは多くあるので、音声編集系のソフトはなにかひとつ以上持っておいて損はないと思います。一応、知っているものを2つ紹介しますが、自分に使いやすいのを使えばいい気もします。

◆Audacity

一番有名らしい。自分は↓の方を使っているので詳しい使い勝手は知らん。

◆SoundEngine Free

われはこっちを使っています。なんか面白いエフェクトは、こっちのほうが充実している気がします。

■webGL上の音声ファイルの仕様

webGL上での音声ファイルの扱いには様々な制約があります。unity公式ドキュメントに記載してあります、当noteでも、そのあたりをまとめた記事を書いています。

■AudioClipのインポート設定

AudioClipはインポート設定によって品質と容量を制御することができます。

……が、基本的にはデフォルト設定で問題ないと思います。てか設定項目の意味が分からないレベルなら変に手を出さないほうが無難。一般的にBGMファイルはLoad TypeをStreamingにするのが良いといわれることもありますが、最近のマシンパワーならbgmのひとつくらいDecompress On Loadでも余裕ですし、後編で解説予定のIMをやろうとするとStreaming設定だと却って面倒な問題が発生したりします。

■ループBGMの実装について

BGMは当然ループしたいものです。が、その元となる音声ファイルとプログラム上の実装についてはいくつかの方法があります。

◆単独のループBGMを作る方法

一番シンプルな方法。1ループ分のBGMを作った後、末尾の残響をイントロにミックスして完成。いわゆるループBGM素材はこの形式で作られることが多いです。運用もAudioSourceのLoopにチェックを付けて再生するだけなので簡単。ただし、上述した通り、この方法を用いる場合パディングの問題でmp3ファイルは不適切。そのほか、イントロ付きループBGMは作りにくい、タイミングの融通は利きづらいので、IMをはじめとした音声同期系の演出もやりづらい、と結構欠点も多いです。

◆ワンショットのBGMを多重再生する方法

あくまでBGMはループ処理をせず単発BGMとして用意して、それをシステム側でタイミングを見計らい一定周期ごとにワンショットで再生する方法。少々メモリ的には優しくない方法だが、スクリプト側で融通が利きやすいのがメリット。IMや音声同期をやりたい場合、こちらの方法の方がオススメ。ていうか横の遷移(Horizontal Resequencing)をやりたいなら確実にこっちの方がいい。このあたりはIM実装の記事でより詳細に説明予定。

◆smplチャンクによるイントロ付きループBGM(ただし……)

実はunityはsmplチャンクによるループポイント設定に対応しています。
↑のgithubはそのあたりの加工をwavファイルに施すもので、これを使うことでイントロ付きのループBGMを実現することができます。

……ただしsmplチャンクはwebGL非対応。
よってunityroomに投稿予定の皆さんには関係なし! 解散!

◆timeSamplesを制御してループさせる

さらに発展的な方法。webGLでもtimeSamplesの取得代入は有効なので、それを用いて手動でイントロ付きループを実現させる。なかなかぶっとんだ方法だが場合によっては採用するのはアリ。

■まとめ

という、そこそこの長さの記事でした。今後もこういった話がでたら随時当記事に追加していこうと思います。かしこ。(前記事複製)

冒頭に書いた通り、よりIM実装に特化した記事は後編として投稿予定です。
……本当にu1w開催前までに間に合うのか??

■定型句

当記事がいい!とおもったら
スキ!やシェアとかフォローなど、お願いいたします!!
内輪コミュニティ向け記事でもいっていく。


この記事が気に入ったらサポートをしてみませんか?