はりをきば

そこにピカマンがいる限り 私はテイッハットウッをやめない


Caution!!
この日記はバカな私(はりを)が何かを忘れない為に、バカの一つ覚えの如く色んな記事を投稿しています。…が、
あくまでもただの備忘録のひと握りに過ぎず、情報の信憑性や真偽までは保証していません。
極力正しい情報をまとめているつもりですが、万一誤った記事の内容を実行しトラブル等が発生しても
当方は如何なる責任を負いません。自己責任でご利用ください。

以上に同意する方のみ、この雑記帳の閲覧をお願いします。

初めての方はこちらも併せてお読みください。このブログについて (About)


…ちゃ、ちゃんと予防線張ったからな!! ホント何があっても知らねーからな!!!(小学生並の言い訳)

予防線(☢Caution!!☢)の表示
テキスト全般の表示に使うフォント (大抵は「メイリオ」か「ヒラギノ角ゴ ProN W3」) (マルチバイト文字はSource Han Sansと同じ) (マルチバイト文字はNoto Sansと同じ)
ソースコードの表示に使うフォント
ピカマンロケットの効果音

設定を保存キャンセル

BRSTMをループ付きでMP3に変換できる『LoopingAudioConverter』が便利なので活用してみる

【重要】
この記事は最終更新日から以上経過している為、
もしかしたらリンク切れしていたり、情報としては役に立たなくなっているかもしれない。

主に任天堂製ゲームで使われているBCSTM(3DS)やBFSTM(WiiU)、BRSTM(Wii)といった音楽ファイル。
中身はADPCMストリームにループポイントのメタデータを付加したファイルで、それ自体はBrawlBoxなどでwav化(デコード)できるが、1曲や2曲ならともかく変換したい曲が大量にある場合は骨が折れる。
またBrawlBoxのそれは単純なデコードのみなので、ループさせたい場合は自分で波形編集ソフトでコピペする必要があり面倒極まりない。


当然そんな非効率的なことをするはずもなく、それを解消する「VGAudio」というツールがこの世にはある。

GitHub - Thealexbarney/VGAudio: A library for encoding, decoding, and manipulating audio files from video games.

https://github.com/Thealexbarney/VGAudio

こいつは一括バッチ変換でき尚且つループありで出力できるスグレモノ…なのだが、
これはコマンドラインアプリな上に出力はwavだけなので、MP3やFLACなどに変換したい場合は別途エンコーダにパイプする必要があり少々扱いが面倒。




……何か良いツールがないかと探していたところ、半年くらい前にたまたますげえのを見つけた。
それがこの『 Looping Audio Converter (以下略: LAC) 』なるもの。

Looping Audio Converter

https://www.lakora.us/brawl/loopingaudioconverter/

こいつはVGAudioをGUIで操作できるようにした上で、更にvgmstreamRSTMLib、MP3やFLACなどの各エンコーダを組み込んだ超機能フロントエンドアプリである。



セットアップ

必要なもん

  • LAC本体
  • ライトが速いストレージ(SSD推奨)
  • 最新のiTunes(AACでエンコする場合)
LAC本体

上記LAC作者サイトにある Source(GitHub)のリンクから バイナリを含むzipを入手する。
サイトにあるDownloadリンクは古いバージョンのものなので非推奨。
尚、LACの動作には.NET Framework 4.0以上が必要。

SSD

このツールは

各ファイルからADPCMストリームとループポイントのメタデータを抜き出す
 ↓
ストリームをPCMにデコード、wav出力
 ↓
メタデータを元にループとなる波形をwavにコピペ
 ↓
波形コピペ&ループ化したwavを再保存
 ↓
各エンコーダへ投入
 ↓
変換し終わったらwav削除

という一連のルーチンを全自動でやってくれるものである。


ここでの注意点として、一時ファイルとして瞬間的に大容量のwavファイルがえらい勢いで出力されるという点にある。
LACは、そのexeが置いてあるドライブ上にその一時ファイルを出力するのだが
その実行ドライブがHDDだと場合によっては書き込み速度が追いつかず、処理が詰まってしまう(ストレージボトルネック)


それの何が問題かって、LACはディスクボトルネックを想定していない(例外処理をしていない)為、
変換中にライト詰まりを起こすとLACがフリーズしてしまい、強制終了せざるをえなくなる。


