注:この記事は書きかけです。
BMSの仕様について書いたページです。記事作成にあたってhitkey氏のBMS Command Memoを大いに参考にさせていただきました。
BMSの仕様について解説するページであり、BMS作成講座とは区別をつけていますのでその点はご了承ください。
BMSの仕様について解説するページであり、BMS作成講座とは区別をつけていますのでその点はご了承ください。
基本
BMSは主に、
- BMSファイル(〜.bms、〜.bme、〜.bmlなど)
- 音声データ(〜.wavまたは〜.oggファイルの集まり)
- BGAデータ(〜.bmpや〜.pngなどの画像データの集まりか、あるいは〜.mpegなどの映像データ)
からなる。だいたいの場合、これらのデータは一つのフォルダにまとめられ、「BMSをダウンロードする」「BMSを発表する」などといったらこのフォルダ単位で扱われる。中には3.が無くて演奏データだけだったり、2.が無くてBGAデータだけだったり、1.2.3.に加えてテキストファイル(Readme)が同梱されているものも普通にあるが、BMSプレーヤー側が「BMSデータ」と認識して読み込むのは基本的にこの3つである。
BMSファイルはおおよそ次のような要素から構成されている。
*---------------------- HEADER FIELD #PLAYER 1 #GENRE Trance ・・・ #TOTAL 400 %URL #WAV01 kick1.wav #WAV02 vocal1.wav ・・・ #WAVF7 bgm5.wav #BMP01 white.bmp #BMP02 aa.bmp ・・・ #BMPFF fin.bmp *---------------------- MAIN DATA FIELD #00101:4F #00104:0102030401020304 #00111:01010101 ・・・ #07115:D2
- 行頭に必ず書く記号は#、%、*の3種類。
- このうち最も重要なのが#から始まるコマンド。ヘッダや譜面データを記述するのに使われる。
- %から始まるコマンドはBMSデータと直接関係はないが、作者のサイトやアドレスを補足するのに使われる。
- *から始まる文はコメントと見なされ、BMSの実データとして読み込まれない。
- #PLAYERや#WAV??などは「ヘッダ」と呼ばれるデータで、主にBMSに関する基本的な情報(曲タイトルやBPMなど)を設定したり、プレーヤー上で使用する音声ファイルやBGAファイルを指定したりする。
- #00101:〜などの文字列はメインデータで、実際の譜面データが記録されており、プレーヤーはこのデータに沿って音を鳴らしたりノーツを配置したりBGA画像を表示したりする。
BMSプレーヤーが実際の譜面データを読み込むおおまかな流れとしては、
#WAV01 kick1.wav
でプレーヤーに「kick1.wavを『データ01』として扱うんだな」と認識させ、
#00111:01010101
でプレーヤーに「1小節目で一番左端の白鍵盤のレーンにデータ01(つまりkick1.wav)が鳴るオブジェを4分音符の間隔で4つ落とせ」と命令している。
(文字で説明するより見たほうが早いんだけど、それっぽい画像が見つからないので誰か用意してくださいorz)
(文字で説明するより見たほうが早いんだけど、それっぽい画像が見つからないので誰か用意してくださいorz)
BMSファイルには幾つかの形式がある。基本はどれも上に示したような書き方だが、使えるコマンドやチャンネル(メインデータの項で解説)が増えているのでそれぞれ別の項目として解説していこうと思う。
BMS
ファイル形式は〜.bms。やねうらお氏が開発したフォーマットであり、最初に作られたBMS形式である。
ヘッダ
ヘッダに記述するデータ。"#コマンド パラメータ"の形で書く。
#PLAYER
プレイヤー数(プレイスタイル)を指定する。
- 1〜4の数字を指定する。数字の意味は以下のとおり
- 1:シングルプレイ
- 2:カップルプレイ
- 3:ダブルプレイ
- 4:バトルプレイ
例)
#PLAYER 1
- 省略(何も書かない)時は#PLAYER 1(シングルプレイ)とみなされる。
#GENRE
曲のジャンル名を文字列で指定する。
例)
例)
#GENRE HIPHOP
- 省略時は空白になる。
#TITLE
曲のタイトル名を文字列で指定する。
例)
例)
#TITLE cruse
#ARTIST
作曲者名を文字列で指定する。
例)
例)
#ARTIST gomd
#BPM
曲のテンポの速さを数字で指定する。
例)
例)
#BPM 120
- 省略時は#BPM 130と見なされる。(ナナシグルーヴでは150)
#PLAYLEVEL
難易度を数字で指定する。
例)
例)
#PLAYLEVEL 5
- 省略時は#PLAYLEVEL 3とみなされる。
- 0を指定することも可能。その場合プレーヤーによっては「?」と表示される。
#RANK
判定の辛さを数字で指定する。
- 0〜4の数字で指定
- 0:veryhard
- 1:hard
- 2:normal
- 3:easy
- 4:very easy
例)
#RANK 3
- あくまでも相対的な辛さであり、同じRANKでもプレーヤーによって実際の判定は変わってくる。
#VOLWAV
BMS全体の音量の大きさを数字で指定する。
- 単位は%。
例)元の音量の150%(1.5倍)の大きさにする
#VOLWAV 150
#TOTAL
ゲージの増加のしやすさを数字で指定する。
- 設定した値=「全ノーツで最も良い判定を取った時のゲージの増加量」になる。
- 数字が大きいほどゲージの増加量が大きくなる。
例)
#TOTAL 300
- 省略時にもTOTALは割り当てられるが、その値はプレーヤーによって異なる。
- TOTAL値を設定してもプレーヤー側のゲージ増加量の計算のしかたが違えば、当然ゲージの増加量はプレーヤーによって変わってくる。再現性を考えるなら「△△のプレイヤー推奨」とか書くのがいいかも。
#WAV??
音声ファイル定義。繰り返し使う。
- ?には0〜9、A〜Fまでの文字を1つ入れる。ただし00は使えない。
- パラメータには音声ファイルの名前.wavを指定する。
- 実際のファイルの拡張子が.oggでも定義では.wavを使用する。なぜこのような仕様になっているのかは謎。というか誰か教えて下さい。
例)データ01にkick1.wavを指定
#WAV01 kick1.wav
- データ(01)と音声ファイル(kick1.wav)は1対1に対応しており、1つのデータに複数の音声ファイルを定義することはできない。
#WAV01 kick1.wav #WAV01 bass1.wav (データがかぶるのでダメ) #WAV02 bass1.wav (番号を変えればOK)
- データは01〜FFなので、使える音声定義は最大で255となる。つまり最大255個の音声ファイルを扱える。
- 拡張版では01〜FZ(575個)あるいは01〜ZZ(1295個)まで定義できるようになった。
- 指定した音声ファイルはBMSファイルと同じディレクトリ(フォルダ)内に置かないと読み込めない。指定した音声ファイルが見つからない場合は音の鳴らないデータとなる。(プレーヤーによって違う?要検証)
- メインデータの項目を見ればわかると思うが、#WAV00はオブジェ間の空白を表すものとなるため使えない。
#MIDIFILE
MIDIファイルをBGMとして指定する。
例)
例)
#MIDIFILE bgm.mid
- 現在はほとんど使われていない。
#BMP??
BGAに使う画像ファイル定義。繰り返し使う。
- ?には0〜9、A〜Fまでの文字を1つ入れる。
- パラメータには画像ファイルの名前.bmpを指定する。
- 実際のファイルの拡張子が.pngだろうが.jpegだろうが定義では.bmpを使用する。なぜこのような仕様になっているのかは謎。というか誰か教えて下さい。
例)データ01に画像ファイルwhite.bmpを指定
#BMP01 white.bmp
- #BMP00にはミスレイヤー(プレイ中にミスした時に表示する画像)を指定する。(#WAV00と違うとこ)
- 使えるデータは00〜FFの256個(拡張版では00〜FZ、00〜ZZまで)
- 指定した画像ファイルはBMSファイルと同じディレクトリ(フォルダ)内に置く必要がある。
- BGAを使わないのであれば定義しなくてよい。まるごととばしてもOK
メインデータ
譜面にオブジェを配置したり、小節線の長さを決めたりするデータ。"#XXXYY:パラメータ"の形で書く。ヘッダと違い":"記号が間に入るので注意。
- XXX:何小節目のデータかを数字3ケタで指定する。
- YY:「チャンネル」と呼ばれる、パラメータの役割を決める2ケタの数字(拡張版ではアルファベットも含む)を指定する。
- 01:BGM(自動的に再生する音データ)を配置する
- 02:1小節の長さを変える
- 03:BPMを変える。(BPM1〜255まで)
- 04:BGA(真ん中で動いてるパラパラアニメのやつ)を配置する
- 05:オブジェ(譜面で上から降ってくるやつ)の画像を変更する
- 06:ミスレイヤー(POOR判定時に出てくる画像のこと)を変更する
- 07:スプライト画像(BGAの上に重ねて表示する)を配置する。
- 11〜17:シングルプレイ時に各レーンに降ってくるオブジェを配置する(ダブルプレイでは左側のレーン)
- 21〜27:ダブルプレイ時に右側の各レーンに降ってくるオブジェを配置する
- パラメータ:チャンネルによって書くことが変わったりするが、基本的にはヘッダの#WAV??や#BMP??で定義したデータをすきまなく書き並べる。
例)1小節目、左端の鍵盤にデータ01、02、A7、05を4分間隔で配置する
#00111:0102A705
- パラメータのデータの数がn個のとき、配置はn分音符の間隔になると考えてよい。
#00111:0101010101010101
この場合は8分間隔(縦連打に近い)になり、
#00111:010101010101
この場合は6分間隔(跳ねリズム)になる。
- データを何も置かない部分(休符)は00として表現できる。
#00111:0101010001010100
この場合は三連打が2回降ってくる。"01 01 01 00 01 01 01 00"と分けて考えれば多少把握しやすくなると思う。
小節を増やしたい場合は順次#00211:〜、#00311:〜と書いていけばよい。また他の鍵盤にオブジェを置いたりBGMを設定する場合は#00112:〜、#00101:〜といった感じで追加する。メインデータではこれら3要素を組み合わせて譜面を作っていく。
#00101:01 #00111:0000000000000000000000000000001A #00113:00000000000J0K1M #00114:0000000000000I0000000000000L0000 #00115:0H #00212:0O2Q0000 #00214:000P000R00000000 #00216:0000001S ・・・
まるごとデータがないとそのチャンネルは空白として扱われる。例えば上記のデータでは#00211:〜がないので左端の鍵盤には2小節目は何も降ってこないことになる。
参考リンク
BMS Command Memo:(短縮URL)
BMS形式(音ゲー作成マニュアル):http://www.charatsoft.com/develop/otogema/page/04bms/bms.htm
wiki.bms.ms(WebArchive):http://web.archive.org/web/20070619021620/http://wiki.bms.ms/Bms:Format
BMS関連資料:http://unhappyangel.tripod.com/bms/
BMS制作のすすめ:http://www9.atwiki.jp/coolnaurl/
BMS形式(音ゲー作成マニュアル):http://www.charatsoft.com/develop/otogema/page/04bms/bms.htm
wiki.bms.ms(WebArchive):http://web.archive.org/web/20070619021620/http://wiki.bms.ms/Bms:Format
BMS関連資料:http://unhappyangel.tripod.com/bms/
BMS制作のすすめ:http://www9.atwiki.jp/coolnaurl/
コメント欄
- とりあえず今普及している形式の一通りのヘッダと実データについて書く予定です。 -- (編集者) 2015-08-18 14:21:13
- #WAV??と#BMP??で指定するファイルの拡張子について追加 -- (名無しさん) 2015-08-27 15:02:22