拍子タブ

小節ごとに拍子を指定できます。既定値は 4/4 拍子です。たとえば 9/4 拍子なら、その小節は 4 分音符 × 9 個分の長さを持ちます。

指定した拍子に応じて、メインパネル上に描画される小節の長さも変動します。これによって、変拍子を使用した譜面も視覚的・直感的に編集することができます。これは、全小節を同じ長さで表示する BMSC [http://tixlab.com/software/bmsc.shtml] (外部リンク)GDAC2 [https://www.asahi-net.or.jp/~nm4j-tyn/gdac2/] (外部リンク) とは異なります。どちらの表示方式にも一長一短ありますが、変拍子編集なら BMSE の独擅場です。(ちなみに iBMSC [https://hitkey.nekokan.dyndns.info/ibmsc_ja/] (外部リンク)μBMSC [https://github.com/zardoru/iBMSC/releases] (外部リンク) は両方式のハイブリッドです。)

拍子タブの操作

小節リストを左クリックするか、リストカーソルを移動させて、対象小節を選択します。選択した小節に対して、リストボックスから拍子を指定します。

拍子の分子は [1 から 64 までの正整数]、分母は [4, 8, 16, 32, 64] から選択できます。分母を単位音符とし、分子をその個数とします。BMSE 上から指定できる拍子の最小は 1/64 で、最大は 64/4 です。

HomeEndPage UpPage Down方向キーも使用できます。

入力ボタン を押すと、リストボックスから選択された値が、小節リスト上の選択された状態にある小節すべてに対して入力されます。このときメインパネルが再描画され、指定された小節の長さが変更されます。

拍子の変更操作は “元に戻す/やり直し” が可能です (ただし過信は禁物)。

左ドラッグなどで複数の小節を選択でき、それらへの 1 回の 入力 によって拍子を一括変更できます。

Ctrl + 左クリック 【選択状態反転】

選択アイテムを追加もしくは解除します。Ctrl 押下中は選択状態が保持され、この間にクリックした行は選択状態が反転します。

Shift + 左クリック 【範囲選択】

クリックした行までを選択します。Shift を押し込んだ時点でのリストカーソル位置が範囲選択始点となります。Shift 押下中は始点が固定され、Shift を離すまでの間に最後にクリックした行が範囲選択終点となります。[Shift + リストカーソル移動キー] でも複数行選択が可能です。

全選択ボタン 押下、または小節リストのどこかを左ダブルクリック

#000#999 を選択します。ただし全小節を選択して拍子を一括変更すると、nBMplay・BMEV・DDR・rhythm-it!・nazobmplay・charatbeatHDX・BMIIDXView2015・Angolmois は #999 が過ぎ去るまでリザルト画面に移行しなくなります。(DDR は #998 までしか使えませんが)

この件に関して BMSE に責任はありませんが、互換性を重視するなら小節を全選択する機能は使わないでください。必要な区間のみを選択して拍子を変更してください。「譜面著者が意図した終端小節」から以降の区間は、すべて 4/4 拍子に戻してください。

拍子タブに関する注意点

  1. #983#999 のどこかの小節を、4/4 拍子より長くしている。
  2. メインパネルの現在位置#501 以降にしている。
  3. #983#999 のどこかの小節を、4/4 拍子より短くする。

前述の条件をすべて満たすと BMSE が強制終了します。このとき編集作業の一時バックアップファイルは生成されません。垂直スクロールバーに与えられる 16 小節分の終端マージンと関係がありそうですが、詳細は不明です。


オブジェクト配置済み小節の拍子を変更すると、配置が崩れる場合があります。

小節が伸びるとき、小節末尾位置にスペースが挿入されます。

小節が縮むとき、溢れた配置は後方に押し出されます。押し出された位置にも既にオブジェクトがあった場合、「より最近に編集したほうのオブジェクト」が前面に重なります

重なる位置のどちらのオブジェクトも編集履歴にない場合、後方小節側のオブジェクトが前面に重なります

重なりを避けるには、あらかじめ空の小節を挿入し、それに対して拍子を指定してください。(その後で配置を移動してください。)


小節長について

【小節長 = 拍子分子 ÷ 拍子分母】 です。4/4 拍子 1 小節の長さを 1 としたとき、3/4 拍子は小節長 0.75 となります。8/4 拍子は小節長 2 となります。

BMS 書式上では、拍子は小節長として表されます (配置チャンネル #xxx02)。BMSE は、拍子として表現できる小節長のみを扱います。

#xxx02:n
  • #00002:0.75” なら、#000 小節は 3/4 拍子
  • #00102:2” なら、#001 小節は 8/4 拍子
  • 小節長チャンネルは、小節ごとに 1 文のみ解釈される (重複しない)
  • 小節長チャンネルは、小節ごとに適用される (効果は継続しない)
  • 小節長 1 のとき、その小節の小節長チャンネル文は省略できる

BMSC [http://tixlab.com/software/bmsc.shtml] (外部リンク)GDAC2 [https://www.asahi-net.or.jp/~nm4j-tyn/gdac2/] (外部リンク) における小節長を、BMSE は拍子という形で一元的に管理します。これによって視覚的・直感的な変拍子編集が可能になっている反面、「拍子として表現できない小節長」を BMSE は正しく扱えません。

  • BMSE は最小 1/64 拍子からを扱えます。小節長の値はすべて、64 分音符で割り切れる値に丸められます (【1 ÷ 64 = 0.015625】の倍数)。
  • BMSE は最大 64/4 拍子までを扱えます。16 以上の小節長は 16 になります。
  • BMSE は読み込み時に小節長の値を丸めたうえで配置データを解釈します。

このため、BMSC [http://tixlab.com/software/bmsc.shtml] (外部リンク)GDAC2 [https://www.asahi-net.or.jp/~nm4j-tyn/gdac2/] (外部リンク)iBMSC [https://hitkey.nekokan.dyndns.info/ibmsc_ja/] (外部リンク)μBMSC [https://github.com/zardoru/iBMSC/releases] (外部リンク) やテキスト編集などで作られた譜面の一部は、BMSE で開いたとき意図した譜面にならない場合があります。

例 1: 小節長 0.01 が 200 小節続く譜面

BMSE 上で、小節長 0.010.015625 に丸められます。この区間は丸め誤差 0.005625 が 200 小節分累積し、本来の長さより「8 分音符 × 9 個分」長くなるでしょう。

例 2: 小節長 32 を 8 等分する間隔でオブジェクトを配置している譜面

この小節は BMSE 上では「長さ 16 を 8 等分する間隔」になり、元の長さより「4/4 拍子における 16 小節分」短くなるでしょう。

小節長は曲の長さとほぼ同義です。BMSE で譜面を開く場合、曲が変わっていないか注意しなければなりませんBMSE で開いただけでは丸めの有無は判別できない場合が多いので、怪しい譜面は BMS コードを確認してください。

既存の譜面を編集したい場合は、対象譜面を BMSE で開く前にbms diff tool [https://stairway.sakura.ne.jp/smalltools/minibmsplay/diff.htm] (外部リンク) に 2 回ドラッグ・アンド・ドロップして「比較」してください。「BMSE で正しく編集できない譜面」ならその旨を警告してくれます。

BMSE の苦手分野について

BPM 120 で経過する 4/4 拍子小節と、BPM 240 で経過する 8/4 拍子小節の経過時間は同一です。「小節を 4 等分するオブジェクト配置」の鳴り方も同一です。譜面スクロール速度だけが異なります。

【BPM 対 小節長】の比の値を一定に保てば「曲を変えずに譜面スクロール速度のみを変更する演出」を実現できます。

たとえば先の例で、小節の経過時間を変更せずに、譜面スクロール速度のみを BPM 119 に変更したいなら、BPM と小節長の比 [120:1][119:0.991666…] に変更することで実現できます。BPM に 119 を指定し、小節長に 0.991666 を指定すればよいわけです。

BMSC [http://tixlab.com/software/bmsc.shtml] (外部リンク)GDAC2 [https://www.asahi-net.or.jp/~nm4j-tyn/gdac2/] (外部リンク)iBMSC [https://hitkey.nekokan.dyndns.info/ibmsc_ja/] (外部リンク)μBMSC [https://github.com/zardoru/iBMSC/releases] (外部リンク) では、「オブジェクトの配置間隔を変えないまま」小節長に自由な値を指定できます。したがって、「曲を変えずに譜面スクロール速度のみを変更する演出」は簡単に作ることができます。

一方 BMSE では、曲を変えずに譜面スクロール速度のみを変更する場合でも、オブジェクトの配置間隔も併せて変更する必要があります。しかし第一の難点として、BMSE は配置間隔を楽に変更する方法を持っていません。第二の難点として、小節長 0.991666 は BMSE 上では拍子として表現できない値なので、BMSE ではオブジェクトを正しい間隔で配置することができません。

BMS をテキストエディタなどで開いて小節長を直接変更すれば、それを BMSE で開くと配置間隔が適切に変更されたかのように見えます。しかし「64 分音符単位で割り切れない小節長」ならば、結局のところ配置間隔は狂います。

  1. たとえば BPM 119、小節長 0.991666 の譜面
  2. これを BMSE で開いて保存した結果
  3. さらに BMSE で開いて保存した結果

BMSE から見れば、長さ 0.991666 の小節は「64 分音符 (長さ 0.015625 ) × 63.46662 個分」です。これは最終的に「64 分音符 × 63個分」に丸められます。元々の「小節を 4 等分するリズム」も 63 等分リズムの型に嵌めざるをえませんが、割り切れないので誤差を最小化するために「189 個分の 192 分音符」が要請されます。189 ÷ 4 はやはり割り切れないので等間隔には配置されず、見て分かる程度に大きな誤差が発生します。

BMSE は仕様上、変拍子に強い反面、比の小節長を苦手としています。BMSE では比の演出を避けるか、配置間隔を変更しやすい倍率 (BPM 2 倍とか 1/2 倍とか) だけを指定するか、他のエディタやテキスト編集を利用してください。


なお Bemuse 拡張 #SCROLL[01-ZZ] [https://bemuse.ninja/project/docs/bms-extensions.html] (外部リンク) 定義を使えば、BMSE でも配置間隔を変更することなくスクロール速度のみを変更できます。たとえば BPM 120 の小節に対して、小節長ではなく #SCROLLxx の値として 2 を定義すれば BPM 240 相当で譜面がスクロールするようになり、値 0.991666 を定義すれば BPM 119 相当で譜面がスクロールします。

#SCROLL の値に 0 を指定すると #STOP をよりよく代替できます。スクロールそのものを実際に静止せしめるストップシーケンス定義とは異なり、停止中も音声や映像を任意のタイミングで再生できる点が強みです。

#SCROLL#SPEED は幸運にも「BMSE を通しても記述が残る拡張命令」です。チャンネル番号 #xxxSC は大文字で記述してください。

#SCROLL 対応機種
beatoraja (0.6.4+), Bemuse, Qwilight (1.4.21+), raindrop (0.300+), μBMSC (3.4.0.3+)

後述する画像#SCROLL に翻訳したサンプル譜面です。BMSE で開くと非常に単純な作りであることがおわかりいただけるでしょう。

ついでなので Bemuse 拡張 #SPEED[01-ZZ] についても解説します。これは指定した区間内のノート描画間隔をキーフレーム単位で変更します。「自動伸縮するハイスピードオプション」的な演出を得意とします。

曲の鳴り方を変えずに、一定の割合で徐々にノート間隔を開き、8 小節かけて元の 10 倍に広げる例を考えてみましょう。BPM と区間長さを同じ割合で伸ばしつつ足し合わせていく原始的な方法は、記述が大変です。変化率を抽出して #SCROLL に置き換えると劇的にすっきりしますが、各区間の変化率を逐一定義して配置するのはまだ面倒です。#SPEED なら始点と終点の割合・位置を指定するだけです (これは明示的な線形補完と等価です)。附録#SAMPLEBMS からこれらの例を確認できます。

小節長の値と、BMSE の小節長解釈に関するまとめ

0、文字列、空、省略時
小節長 1 (4/4 拍子) とみなす
負数や、0.015625 未満の値
0.015625 (1/64 拍子) とみなす
16 より大きい値
16 (64/4 拍子) とみなす
0.015625 の倍数でない値
直近の 0.015625 の倍数に丸める (循環小数になる場合あり)
有効数字 15 桁
たとえば小節長 0.032.60416666666667E-02 として解釈される
有効範囲 ±170.666…
絶対値が 170.666… を超えるとオーバーフローして強制終了する

拍子タブからは指定できない拍子

16 以下の、64 分音符で割り切れる小節長なら、編集可能です。たとえば BMS コードに #00002:1.015625 と記述すると、#00065/64 拍子になります。

拍子タブはこれを正しく表示できませんが、譜面の編集や保存は問題なく行えます。#00002:15.984375 なら、#0001023/64 拍子になります。

拍子を別の値に変更したうえで “元に戻す” と、これらの拍子も正しい値で表示されるようになります。(ステータスバーの拍子ナビゲーションには依然として下二桁しか表示されませんが)

  • 小節長はダイレクト入力枠からも直打ちできますが、表示が変になるうえ “やり直し” もできません。小節長に関しては譜面をテキストエディタなどで開いて編集するほうが安全です。

小節内での譜面スクロール速度変更は、一種の変拍子

たとえばこのサンプル譜面は、聴覚上は最初から最後まで一定速度の 4 分打ちとして再生されます。

(ただし、小節長に対応していない O2mania/O2play、および拡張 BPM 変更に対応していないいくつかの機種では、期待通りには再生されません。また、一部のソフトウェアの再生精度はあまり良くありません。)

鳴り方が等しいとき、小節内のある区間において、BPM が 2 倍になれば配置間隔も 2 倍になります。配置間隔が 1/48 になれば BPM も 1/48 になります。BPM が異なる区間それぞれの長さの合計が、その小節の長さとなります。

BMSE は、このタイプの演出なら BMSC [http://tixlab.com/software/bmsc.shtml] (外部リンク)GDAC2 [https://www.asahi-net.or.jp/~nm4j-tyn/gdac2/] (外部リンク) よりもはるかに手軽に行うことができます。各エディタの性質は以下の通りです。

  • BMSE は (おそらく beditor も) 小節長の足し引きに強い
  • BMSC や GDAC2 は小節長の比率操作に強い
  • iBMSC [https://hitkey.nekokan.dyndns.info/ibmsc_ja/] (外部リンク)μBMSC [https://github.com/zardoru/iBMSC/releases] (外部リンク) はどちらもこなせる
  • BMS コードを理解して直接編集できるなら、テキストエディタが最強

近年では、区間長の考え方を百歩も二百歩も押し進めたギミック譜面が空前絶後のスクロール芸を繰り広げています。テキスト直打ちなら、BMSE/iBMSC/μBMSC の制約から解き放たれた譜面を作ることもできます。

LunaticRave 2 の読み込み上限に抵触するほどに細分化された各区間の長さ [https://twitter.com/Bluvel/status/787171357746270208] (外部リンク)は、表計算ソフトウェアなどによって緻密に管理されます。譜面エディタでは編集不可能な極小のリズムによって、「スクロールが停止中であるにもかかわらず静止画がアニメーションする演出」などが実現されます。これは「停止イベント 1 回分に見せかけた、極小スクロール + 複数回停止」によります。

LR2 の BPM 表示欄を詐称するために極大値の拡張 BPM 変更が要請され、それに合わせる形で極大値のストップシーケンスが設置されます。視覚上の小節線を吹っ飛ばすこの手法は非常に応用が利くもので、「1 小節分に見せかけた複数小節」によって、地雷オブジェクトをアニメーションさせたり [https://www.youtube.com/watch?v=wXMtMbhNHMs] (外部リンク)小節線をアニメーションさせたり [https://www.youtube.com/watch?v=uKLMWFyZHV4] (外部リンク)それらを音と組み合わせて BGA 代わりにしたり [https://www.youtube.com/watch?v=1BP8X6bWNBA] (外部リンク)、などの用例があります。

この種の演出に関しては、XYZ 氏によって「BMS制作について Advent Calendar 2016 [https://adventar.org/calendars/1594] (外部リンク)」に投稿された解説記事「ギミック譜面の基礎 (1) [https://tejawha.github.io/2016/12/16/intorduction-to-gimmicked-object-jp/] (外部リンク)ギミック譜面の基礎 (2) [https://tejawha.github.io/2016/12/20/introduction-to-gimmicked-object-2-jp/] (外部リンク)」なども参考になるでしょう。


拡張命令タブ

BMSE が直接サポートしていない命令を記述するテキストボックスです。テキスト入力についてはテキスト入力フォームの操作を、拡張命令の詳細は各ソフトウェアのドキュメントや BMS command memo [https://hitkey.nekokan.dyndns.info/cmdsJP.htm#TOC] (外部リンク) などを参照してください。

BMSE が扱っていない命令のほぼすべてがこのタブに隔離されます。ただし例外もあり、たとえばフリーゾーンや地雷の配置チャンネル文は、BMSE で開いたとき削除されます。したがって譜面を開いただけでは BMSE 非対応命令の有無は判別できません。ご注意ください。

ランダム分岐

BMS の書式仕様には、「プレイ時に乱数を生成して、無作為に選ばれた選択肢の内容を適用する命令」が標準で存在します。最終的な譜面内容は、実際にプレイするまで決定されません。

分岐命令を直接サポートする譜面エディタは存在しませんが、BMSE は分岐の区間を認識して選り分けてくれます。BMSE 上では、分岐に括られた内容はメインパネルに反映されることなく、拡張命令タブの内容として隔離されます。これは BMSC や GDAC2 が持っていない素晴らしい特徴のひとつです。

BMSE で普通に譜面を開くと消されてしまうフリーゾーン地雷などのオブジェクトをどうしても残したい場合、これらの記述を「隔離用のダミー分岐命令」で包んでおく方法があります。BMSE は #IF n#ENDIF の区間内の命令行をほぼすべて拡張命令タブに隔離します。この仕組みを利用します。

#IF 1#ENDIF だけでは BMSE 以外のソフトウェアで構文解析エラーが発生するので、「値 1 までの正の整数をランダムに生成する宣言 (#RANDOM 1)」を最初に書いておきます。この場合はもちろん、選択肢 #IF 1#ENDIF の区間の内容が、プレイ時に必ず適用されます。

#ENDRANDOM は BMS の標準仕様にない拡張命令ですが、ダミー分岐の最後に書いておくと、ナナシグルーヴでプレイする際に多少安全になります。

(わざわざダミー分岐を書きたくない場合は、フリーゾーン対応の BMSC などを利用してください。もしくはテキストエディタをご利用ください。)

このダミー分岐にはいろいろな内容を記述できます。BMSE で扱えない 576 分音符ストップシーケンス 1300 回以上を、BMSE の構文解析器に評価させないためにダミー分岐に退避させた例 [https://www.youtube.com/watch?v=1dcHoKDJYMI] (外部リンク)などもあります。

普通の分岐も拡張命令タブに隔離されますが注意すべき点があり、BMSE が標準でサポートしているヘッダ文は、分岐の中に隔離されていたとしても譜面を開いた際に分岐の外に巻き上げられてしまいます。また地雷の爆発音定義 #WAV00 は他の #WAVxx と一緒に巻き上げられた挙句、削除されます。もし拡張命令タブに空っぽの分岐を見つけたら、元の譜面の内容をテキストエディタなどで確認してください。

もうひとつ注意すべき点があり、巨大な分岐は拡張命令タブに収まりきらない場合があります。Windows 95/98/ME 上でそのような譜面を開くと BMSE が強制終了します。Windows 2000/XP 以降では、拡張命令タブに収まりきらなかった内容は無言で切り捨てられます。

ファイルサイズ 64 KiB 以上 (65535 bytes 以上) の譜面は巨大な分岐を持っている可能性があるので、BMSE で開く前に分岐の有無を確認してください。譜面をテキストエディタなどで開いて、巨大な分岐があれば内容をまるごと切り取り、一時的に別のテキストファイルに隔離してから譜面を編集します。

拡張命令タブの仕様

BMSE から保存したとき、拡張命令タブの記述は、BMS コード中の “MAIN DATA FIELD” の直前位置に挿入されます。

拡張命令タブに収容されうる記述がある譜面を開くと、タイトルバーの文字列末尾にアスタリスク (“*”) が表示されます。(拡張フラグ)


拡張命令タブが収容できる内容の上限
  • [Windows 95] ANSI 換算で 63356 bytes。超えると強制終了。
  • [Windows 98/ME] ANSI 換算で 63348 bytes。超えると強制終了。
  • [Windows 2000/XP 以降] 65535 文字65536 文字以降は切り捨て。

Windows 95/98/ME に関しては、アロケーションユニットサイズなども関係があるかもしれませんが、ヘルプ筆者には専門的なことはわかりかねます。Windows 2000/XP 以降では、漢数字 65500 文字 (コードページ 932 換算で 131000 bytes) などの内容も拡張命令タブに収まります。

拡張命令タブを経由してクリップボードに格納できる内容の上限サイズも、OS や状況ごとに異なります。ヘルプ筆者にはよくわかりませんでした。

[Windows 95]
63356 文字をコピー可能に見えますが、非 ASCII 文字が多めの場合は所々文字化けします。クリップボードの原理を考えると、これはあんまりよろしくない事態に思えます。
[Windows 98/ME、かつ ASCII 文字のみの場合]
63348 文字
[Windows 98/ME、かつ非 ASCII 文字が多く混じっている場合]
16383 文字16384 文字以降は切り捨て。
[Windows 2000/XP 以降、かつ ASCII 文字のみの場合]
65535 文字65536 文字以降は切り捨て。
[Windows 2000/XP 以降、かつ非 ASCII 文字が多く混じっている場合]
32767 文字32768 文字以降は切り捨て。
[Windows 2000/XP 以降、かつ非 ASCII 文字が少し混じっている場合]

9 文字 (!?)。都合が悪いことに、BMS の書式上、東アジア言語環境ではこのような特殊な事例が発生しやすそうです。これは BMSE の責任ではなく Visual Basic 6.0 のフォームや Windows の問題ですが、なんにせよ巨大な内容を拡張命令タブで編集するのは避けるべきです。


BMSE は、BMS コードにおいて半角シャープ (“#”) で開始される行のみを解釈します。BMSC [http://tixlab.com/software/bmsc.shtml] (外部リンク) でいうところの、以下の記述を BMSE は読み取りません。

  • %EMAIL” (作成者のメールアドレス)
  • %URL” (作成者の WEB サイト)
  • オブジェクトパネル → 情報タブ (作成者のコメントやメッセージなど)

これらの行は、BMSE で開いたとき削除されます。BMSE が削除する記述は、一部のフリーゾーンや地雷など以外は特に譜面に影響がないものばかりですが、BMSC 時代の譜面を BMSE で編集する際は一応ご注意ください。

行頭に “#” を挿入しておけば、これらも BMSE の拡張命令タブに残すことは可能です。ただし、その状態の譜面が他のアプリケーションで正常にプレイできるかどうかは保証しかねます。

拡張命令タブには、BMSE の機能一切が適用されません

メインパネルや定義リストの内容を変更したとき、拡張命令タブの内容には影響が及ばないために、譜面が意図通りに再生されなくなる可能性があります。

  • 定義リストの整列を行うと、拡張命令タブ内にある配置データ文は整列前の定義リスト番号を参照し続け、譜面著者が望む内容は参照されません。
  • 未使用定義の消去を行うと、たとえば「#IF-#ENDIF 区間内からのみ参照される定義番号」の内容は、未使用とみなされて消去されます。
  • 未使用ファイルの削除を行うと、たとえば #BANNER 定義からのみ参照されている画像ファイルは、未使用とみなされて削除されます。
  • 小節の挿入や削除を行うと、たとえば #IF-#ENDIF の分岐内容は、予想外の小節に対して適用されるかもしれません。
  • 拍子の変更を行うと、たとえば拡張命令タブ内の「小節を等分する配置」は、変更前とは異なる長さの小節を等分します。(リズムが変わります。)
  • これらを組み合わせて同時実行した場合、拡張命令部分と元々の譜面との対応関係は、修復不可能なくらい崩れる可能性があります。

したがって拡張命令タブの内容は、他のあらゆる作業工程が完了してから最後に記述することを強く推奨します。また既存譜面の手直しや差分作成などを行う場合、拡張命令タブ内の記述を必ずチェックしてください。

  • 拡張命令タブのテキストボックス内における、テキストの編集操作に対する “元に戻す (コンテキストメニュー)”・[Ctrl + Z]・[Ctrl + Y] は、「Windows 自体の機能」です。BMSE の機能 “元に戻す/やり直し” とは関係がありません。したがって、ある種のシェル拡張などを導入していない限り、通常は拡張命令タブに対する編集操作を 1 ターンしか遡行できません。

拡張命令タブに関する注意点

2024年も新しい機種が新しい拡張命令を実装し続けており、ヘルプ筆者はそれらを把握しきれていません。以下は2024年までの情報に基づくものです。

BMSE が開くと改竄を免れない命令
  • #PLAYER 4 … Battle Play は PMS (9 Keys) に化ける
  • #PLAYLEVEL string … 文字列値難易度は値 0 に化ける
  • #RANK 4 … VERY EASY 判定は、単なる EASY 判定に化ける
  • #WAV00 … 地雷の爆発音定義は消える
  • #WAVCMD#WAVMD に化ける
  • %URL … 消える
  • %EMAIL … 消える
  • #RANDOM の入れ子 … 分岐の範囲を誤る
  • #RANDOM 区間内に書かれた BMSE 標準対応命令 … 巻き上げられる
  • 拡張命令タブに入りきらない量の分岐や配置データ文など … 破棄

これら以外なら、#SWITCH 分岐であれ非対応チャンネルであれ、ダミー分岐に隔離することで対処できる……はずです。

拡張 BPM 変更やストップシーケンス、拍子やリズムなどに関する BMSE 特有の制限は、拡張命令タブともあながち無関係というわけではありませんが、また別の層の話ということで。

BMSE が標準対応している命令
  • #PLAYER … 仕様本来の Battle Play 用の値 4 は誤解釈される
  • #GENRE
  • #TITLE
  • #ARTIST
  • #BPM
  • #PLAYLEVEL … 文字列値難易度は読み込み時に値 0 にされる
  • #RANK … 拡張判定 VERY EASY (値 4) は読み込み時に値 3 にされる
  • #TOTAL
  • #VOLWAV
  • #STAGEFILE
  • #WAVzz (<Materials> 記法もエラーにはならない)
  • #BMPzz (<Materials> 記法もエラーにはならない)
  • #BGAzz
  • #BPMzz (定義番号は自動的に、登場順に 01 からの連番に書き換わる)
  • #STOPzz (定義番号は自動的に、登場順に 01 からの連番に書き換わる)

  • BMSE がサポートするこれらの命令群は、ダミー分岐に隔離されていたとしても、読み込み時に分岐の外に巻き上げられます。これらの命令群が分岐に括られた譜面を編集する際は、BMSE で開く前に分岐を他のテキストに移してください
  • もし分岐内に #BPMzz#STOPzz の定義と配置を括っていた場合、これをそのまま BMSE で開いてしまうと:

    1. #BPMzz#STOPzz の定義だけが巻き上げられる
    2. それらの配置データ文は分岐の中に残り続ける
    3. 巻き上げられた #BPMzz#STOPzz は無意味とみなされて消える
  • #RANK 4” や文字列値難易度などの「拡張された値」は矯正されます。(#RANK 4 相当の #DEFEXRANK を指定しておくことは可能です)

  • <Materials> 記法はエラーにこそなりませんが、BMSE が Materials [https://hitkey.nekokan.dyndns.info/cmdsJP.htm#MATERIALS] (外部リンク) をサポートしているわけではないので、ファイルを参照できません。
BMSE がサポートしていない拡張命令
  • #WAV00 … 地雷チャンネル #xxx[D1-E9] もろとも消える
  • #DEFEXRANK
  • #EXRANKzz … 対応チャンネル #xxxA0 も残る
  • #BANNER
  • #BACKBMP
  • #CHARFILE
  • #PREVIEW
  • #PREVIEWPOINT
  • #PREVIEWTIME
  • #OFFSET
  • #DIFFICULTY
  • #SUBTITLE
  • #SUBARTIST
  • #MAKER
  • #COMMENT
  • #EXT
  • #TEXTzz … 対応チャンネル #xxx99 は消える
  • #SONGzz … 対応チャンネル #xxx99 は消える
  • #PATH_WAV … フルパスを書いてもただの文字列とみなされセーフ
  • #EXBPMzz
  • #BASEBPM
  • #STP
  • #LNTYPE 1
  • #LNTYPE 2
  • #LNOBJ ZZ
  • #LNMODE
  • #SCROLLzz … 対応チャンネル #xxxSC も残る
  • #SPEEDzz … 対応チャンネル #xxxSP も残る
  • #4K
  • #6K
  • #OCT/FP
  • #OPTION
  • #CHANGEOPTIONzz … 対応チャンネル #xxxA6 も残る
  • #WAVCMD#WAVzz の定義番号 MD に化ける
  • #EXWAVzz
  • #CDDA
  • #MIDIFILE
  • #EXBMPzz
  • #@BGAzz
  • #POORBGA
  • #SWBGAzz … 対応チャンネル #xxxA5 も残る
  • #ARGBzz
  • #VIDEOFILE
  • #VIDEOF/S
  • #VIDEOCOLORS
  • #VIDEODLY
  • #MOVIE
  • #SEEKzz … 対応チャンネル #xxx05 は消える
  • #EXTCHR … 対応チャンネル #xxx05 は消える
  • #MATERIALSWAV
  • #MATERIALSBMP
  • #DIVIDEPROP
  • #CHARSET
  • %URL消える
  • %EMAIL消える

各命令の詳細は BMS command memo [https://hitkey.nekokan.dyndns.info/cmdsJP.htm#TOC] (外部リンク) などを参照してください。

  • #WAVCMD は本来ならおそらく複数回書けるはずですが、BMSE に通すと最も文末側にある最後の #WAVCMD だけが #WAVMD として残ります。ダミー分岐に隔離しても #WAV に誤解釈されて巻き上げられます。
  • #WAV00#WAV として巻き上げられ、不正な番号とみなされ消えます。

チャンネル文はダミー分岐に隔離すれば全行保護できます

制御構文
  • #RANDOM … BMSE はこれを認識します。
  • #SETRANDOM
  • #IF … BMSE はこれを認識します。
  • #ELSEIF
  • #ELSE
  • #ENDIF … BMSE はこれを認識します。
  • #ENDRANDOM
  • #SWITCH
  • #SETSWITCH
  • #CASE
  • #SKIP
  • #DEF
  • #ENDSW

BMSE は#IF から直近の #ENDIF までの区間」を認識し、区間内の「未知の命令文および全チャンネル文」を拡張命令タブに収めます。もし #RANDOM 命令が存在するなら、#RANDOM から直近の #IF までの区間」も拡張命令タブに収めます。

#RANDOM 1                
    #LEVEL 1             
    #IF 1                
        #00111:11        
        #RANDOM 1        
            #LEVEL 2     
            #IF 1        
                #00212:22
            #ENDIF
        #ENDRANDOM
        #00313:33
    #ENDIF
#ENDRANDOM

前述の例において、行頭側および行末側の空白は便宜上のものです。BMSE は分岐の入れ子をサポートしていないので、「最初の #RANDOM から、最初に現れる #ENDIF まで」を分岐の一区間とみなします。#00313:33” は分岐の範囲外にある地の文とみなされ、拡張命令タブの外に追い出されます。(メインパネルに描画されます。)

#RANDOM-#IF-#ENDIF 以外の制御構文は、BMSE にとって未知の拡張命令として、単に拡張命令タブに収められます。入れ子を使わないなら、#IF-(#ELSEIF-#ELSE)-#ENDIF 区間で問題は発生しません。

#SWITCH 区間内の文は、単に地の文として構文解析されますが、#SWITCH 区間内に #RANDOM の入れ子が存在しないなら、#SWITCH 区間をまるごとダミー分岐に隔離できます

36 進数チャンネル、インデント、ブロックコメント、他
  • #xxx[0-6][A-Z] … 拡張命令タブ内に保持します。
  • #xxx[1-6](0|7) … 読み込み時に削除します。
  • #xxx[7-9][0-9] … 読み込み時に削除します。
  • #xxx[7-9][A-Z] … 拡張命令タブ内に保持します。
  • #xxx[A-C][0-9A-Z] … 拡張命令タブ内に保持します。
  • #xxx[D-E][0-9] … 読み込み時に削除します。
  • #xxx[D-E][A-Z] … 拡張命令タブ内に保持します。
  • #xxx[F-Z][0-9A-Z] … 拡張命令タブ内に保持します。
  • インデントされた行 … 先頭が “#” でないので無視します。
  • ブロックコメント … 解釈しません。

削除されるチャンネルも、分岐に括れば残すことができます。