従ってLACを実行する(DLしたzipを解凍する)場所はSSD上が望ましい。
(※一言でSSDといっても、最近世間を騒がせている中華SSDだと却ってHDDより遅い場合もあるので注意)

iTunes

LACはAACエンコーダにqaacを採用している。
qaacはCoreAudioToolboxというiTunes内蔵エンコーダをコマンドラインで扱えるようにしたフロントエンドでしかなく、実際にAACでのエンコードを行うには別途iTunesのインストールが必要。
何らかの理由でiTunesをインストールしたくない(できない)場合は、このサイト等を参考にiTunesのインストーラからCATのdllを抜き出してqaacのexeと同じ場所に置く。
(わかる人向け:iTunesのインストーラexeは7za.exe、CATが含まれるmsiはWin標準のmsiexecでそれぞれ分解可)

qaacのパスを通す

LACにはqaacが同梱されているが、何故かqaacだけパスが通っておらず*1そのままでは認識しない為、自分で設定ファイルを編集してパスを通す必要がある。


LACのexeと同じ場所にある、同名の.configファイルをテキストエディタで開く。
configなんて拡張子が付いてるが、このファイルの実体はただのXML。
開くと下の方にエンコーダのパスを指定しているセクションがあるので
この中の適当な所に、以下のスクショを参考にqaacのパスを書いたディレクティブを追記する。
f:id:Gutyan:20180924215900p:plain


パスは相対・絶対どちらでも良く、故にqaac(というかエンコーダ全般)はどこに置いても構わないが…
…他のエンコーダ同様、LAC配下の./tools/qaacに入れといた方がわかりやすく無難だと思う。
パスを通したら後はconfigを上書き保存して終了。

qaacを最新版へ差し替える(任意)

同梱されているqaacは32bit ver2.64と微妙に古いので、必要に応じて最新版や64bit版へ差し替える。
2.66以前のqaacで生成されたAACは古いiPodでは正常に読めずクラッシュするバグがあるので、2.67以降の利用を推奨する。

qaac

https://sites.google.com/site/qaacpage

cabinetから最新のバイナリを落とし、適当な場所(後述)に配置する。
32/64bitどちらを使うかはお好みで。

LAMEを最新版に差し替える(任意)

MP3エンコーダであるLAMEは最初から同梱されているが、同梱されているのは3.99.25と1年以上前のバージョンなので
気になるなら下記サイトから最新のlame.exe(記事投稿時点では3.100)を入手して差し替える。

RareWares

http://www.rarewares.org/mp3-lame-bundle.php

32/64bit、本家/libsndfileどちらでも好きな方で可。



使い方

今回は一例として、とび森から吸い出したBGMフォルダを指定してみる。
f:id:Gutyan:20180924215920p:plain
この手のツールに慣れてる人はUI見れば大体使い方はわかると思うし、英語の取説も付属しているが(About.html)、念の為ここにも書き起こしておく。
(取説のWin10スクショと違い何故か盛大にレイアウト崩れてるが… Win7だけなのか?)

オプション解説

右上にあるからファイル単位で、からフォルダ単位でゲームBGMファイルを選択する。
フォルダを指定した場合、サブフォルダも含めて指定したフォルダ内の全ファイルがリストアップされる。
不要なものは個別にするか、もしくは後述のでリストから除去する。

Filter (Only files ending with)

リストアップしたファイルリストから、後方一致でファイルを絞り込む。
リスト直下にある小枠に文字列を入力しを押すと文字列にマッチングしたファイルのみ残し、マッチしないものはリストから除去される。(いわゆるホワイトリスト方式)
例えば画像のようにsunny.bcstmと入れてフィルタすると、屋外エリアでの晴天BGMのみリストに残る。

Output directory

変換したファイルの出力先フォルダを指定する。を押すとGUIで指定可。
もちろん相対/絶対パス手動指定でもOK。相対パスはLACのある場所が起点であり、入力ファイル元ではないことに注意。
デフォルトでは./output、つまりLACのあるフォルダのoutputというサブフォルダに出力される。


パスにアスタリスクを指定すると、数に応じて入力ファイル元のフォルダ名を下層から遡って取得できる。
上記スクショの場合だとD:\GameBGM\ACNL_Sound\streamに出力される。

波形編集オプション

