「BMSについて」の編集履歴(バックアップ)一覧に戻る

BMSについて - (2021/05/24 (月) 15:34:06) のソース

 「BMSとは何か」というレベルの解説はしません。
ここではBMSを作るにあたって知っておく必要のある、BMSの仕様をいくつか書いておきます。

BMSの規格仕様については[[このサイト>http://hitkey.nekokan.dyndns.info/cmdsJP.htm]]で深く考察されており、このページでもこのサイトからいくつか引用しています。もし興味があればご一読ください。

 BMSでは&bold(){コマンド}((上のサイトに倣って。一般的にそう呼ばれるかは知りません))によって記述された一連の命令を1行とし、それを連ねることでBMS全体を構成します。
コマンド行は必ずシャープ&bold(){#}で開始し、以下の文法を取ります:
 #COMMAND␣contents
COMMANDで表されるのがコマンド部、半角スペース1個を開けて記述されたcontentsがその中身となります。たとえばタイトル定義は次のように書きます:
 #TITLE たのしいピクニック
"#"で始まらない全ての行はコメント行として解釈され、BMSの再生には影響しません。おそらく#を含まなければBMS内にアスキーアートを入れ込むことも可能ですが、予期せぬエラーを招きかねないので、やめたほうがよいでしょう。

以下に、重要なコマンドを列挙します。&bold(){列挙されないコマンドは、BMSEを使って制作する限り気にする必要はありません}。

#contents

----

**#PLAYER
 1がSP譜面、2がCP(カップルプレイ)譜面、3がDP譜面、4がバトル譜面を表しますが、ほとんど死にコマンドとなっており、SP譜面なら1、DP譜面なら3にするという決まりくらいしか現在は残っていません。
LR2に至っては実際に使われているレーンによってSPかDPかを判断するため、完全に無視されるコマンドになっています。しかし例えばBMSEではDP譜面を作る場合にここを変更する必要があるので、ちゃんと設定したほうがよいでしょう。
カップル(#PLAYER 2)とバトル(#PLAYER 4)はBMSプレイヤー側で表現可能かつそのほうが都合がいいため、&bold(){使ってはいけません}。BMSEでいえば2 Player&bold(){ではなく}double playにしましょう。

**#RANK
 譜面の&bold(){判定の}種類です。GREAT判定の幅が、0でVERY HARD(とても狭い)、3でEASY(とても広い)となります。名前からすればNORMAL判定(#RANK 2)が標準に思われますが、昨今のBMS界隈ではEASY(#RANK 3)が多いようです。BMSEで空のファイルを開くとデフォルトでEASY判定にされているのが大きな要因に思われます。
いわゆる発狂BMSなどの&bold(){ノーツが非常に多い譜面}でHARD(#RANK 2)以上の判定を利用することは&bold(){推奨しません}。高密度譜面は正確に演奏するよりは降ってくるオブジェを余すところ無く叩くのが目的であり、そこに辛判定を導入するととたんにクソゲーと化すでしょう。逆に、密度は低いがクセのあるリズムであったり、連打を頻繁に叩かせるような譜面では、EASY判定ではその譜面の難しさを十分に表現できない場合もあり、VERY HARD(#RANK 0)が歓迎される傾向にあるかもしれません。

**#GENRE
**#TITLE
**#ARTIST
 上からBMSのジャンル名、タイトル、アーティスト名を表します。ジャンルは省略してもよさそうですが、タイトルとアーティストは&bold(){必ず}入力するべきです。

**#SUBTITLE
**#SUBARTIST
 こちらは後期になって&bold(){拡張された}コマンドです。前者はサブタイトルを、後者はサブアーティスト(作曲者に対して譜面作者やBGA作者など)を記述するためのコマンドです。LR2の曲決定画面ではSUB情報は表示されません。
LR2では#TITLEに特定の文字が含まれるときそれをサブタイトルとして扱う仕様があります。それを積極的に利用するなら#SUBTITLEは必要ないかもしれません。
BMSEではどちらも拡張命令として扱われるので、利用するなら直接テキストに打ち込む必要があります。

**#COMMENT
 BMSに対するコメントです。「ひとつの ものごとに とらわれると すべてを みうしなってしまう にゃ」みたいなやつです。
もっぱらPMSについて使います。ふぃーりんぐぽみゅなど一部のPMS特化型本体で使われるに留まります。LR2では一切参照されず、BMSEでも拡張命令扱いです。当wikiはBMS制作に関する解説サイトですが、PMSも同様の手順で作れるということで一応載せておきます。

**#BPM
 楽曲の&bold(){開始前の}テンポを記述します。途中でテンポを変化させるような命令が無ければ曲は最初から最後までこのテンポで演奏されます。曲構成の根本的な部分なので&bold(){必ず}入力するべきです。

**#PLAYLEVEL
 譜面の難易度です。一般的に5keyなら8、7keyなら12、9buttonなら50が上限とされています。BMSEでこの欄をプルダウンボックスから選ぼうとすると1から8と0しかないので直接数値を入れたほうがよいでしょう。レベル0は基本的に「難度判定不能」を意味し、&bold(){1よりも簡単という意味にはなりません}。レベル0はレベルソートで最初にくるため、筆者としては&bold(){できるだけ}利用しないことを推奨します。
例えば7keyで12以下の難易度を付けるなら、なるべく"本家"の基準に則ったほうがよいでしょう。設定された数字と実際の難易度があまりにかけ離れているとBMSイベントでは減点の対象になることがあります。

**#DIFFICULTY
 譜面の種類(NORMAL,ANOTHERなど)を&bold(){数値で}記述します。&bold(){普通は}1から5までの整数で、1がビギナー譜面、5が最も難しい(いわゆる黒穴)譜面を示します。省略することもできますが、BMSプレイヤーがその譜面をどの種類と判定するのか分かりづらくなり、譜面作者の意図しない位置に置かれる可能性もあるため、特別な理由が無い限り記述することを推奨します。
BMSEでは拡張命令扱いであり、自分でテキスト上に書き込む必要があるため、もしかしたらこのコマンドに気づかない人もいるかもしれません。
LR2でレベルソートを行う場合、#DIFFICULTY 5の譜面は&bold(){レベル値に関係なく最後に置かれます}。例えばレベル10のノーマル(#DIFFICULTY 2)譜面、レベル5のアナザー(#DIFFICULTY 4)譜面、そしてレベル2の黒穴(#DIFFICULTY 5)譜面が用意されていた場合、LR2でレベルソートを行うとまずレベル5の譜面が最初に置かれ、次にレベル10の譜面、レベル2の譜面は最後に置かれます。
前述の&bold(){#PLAYLEVEL 0}を使いたい場合、併せて&bold(){#DIFFICULTY 5}としておくことで、その譜面がレベルソートで最初に(レベル1の譜面よりも前に)来ることを防ぐことができます。
"#DIFFICULTY 0"の場合&bold(){難易度未定義}になります。LR2では難易度フィルタ(NORMALだけ表示、HYPERだけ表示など)を使ったとき表示されず、レベルの色は灰色になります(スキンによっては表示されません)。隠し譜面には使えるかもしれません。

**#TOTAL
 演奏レーンに置かれたノーツを全て最高の判定(P.GREAT)で処理した場合に増加するグルーブゲージの量です。
設定しないとゲージが回復できなかったり、簡単になりすぎたり、プレイヤーによってえらく変わってしまうため、&bold(){必ず}記述するべきコマンドです。BMSEでは「拡張」タブにあるのでしっかり確認しましょう。
どれくらいのTOTALが妥当かというのは、少々難しい問題ですので、実際に自分でプレイしてみてちょうどいい値を見つけたり、&s(){[[ここ>http://2nd.geocities.jp/yoshi_65c816/bms/LR2.html]]とか[[ここ>http://www.geocities.jp/aurora_totalnotes1280/data/9key/gauge/gauge.html]]とかを参考にしてみてください。}geocities閉鎖に伴い参照できなくなったため筆者が使っている計算式を下に書いておきます。
 TOTAL = INT(760.5×NOTES÷(NOTES+650))
 計算の結果 TOTAL < 260 になった場合は TOTAL = 260
INTは小数点以下切り捨てという意味です。
この計算式だとノート数に対するTOTAL値は以下のようになります。
|CENTER:NOTES|CENTER:TOTAL|
|CENTER:<=339|CENTER:260|
|CENTER:500|CENTER:330|
|CENTER:1000|CENTER:460|
|CENTER:1500|CENTER:530|
|CENTER:2000|CENTER:573|
この式は主に2000ノーツ以下の譜面に対してはある程度うまく働きますが、それを大きく超える場合はノート数の増加に対してTOTALの伸びが鈍すぎるため、適宜増やしたほうがよいです。
#html2(){
<input id="number_input" type="number" min="0" max="999999" value="1000"/>
<button id="number_button" >計算</button>
<output id="number_output" value="">
}
#javascript(){{
(() => {
  const onClickButton = function(){
    const input = document.getElementById("number_input");
    const val = Number(input.value);
    const output = document.getElementById("number_output");
    const value = Math.floor(760.5 * val / (val + 650));
    output.value = (value <= 260) ? 260 : value;
  };
  const button = document.getElementById("number_button");
  button.onclick = () => onClickButton();
  })();
}}

**#STAGEFILE
 主に曲決定画面で表示される大きな一枚絵(普通は640*480)の定義です。無くても構いませんが、あったほうが選曲時の期待度が高まりそうな気がします。BGAがあるなら用意したほうが無難でしょう。記述するのはファイル名ですから、当然.pngや.bmpといった拡張子が必要です。

**#BACKBMP
 本来はPMSなどのプレイ画面の背景として用意する画像ですが、役割がSTAGEFILEと被っていたり、7keyなどではBGAがメインだったりであまり使われないコマンドです。
&bold(){[[RED BELT>http://www.geocities.jp/red_without_right_stick/rb.html]]}というLR2の拡張スキンでは使われなくなったこのコマンドを&bold(){プレイ前に表示されるタイトル画像}として利用しています。特殊なフォントを使ったり、タイトルの代わりに絵を表示したい場合などに利用できます。その用途については[[こちら>http://www.geocities.jp/red_without_right_stick/backbmp/]]を参照してください。

**#BANNER
 主に選曲画面で使われる楽曲のバナー画像の定義です。前述のRED BELTでは選曲画面にバナーも表示しますし、LR2標準の選曲スキンでも有効だったと思います。STAGEFILE同様無くても構いませんが、あれば曲の雰囲気をより伝えやすくなります。
BACKBMPともどもBMSEでは拡張命令扱いなので、テキストに直接書き込む必要があります。

**#CHARFILE
 ふぃーりんぐぽみゅなど一部のBMSプレイヤーで使われる、キャラクターファイル(.chp)を指定するためのコマンドです。作り方を簡潔にまとめたサイトがあったと思うのですが、今探したところ見当たりません。残念。

**#WAVxx
&image(migigawa2.png,right,float)
 音声ファイルの定義です。BMSの譜面は実際には定義情報の羅列であり、BMSプレイヤーはそれを読み取って対応するインデックスの音声を再生することで意図した音楽を構成します。&bold(){もちろん必須}ですが、BMSEでは画面右側にある定義リストに、エクスプローラーから音声ファイルをD&Dすることで自動的に記述してくれますし、BMHelperなどを使う場合も定義リストは自動で生成してくれるので、今や自分で手打ちする必要はほとんどありません。
存在しないファイル名を指定すると(少なくともLR2は)単に無視します。無音ノートを使う場合に「#WAVZZ muon」などと定義してそれを使うようにすれば、あるいは分かりやすいかもしれません。
以降の全てを含む定義情報は、一般的に01からZZまでの36進数で表されます(00は空白)。したがって、現在のBMS規格仕様では&bold(){1295個}が定義数の上限となり、数が増えがちなWAVは特に注意する必要があります。

**#BMPxx
**#BGAxx
 BGA表示用の画像(映像)ファイル定義です。こちらもBMSEではD&Dでまとめて定義できるので直接入力の必要はあまりありません。
昨今ではBGAを1本の動画にして、せいぜいミスレイヤーを追加するくらいが多く、この定義欄が埋まる事態は起きにくくなっているかと思います。
"#BGA"は使い方が複雑なので、必要なら[[こちら>http://hitkey.nekokan.dyndns.info/bmse_help_full/200951205347656.shtml]]を参照してください。動画BGAが主流になった現在ではまず使われないコマンドです。

**#BPMxx
 8ビット整数で表記できないBPMを使うときに利用する定義です。BMSEでは設定されたBPMが1~255の範囲外である場合に自動的に追加されます。
ある小節で1000bpmになったあと、一旦150bpmになり、そのあとまた1000bpmになるようなテンポ変化の場合、&bold(){#BPM01 1000}のような定義を使い回せばいいと感じますが、&bold(){BMSEでは全て別扱い}になります。頻繁にテンポ変化が行われる曲の場合、実質的に256以上や小数テンポへの変化は1295回までに制限されますのでご注意下さい。テンポ変化を直接書き込む場合はこの限りではありません。

**#LNOBJ
 ロングノートの&bold(){終端}を表す定義インデックス(ZXなど)を書きます。
BMSには2種類のロングノート定義が存在します。&bold(){詳細は割愛します}が、バグ回避や付け外しの容易さもあって、筆者はもう一方の方式よりこちらを推奨します。ただし、#WAV定義を無駄に一つ潰す必要があるため、定義数がギリギリの楽曲においてはもう一方の方式を採用せざるを得ない状況になる場合もあります。詳細は[[譜面制作]]のロングノート節を参照してください。

**#RANDOM
**#IF
 &bold(){不確定性の音楽を生み出す命令}です。#RANDOM x(1以上の整数)で1からその数までの&bold(){乱数}を生成し、#IF x(1以上の整数)でそれぞれの場合に解釈する命令を記述します。これについて詳細に解説するのは&bold(){筆者の手には余る}ので、もし使いたければ[[ここ>http://hitkey.nekokan.dyndns.info/cmdsJP.htm#RANDOM]]などを参照してください。
筆者の知る限り#RANDOMを正常に扱えるエディターは存在しません。もし使うのであればテキストエディタで直接編集する必要がありますが、この世には[[たくさんの驚異的なRANDOM BMS>http://hitkey.nekokan.dyndns.info/randombms.htm]]が存在します。
&bold(){当wikiではこれ以上触れません}。

----

次:[[作曲]]