BMSのファイルサイズを小さくする工夫

#おことわり
この記事は、趣味でプログラミングをしているだけの普通の学生が、個人の知識を元に書いた記事ですので、当然ですが誤りを含む可能性があります。記事に誤りがあったからと言って突然ブチ切れられても、単に私が困惑するだけですので、そのことをご理解頂ける方のみ読んでください。（もしよければ、誤りを見つけた方は@yuinoreまでこっそり教えて下さい。）

#はじめに（読み飛ばして構いません）

何年も前に、私が**"ニライカナイ"**というBMSをプレイしようとしたとき、重すぎてプレイできないということがありました。それから時間が経ち、今では大きなBMSでも難なくプレイできるようになりました。

ところが、先日、**"Anhedonia"**というBMSの存在を知りました。このBMSは、ギミックがとても面白い譜面が同梱されているのですが、プレイしようとするとLR2が落ちてしまい、まともにプレイできないという人が多いそうです。ギミックがLR2にどの程度負担を掛けているのかの話はさておいて（←は？）、確認のためにBMSフォルダを開いて.oggを.wavに展開してみたところ、なんと**607MB**もありました。メモリが2GBのパソコンであれば、その1/3を専有してしまうことになります。

さらに、G2R2014のパッケージは、10GBの大容量となっています。HDDが80GBの格安ノートパソコンであれば、zipファイルだけでも、その1/8を専有してしまうことになります。

PCの高性能化は進んだものの、それと同時にBMSの高容量化が進んでしまい、BMSのファイルサイズ問題は未だ解決しないのかもしれません。そこで、今日は**BMSのファイルサイズを小さくする工夫**を説明したいと思います。

#基本的な方針

方針としては、

* (1) **叩かない音をBGMにする**
* (2) **リバーブやディレイをBGMにする**
* (3) **音の末尾の無音をカットする**
* (4) ファイル形式を低品質なものにする

という感じです。(1)は基本であり、それに加えて(2)と(3)のどちらか、または両方を行うことが重要となります。(4)はあまり効果が無いので読まなくても良いかもしれません。では、それぞれについて見ていきましょう。

#(1) 叩かない音をBGMにする（基本）

これはなんということはないですね。**小さすぎる音**や、後ろで鳴っている**長いパッド**などは基本的には**叩かれない**ことが多いので、**BGMにしてしまった方が良い**でしょう。**Mid2BMSやBMHelperが一括で変換してくれるからと言って、思考停止して全部キー音に変換するのはやめましょう。**

また、ベース音のような低音は、ゲームセンターのような騒音の中ではスピーカーからはほとんど聞こえません。そのため、曲のジャンルや雰囲気にもよりますが、ベースもBGMに含めてしまうことがあります。主に私です。

このあたりは、何度も譜面を作ってみて、この音は叩かせたいなとか、この音は叩き甲斐がないなとか、いろいろ試行錯誤してみてください。

なお、**BGM**というのは、この記事中では**鍵盤に配置されることを想定していないwav/oggファイル**のことを指しています。たとえば★LittlE HearTs★で言うと、bgm01.wav～bgm17.wavやend.wavのことを指します。