リスト下、左上のセクションにあるのは波形を加工するオプション。
便利だが、言わずもがな波形を弄る時点でロスレスではないので使う場合はお好みで。

  • Convert to Mono

全チャンネルをミックスし、モノラル化して出力する。基本的には使わない。

  • New sample rate (Hz)

指定したレートでリサンプルする。
大半のゲームBGMのサンプリングレートは、一般的なものより微妙にブレがある為(3DSなら32.8kHz、WiiUなら47.9kHz等)
それらを32/44.1/48など一般的なレートに補正したい場合に使用する。
尚、LAME(MP3)やqaac(AAC)などは変換時に自動で補正してくれるので、無理にこのオプションを使う必要は無い。

  • Amplify (dB)

波形のレベル(音量)をデシベル単位で調整する。
正の値で大きく、負の値で小さくなる。

  • Amplify (amplitude ratio)

波形のレベル(音量)を相対値で調整する。
ソース音量を1.0とし、値を増やせば大きく、減らせば小さくなる。
例えば2.0を指定すれば音量は2倍に、0.5を指定すれば1/2になる。
音量を弄りたい場合は基本的にこちらを使う。



For non-looping files

ループを含まないファイルをどう扱うかの指定。

  • Keep as non-looping

ループ無しのファイルはループ無しのまま変換する。

  • Force start-to-end loop

曲の最初から最後までの単純なループとして変換する。

  • Ask for all files

曲ごとにどうするか指定する。このオプションはループ有りの曲にも適用される。
曲のデコードが終了する毎に、BrawlBoxのようなループ指定ダイアログが開くので都度指定する。
元がループ付き、或いはループポイントをtxtで指定(後述)している場合、デフォでその値がセットされた状態でダイアログが開く。
しかしこの記事投稿現在のバージョンでは正常に動作しない(後述)

For files with more than one audio channel

マルチトラックファイルをどうするか指定する。
マルチチャンネル(サラウンド)ではなく、マルチトラック。


ゲームによっては、1つのBGMファイルに複数のトラックが含まれている場合がある。
代表的なのはマリオカートで、例えばマリカ8の場合、通常のコースBGM(ステレオ)に加えて、1位走行時のイケイケトラック(ステレオ)が含まれている。
またコースによっては、水中や反重力パートで更に追加トラックが含まれている。


そのような、いわゆる「差分」を含むBGMファイルをどう変換するかのオプションがこれ。

  • Put all channels in one file

オリジナルソース同様に、全トラックをそのまま含める。
マルチトラック非対応のMP3はこのオプションは使用不可。
変換後のファイルには、ソース同様の構成でメイントラックと差分が、それぞれL+Rペア毎に格納される。



『サラウンドではないL+Rステレオペアを複数内包する特殊なAAC/FLAC/Vorbis/WAV』を正常に再生できる環境は極一部に限られる為、このオプションを使う事はまず無いだろう。
再生はせずアーカイブ用途としてのWAVで、且つ可能な限りオリジナルの構成を維持したまま変換したいというニッチな用途でのみ使うオプション。

  • Put each pair of channels in its own file

対応するペア(ステレオ)ごとに分割する。
基本的にはこれ。
一般的な2chステレオずつファイル化してくれるので、再生用途での変換なら原則これ。

  • Put each channel in its own file

全てのトラックを1つずつ分割する。
普通のステレオソースでもLとRの2つにわけて出力される。

Output format

どの形式で出力するかを右のリストから選択。
形式によってはを押すとビットレートなど各エンコーダの追加パラメータを設定できる。


一般的なオーディオ形式はもちろん、B*STMやHPS(GC)、IDSP(NUS3BANK)等のゲーム内形式にも変換できる。
B*STMには無印版とBrawlLib版があり、前者ならVGAudio、後者ならBrawlBoxのADPCMエンコーダであるRSTMLibでエンコードする。
B*STMに変換する場合、基本的にはVGAudioで問題無いが、開発者曰く一部のゲームはRSTMLib製のB*STMじゃないと正常に再生されないらしい。
無印(VGAudio)版の場合、コーデックとしてADPCMの他にPCM8、PCM16を選択可能。
PCMは文字通り非圧縮の8bit/16bitリニアPCMをそのまま内包するオプションで、エンコしないので高音質だが非圧縮なので当然ファイルサイズも大きく、また正常に再生できるゲームも少ないので注意。


