サポートするBMS仕様

gomachan_7 edited this page Apr 30, 2017 · 9 revisions

基本方針

LunaticRave2 を基準として取捨する。その上でサポートの必要性を感じた仕様については採用する。本BMSプレイヤーが仕様を独自拡張するようなことは極力しない。

Header

command value/type/range memo
#PLAYER 整数[1-4] 1はSP,3はDP。それ以外は3として解釈。デフォルトの挙動は自動解釈。
#RANK 整数[0-3] 0:VERY HARD, 1:HARD, 2:NORMAL, 3:EASY。 デフォルト値は3。
#TOTAL 整数[>0] デフォルト値はひとまず200。
#STAGEFILE ファイルネーム 文字列 640x480 の画像ファイル スプラッシュイメージ 省略可能
#BANNER ファイルネーム 文字列 300x80 の画像ファイル 選曲画面で表示する 省略可能
#PLAYLEVEL 整数[>=0] デフォルトは 3
#DIFFICULTY 整数値[1-5] 1:BEGINNER, 2:NORMAL, 3:HYPER, 4:ANOTHER, 5:BLACK ANOTHER
#TITLE 文字列 タイトル。デフォルト値はファイル名。
#SUBTITLE 文字列 省略可能
#ARTIST 文字列 省略可能
#SUBARTIST 文字列 省略可能。複数定義した場合は最後の値を採用。
#GENRE 文字列 省略可能
#BPM 実数値 省略または負数指定時にはデフォルト値 130.0
#BPM[01-ZZ] 整数値[>0] 負数は無視する
#EXBPM[01-ZZ] 整数値[>0] 負数は無視する。#BPMXXと同一視して利用。
#STOP[01-ZZ] 整数値[>0] 負数は無視する。また小数は整数値に丸める。1192分音符 に相当
#LNOBJ 36進数値 ロングノートの終端部分を表現する。 #WAVXXのXX部分を指定する。#WAVXXが定義されている必要はない。 終端を示すノートの1つ手前のノートがLNになるため,専用チャンネルを指定しなくともLNを表現可能になる。
#WAV00 文字列 ファイル名 地雷用音声ファイル
#WAV[01-ZZ] 文字列 ファイル名 通常ノート用音声ファイル wav,ogg,mp3など
#BMP00 文字列 ファイル名 ミス用レイヤーイメージ
#BMP[01-ZZ] 文字列 ファイル名 通常のBGAに利用する画像ファイル。png,bmp,jpg,mpgなど

Control flow

#RANDOM n, #IF nコマンドのネストはサポートしないものとしする。(未定義の挙動)

command value/type/range memo
#RANDOM n 整数[>0] ランダムな整数を生成し保存する。続く #IF nにおける条件分岐に利用する。
#IF n 整数[>0] このコマンドから次に現れる#ENDIFまでを1つのブロックとしてみなす。直前に評価した#RANDOM nの値を参照し,nの値が一致していたらブロックを通常通り評価する。 一致していないときはブロック内の命令を評価せずスルーする。
#ENDIF なし #IF nとともにブロックを表現する。

Channel

number 意味 value/type/range memo
01 BGMを再生する 36進数 #WAVXXXX部分を指定
02 該当小節の長さを変更する 実数(>0) 0.5を指定するとその小節は2/4拍子相当の長さに変わる
03 BPMを変更する 16進数[01-FF]
04 ベースとなるBGAを表示する 36進数[00-ZZ] #BMPXXXX部分を指定
06 POOR時に表示する画像を変更する 36進数[00-ZZ] #BMPXXXX部分を指定。 デフォルトでは#BMP00が有効になっている。
07 レイヤーイメージを表示する 36進数[00-ZZ] #BMPXXXX部分を指定
08 BPMを変更する(exBPM仕様) 36進数[00-ZZ] #BPMXX または #BPMXXXX部分を指定
09 指定した長さだけ譜面の再生を止める 36進数[00-ZZ] #STOPXXXX部分を指定。
11-1Z 1P側可視ノート 36進数[00-ZZ] #WAVXXXX部分を指定。
21-2Z 2P側可視ノート 36進数[00-ZZ] #WAVXXXX部分を指定。
31-3Z 1P側不可視ノート 36進数[00-ZZ] #WAVXXXX部分を指定。
41-4Z 2P側不可視ノート 36進数[00-ZZ] #WAVXXXX部分を指定。
51-5Z 1P側ロングノート 36進数[00-ZZ] #WAVXXXX部分を指定。
61-6Z 2P側ロングノート 36進数[00-ZZ] #WAVXXXX部分を指定。

1P側

Scratch key1 key2 key3 key4 key5 key6 key7
可視ノート 16 11 12 13 14 15 18 19
不可視ノート 36 31 32 33 34 35 38 39
ロングノート 56 51 52 53 54 55 58 59

2P側

key1 key2 key3 key4 key5 key6 key7 Scratch
可視ノート 21 22 23 24 25 28 29 26
不可視ノート 41 42 43 44 45 48 49 46
ロングノート 61 62 63 64 65 68 69 66

その他仕様メモ

実装に関する方針メモ

  • コマンドを評価する下処理として,行頭及び行末の半角スペース,全角スペース,タブ文字の削除を試みる。
  • 値に文字列が期待されていないコマンドの場合はコマンド部分抽出後,半角スペース,全角スペース,タブ文字の削除を試みる。以下のコマンドは正常に評価される。
#00121:  FFFFFF  OOOOOO  OOOOOO  NNNNNN
#00122:  FF      OO  OO  OO  OO  NN  NN
#00123:  FFFFFF  OO  OO  OO  OO  NN  NN
#00124:  FF      OO  OO  OO  OO  NN  NN
#00125:  FF      OOOOOO  OOOOOO  NN  NN
  • 期待される範囲を逸脱した値や文字数をもつコマンドは無視し,読み飛ばす。
  • 譜面データのNormal, Hyper, Anotherの判定は#DIFFICULTY以外に,ファイル名(ex:-normal,-n)や#PLAYLEVEL, 総ノート数をヒントにしている可能性がある。BMS譜面を覗くと定義されてたりされてなかったりするので,自力で分ける必要がありそう。

参考

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.