注:この記事は書きかけです。

BMSの仕様について書いたページです。記事作成にあたってhitkey氏のBMS Command Memoを大いに参考にさせていただきました。
BMSの仕様について解説するページであり、BMS作成講座とは区別をつけていますのでその点はご了承ください。

基本

BMSは主に、
  1. BMSファイル(〜.bms、〜.bme、〜.bmlなど)
  2. 音声データ(〜.wavまたは〜.oggファイルの集まり)
  3. 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)

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小節目は何も降ってこないことになる。


参考リンク


コメント欄

  • とりあえず今普及している形式の一通りのヘッダと実データについて書く予定です。 -- (編集者) 2015-08-18 14:21:13
  • #WAV??と#BMP??で指定するファイルの拡張子について追加 -- (名無しさん) 2015-08-27 15:02:22
名前:
コメント:

すべてのコメントを見る