AACはM4AとADTSの好きなコンテナを選べるが、まぁ再生用途ならM4Aの方が無難。


MP3やAACのビットレートは各自好きなようにすればいいが
非可逆であるADPCMで、しかも32kHz以下のソースに対して320kbpsとか無駄ってレベルじゃないので適当なところで妥協しよう。
(個人的には32kHzソースなら128kbps、マージン入れても160kbpsで十分かなって。)


FLACやWAVにも変換できるが、非可逆→可逆/無圧縮なので当然ソースよりファイルサイズが増える。
ましてやループ回数を2以上にしている場合、それだけ再生時間=波形量も増えるので尚更。
ソースとなるゲーム内BGMファイルさえとっておけば、後はLACがあればいつでも別形式に再エンコできるので
無理にFLAC/WAVでアーカイブしておく必要は無いと個人的には思う。

  • Export whole song

チェックすると曲全体をループ含めて出力する。
つまり、イントロ(ループに含まれない部分)→ループ(指定回数n)と通常通り出力する。
右のSuffixに文字列を入力すると、出力ファイル名に接尾辞を付けられる。

  • Number of loops

何回ループさせるかの設定。
ここで指定した回数分、ループ領域の波形がコピペされる。
当然その分ファイルサイズも増えるのでお好みで。
ここで多めの値を指定すると、つべで見かける「○○分耐久」「○○○○ Music Extended」系のものが作れる。


尚、この設定はゲーム内形式への出力の場合は無視される。

  • Fade-out time

指定した回数分のループが終了した際のフェードアウト秒数を指定。
0.000を指定すると無効(フェードアウトせずブツ切り)
例えばスクショのようにループ2回&フェードアウト5秒の場合
イントロ(未ループ)→ループ×2→3ループ目の頭5秒フェードアウト
というファイルが出来上がる。


尚、ループ回数同様このオプションはゲーム内形式には以下略

  • Write looping metadata

ループ開始位置をタグとして書き込む。
出力形式がVorbisとWAV、及びゲーム内形式でのみ有効。


Vorbisの場合は「LOOPSTART」「LOOPLENGTH」フィールドに
WAVの場合は「smpl」チャンクに
それぞれ開始位置と全体のサンプル数が書き込まれる。
…Vorbisに書き込めるなら、同じVorbisComment形式のタグを採用するFLACにも書き込めるようにしてくれてもいいのに。。

  • Export segment before loop

ループに含まれない、最初のイントロ部分だけを個別に出力する。
接尾辞も使用可。

  • Export loop segment