では、どれくらいまでキー音を減らせばよいのでしょうか？ 少なくとも、140BPM以上で16分の縦連が延々と続くというのは、高難易度譜面でもあまり多くはないでしょう。そこで、16分縦連を含まないような譜面を制作すると想定した場合、次のような基準が同時に鳴るオブジェ数の目安となるでしょう。BMSEやiBMSC上で**横一列に並んでいるオブジェの数が、この値を超える場合は、キー音が無駄になる可能性が高い**ということです。（[例外1](https://www.youtube.com/watch?v=6ZCZh6ut8mg) / [例外2](https://www.youtube.com/watch?v=roXOBSbuWGI)）

| | 16分音符の場合 | 8分音符の場合 |
|--:|:-:|:-:|
| 7keys | 3～4音 | 8音 |
| 14keys | 7～8音 | 14音 |
| 9buttons | 4音 | 6音 |

なお、**BGMが60秒を超えるとインターネットランキング(LR2IR)に登録できなくなってしまう**ので、激しく注意しましょう。

#(2) リバーブやディレイをBGMにする（応用）

こうすることで、キー音の長さを減らすことが出来ます。シンセ音などではディレイをめっちゃ掛けたりするので、**この手法はとても有用です**。ちなみにこれは、***BOF2011 conflict制作まとめ***という記事に書いてあったらしいですが、今は見れなくなっているみたいです。

ただし、使っているDAWについて深く理解していないと、センドリターンをそのまま書き出す方法が分からなかったりするかもしれないため、わからないひとはDAWの説明書などを読んでください。時間があったら後で書きます。

さらに加えて、最近はシンセにディレイやリバーブが内蔵されているということがあるため、そのディレイの分も除こうとすると手間が大きくなってしまうかもしれません。

なお、大事なことなので二回言いますが、**BGMが60秒を超えるとインターネットランキング(LR2IR)に登録できなくなってしまう**ので、激しく注意しましょう。

#(3) 音の末尾の無音をカットする（最重要項目）

基本的に、小さい音というのは、大きな音に埋もれてしまうと聞こえなくなります。これを利用して、**大きな音が鳴っている場所では**、キー音の末尾に含まれる**残響を大胆にカットする**という工夫を行うことができます。（曲のジャンルによってはこの方法は適切ではないかもしれません。）

でも、どうやって？

## 作業をする前に
この作業をする前に済ませておく必要があることは、

* Mid2BMSやBMHelperを使用しないものを含む、すべてのキー音の音切りを終了させ、1つのBMSにする

ことであり、この作業の前に行うべきではないことは、

* 自動重複定義を行う
* 譜面を作成する

ことです。音量調整はどのタイミングで行っても問題ありませんが、マスタリング時に済ませてしまった方が良いでしょう。

## 作業方針

まず方針を練るために、DAWまたは[**BMX2WAV**](http://childs.squares.net/program/bmx2wav/)を使って曲全体をwavに書き出し、その波形を見てみましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/df03fe9a-da38-05e4-329f-1bad61fce95b.png)

曲の最後で無音に漸近していることがわかります。この世界に存在する曲の99%でも同様でしょう。さらに、Audacityを使って周波数スペクトル（という名前の何か）を見てみましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/83bb31d6-6c33-feb0-13ea-5f9c9d021b60.png)

色が赤いほど音が大きく、水色から灰色に近付くにつれ音が小さくなります。曲の最後(①)の他に、曲の途中(②)にも**音が小さい**(周波数帯を持つ)**領域が存在している**ことがわかります。（ちなみに、曲の終盤にもう１箇所だけ短い無音の部分があります(③)が、この箇所は残響音を含まないため、今回は考慮する必要がありません。）

**"ブレイク"と"曲の最後"、これらの2箇所で鳴っている音「以外」について、残響をカットしましょう。**

でも、どうやって？

##曲がフェードアウトで終了する場合
この場合は簡単で、フェードアウトのbgmだけを除外して、末尾の残響をカットすればよいでしょう。

末尾の残響のカットには、Mid2BMS最新版の**TailCutPlus**機能、あるいはSoundEngineのバッチを使用します。

##じゃあ、それ以外の場合は？

ひとつずつ必要なファイルを確認して除外するのは面倒ですね？

はい、**BMSE**の**"未使用のwavを削除する"**機能を使用します。皆さんはもう[**iBMSC**](http://hitkey.nekokan.dyndns.info/ibmsc_ja/ScreenShots.html)に移行してしまい、BMSEはほとんど使っていないことと思いますが、どうやらまだBMSEにも出番があるようです。冗談です。冗談ですってば！！

（参考：[umtk/krgさんによるBMSEとiBMSCの比較](https://twitter.com/umt_ki/status/552856502461939713) ）
（参考2：Windows7でBMSEが起動できないときは → [VB6SP6ランタイムのインストールエラーについて - Yahoo!知恵袋](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10137549285) ）

その前に、**BMSフォルダのバックアップを必ず取って**下さいね。

まず、残響を**残したい方**のキー音（**と、BGM音**）だけを**残した**BMSを作成します。1音ずつ残響の長さを確認しながらオブジェを削除していきます。こんな感じに残りました。

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/75bb0f5e-ef37-82c3-e17b-bdc385ce8071.png)

それが終わったら、BMSEの変換ダイアログを開いて、

* **使用していない #WAV・#BMP・#BGA の定義を消去**
* **フォルダ内の使用していないファイルを削除**

を選択します。**バックアップがちゃんと取ってあることを確認して**、実行ボタンを押します。すると、残響を残したいファイルだけが存在するフォルダが出来上がりました。これを**(AAAA)**とします。

![変換ウィザード](https://qiita-image-store.s3.amazonaws.com/0/78152/21858d09-b9dc-bf4a-1c3d-21968cbfb1b1.png)

次に、もう一度、最初のバックアップからwavをコピーしてきます。そして、**これらのファイルの残響をすべてカットします**。この作業にはMid2BMS最新版の**TailCutPlus**機能を使用します。（あるいはSoundEngineを使っても構いません。）パラメータを適当に設定して、フォルダごと雑にぶちこみます。末尾をカットし過ぎると、空気感（影が薄い感じという意味ではない）が損なわれてしまうので注意が必要です。**バックアップがちゃんと残っていることを確認して**、実行ボタンを押します。すると、残響が雑にカットされたファイルが出来上がります。

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/94d05770-0071-aff3-89f4-8d0879833f97.png)

| | おすすめの設定値 |
|---|:-:|
| しきい値 | -42dB |
| フェードアウトの長さ | 0.05秒 |

最後に、残響を残したファイル**(AAAA)**を、このフォルダにコピーしてきます。すると、必要な残響が残った一連のキー音が出来上がります。

確認のため、[**BMX2WAV**](http://childs.squares.net/program/bmx2wav/)を使って1本wavに変換し、変換前のwavと比較しておかしいところがないかどうかチェックしましょう。時間に余裕があれば、[**ABXテスト**](http://d.hatena.ne.jp/kamedo2/20111017/1318805121)をすると良いでしょう。多分しなくて良いと思いますが。

もしもおかしい箇所があれば、バックアップから元のwavを復元して、同様の方法を繰り返しましょう。

また、キー音をファイルサイズでソートして、長さがほぼ0のファイルが生成されていないかどうかチェックしましょう。そのような音はあるだけ無駄なので、BMSから削除するか、残響がカットされていない元のファイルを復元しましょう。

#(4) ファイルの形式を低品質なものにする（割とどうでもいい）

オーディオファイル(wavやoggなど)には、「チャンネル数」「ビット深度」「サンプリングレート」という3つの属性があります。まだ時間が少し残っていますので、最後に、これらそれぞれについて見てみましょう。

## チャンネル数
これは、主にステレオかモノラルかを決めるものです。**基本的にステレオで問題ありません。**が、完全に中央で鳴っていて、リバーブなどの効果もかかっていない音に関してはモノラルにしても良いでしょう。ただ、そのような音色は少ないでしょう。リバーブの掛かっているような音をモノラルにしてしまうと、空気感が損なわれてしまうことに注意してください。

## ビット深度
主に 8bit, 16bit, 24bit, 32bit の4種類があり、数字が大きくなるほど高品質です。ですが、16bitを超えるものでは、通常のゲーム音楽用のファイルとしては高品質すぎるものとなっています。そこで、まず8bitか16bitのどちらかに絞られます。

さて、8bitというのは意外と悪い音質ではありません。実際、過去にはすべてのwavを8bitにするというようなことも行われていました。ところが、ogg vorbisは8bitには対応していません。つまり、oggを使用するのであれば**必然的に16bitを使うことになります。**

## サンプリングレート
主に、11025Hz, 22050Hz, 44100Hz, 48000Hz の4種類があり、これ以外にも多くの代表的な値があります。ですが、44100Hz以上のものは、一般的なゲーム用の音声として使用する上では聴覚上の違いはそれほど大きくありません。（←諸説あるそうです。）従って、恐らく最初の3つのどれかに絞られます。数字が大きいほど高品質になるため、**基本的には44100Hz (44kHz) を使用します。**

もし、少しでもファイルサイズを小さくしたいのであれば、44100Hzより小さいサンプリングレートを使用することができます。

サンプリングレートが小さい場合、高周波成分が失われてしまいます。高周波数は高い音に多く含まれています。逆に言うと、**低い音は低いサンプリングレートでも問題がない**ことが多いということです。一例として次のようになりますが、音色に大きく依存するので、この表はあまり当てにならないと思います。

| サンプリングレート | 適している音色 |
|:-:|:-:|
| 44100Hz | ハイハット、ベル、その他大多数 |
| 22050Hz以上 | ストリングス、スネア |
| 11025Hz以上 | ベース、バスドラム、カットオフ周波数の低いシンセ音 |

うまくやれば、音質を悪くせずにファイルサイズを10%くらい削れるかもしれません。

# さいごに

どすこい