上とは逆に、イントロを含まないループ部分だけを個別に出力する。接尾(ry

  • Skip re-encoding for similar formats when possible

チェックすると、似たようなゲーム内形式同士での変換時は再エンコせずコンテナだけすげ替える。
任天堂ゲームのBGMファイル形式は色々あるが、その大半はコンテナが違うだけでストリームは同じGC-ADPCMなので
それら同士で変換する場合は、コンテナだけ変えればそれで済む。


また、入出力共にVorbisの場合、LOOP~タグのみ変更する。


これを使用すると再エンコしないので高速に処理が終わる上、再エンコでの音質劣化も無い。
逆にチェックを外すと強制的に再エンコを行う。
尚、先述の波形編集オプションを1つでも使用している場合、チェックの有無に関わらずこのオプションは無効になる。

  • Use VGAudio decoder

チェックを入れると、ソースファイルがVGAudioでデコードできる形式ならそれでデコードする。
チェックを外すとデコードには一律してvgmstreamを使用する。


チェック関係無くVGAudio非対応形式の場合は自動的にvgmstreamでのデコードを試みる。

  • Number of simultaneous encoding/decoding tasks

フォルダごと指定するなどして一度に大量のファイルを入力した際、同時に何ファイル処理するかのマルチタスク数の設定。
マルチスレッドではなくマルチタスク。
デフォルトではCPUの論理スレッド数が自動指定されているが、当然それだと変換中はCPU使用率が100%に張り付き他の作業ができないので
並行して別の作業をしたい場合は程々の数にお好みで調節する。

Help

付属の取説ファイル(About.html)をデフォルト設定されているブラウザで開く。それだけ。

Load/Save Options

を押すと上記の一連の設定内容を.iniファイルに保存できる。よく使う設定は忘れず保存しておこう。
デフォルトではLAC本体と同名の名前で、LACと同じ場所に保存される。
デフォのまま、LAC本体と同じ場所にLoopingAudioConverter.iniという名前で保存した場合、LAC起動時に自動で読み込まれる。


設定を複数パターンで保存した場合等、それ以外の場所・名前のiniを使いたい場合はを押すと手動で個別に読み込める。



ループ付きでゲーム内形式へ変換する

このツールは基本的にゲーム形式→一般形式への変換がメインだが、逆もできる。
入力できる一般形式は出力同様、AAC(m4a)、FLAC、MP3、Ogg Vorbis、WAV。


ループを指定する方法は3つ。

  1. 先述したVorbisのLOOP~フィールドもしくはWAVのsmplチャンクを参照
  2. 先述したAsk for all filesオプション
  3. txtで手動指定


入力がVorbis/WAVで、且つループ系のメタデータを持っている場合、その値で自動的にループ化してくれる。
メタが無い、もしくはVorbis/WAVですら無い場合はAsk for all filesオプションでGUIを使うかtxtで手動で決め打ちする。


txtで指定する場合はLACのある場所にloop.txtというファイルを作り、
「開始位置サンプル」「終了位置サンプル」「ファイル名」を半角スペースで区切って指定する…らしいのだが


バグなのか、記事投稿時点での最新版(2.1.0)じゃAsk for all filesはループにならないわtxt指定はクラッシュするわで意図しない動作になった。
唯一メタ付きVorbis/WAVメソッドだけは正常にループ変換に成功。


ソースがゲーム内形式の場合はいずれも正常にループ付きを生成できるので、ループ付きの自作BGMエンコにはやはりBrawlBoxのBRSTMが無難…か。


このツール含め、BRSTMは今やハック界隈じゃループ付きゲームBGMの交換用フォーマット(デファクトスタンダード)と化している面があるので
とりあえずミュージックハックに使いたい音源はループ付きBRSTMで持っておけば、後からいくらでもループ維持したまま別形式に変換できるので便利。



おまけ ALACでエンコする

エンコーダにqaacを使ってる時点で察しのいい人はお気付きだろうが…
AAC出力設定のカスタムパラメータに-Aオプションを付ければALACでのエンコードも可能である。
f:id:Gutyan:20180924215940p:plain
--threadingはマルチスレッドエンコードオプション。マルチスレッドと言っても2つしか使わないが…)



大体のファイルに対応

入力形式は非常に豊富。
デコーダに使われているvgmstreamは非常に多くのゲームBGM形式に対応しているので、
ゲームロムからBGMを抽出したらとりまLACに突っ込んでおけば大抵の場合あっさりデコードできる。
B*STM系はもとより、モンハン等のカプコン製ゲームに使われてる.mca形式にもしれっと対応してる。


出力形式は、一般的なものはAAC(+ALAC)、FLAC、MP3、Ogg Vorbis、WAVと一通り対応している。
(強いて言うならopusに非対応なのが残念だが…)


一般形式へのループ付き出力が便利なので影に隠れがちだが、このツールで何気に便利なのがB*STMやIDSP等の別のゲーム内形式への変換
他のゲームのBGMファイルをループ維持したまま直接B*STMにできる(必要に応じてサンプリングレートや音量は変えられる)ので、超簡単にスマブラのミュージックハックに転用できる。


抽出した他ゲームのBGMファイルをループそのままでスマブラハック(ミュージックハック)に転用したい場合、
DXならHPS、XならBRSTMで出力するだけですぐ使える。forならIDSPで出力した上で、NUS3BANKに埋め込めばOK。




…以上。


これでサントラが出ていない(出ているけど収録されていない)ゲームBGMを自前でサントラ化、PC/スマホ/DAPで聴けるようにできる。
とはいえゲームロム内のBGMファイルは非可逆圧縮されているものがほとんど、特に容量削減の為に32kHzや22kHzまでダウンサンプリングされているものは音質が酷い為、
サントラが出ていて、且つ全曲収録されているなら普通にサントラ買った方が圧倒的に楽で高音質なのは言うまでもない…。

*1:更新履歴を見るに同梱され出したのは最近? 設定ファイルの更新を忘れたのだろうか