拍子タブ
小節ごとに拍子を指定できます。既定値は 4
指定した拍子に応じて、メインパネル上に描画される小節の長さも変動します。これによって、変拍子を使用した譜面も視覚的・直感的に編集することができます。これは、全小節を同じ長さで表示する BMSC や GDAC2 とは異なります。どちらの表示方式にも一長一短ありますが、変拍子編集なら BMSE の独擅場です。
拍子タブの操作
小節リストを左クリックするか、リストカーソルを移動させて、対象小節を選択します。選択した小節に対して、リストボックスから拍子を指定します。
拍子の分子は [1 から 64 までの正整数]、分母は [4, 8, 16, 32, 64] から選択できます。分母を単位音符とし、分子をその個数とします。
Home、
を押すと、リストボックスから選択された値が、小節リスト上の選択された状態にある小節すべてに対して入力されます。このときメインパネルが再描画され、指定された小節の長さが変更されます。
拍子の変更操作は “元に戻す/やり直し” が可能です (ただし過信は禁物)。
左ドラッグなどで複数の小節を選択でき、それらへの 1 回の によって拍子を一括変更できます。
Ctrl + 左クリック 【選択状態反転】
選択アイテムを追加もしくは解除します。
Shift + 左クリック 【範囲選択】
クリックした行までを選択します。
押下、または小節リストのどこかを左ダブルクリック
#000
~ #999
を選択します。ただし全小節を選択して拍子を一括変更すると、#999
が過ぎ去るまでリザルト画面に移行しなくなります。#998
までしか使えませんが)
この件に関して BMSE に責任はありませんが、互換性を重視するなら小節を全選択する機能は使わないでください。必要な区間のみを選択して拍子を変更してください。
拍子タブに関する注意点
#983
~ #999
のどこかの小節を、4 /4 拍子より長くしている。 - メインパネルの現在位置を
#501
以降にしている。 #983
~ #999
のどこかの小節を、4 /4 拍子より短くする。
前述の条件をすべて満たすと BMSE が強制終了します。このとき編集作業の一時バックアップファイルは生成されません。垂直スクロールバーに与えられる 16 小節分の終端マージンと関係がありそうですが、詳細は不明です。
オブジェクト配置済み小節の拍子を変更すると、配置が崩れる場合があります。
小節が伸びるとき、小節末尾位置にスペースが挿入されます。
小節が縮むとき、溢れた配置は後方に押し出されます。押し出された位置にも既にオブジェクトがあった場合、
重なる位置のどちらのオブジェクトも編集履歴にない場合、後方小節側のオブジェクトが前面に重なります。
重なりを避けるには、あらかじめ空の小節を挿入し、それに対して拍子を指定してください。(その後で配置を移動してください。)
小節長について
【小節長 = 拍子分子 ÷ 拍子分母】 です。0.75
となります。2
となります。
BMS 書式上では、拍子は小節長として表されます (配置チャンネル #xxx02
)。
#xxx02:n
-
- “
#00002:0.75
” なら、#000
小節は 3/4 拍子 - “
#00102:2
” なら、#001
小節は 8/4 拍子 - 小節長チャンネルは、小節ごとに 1 文のみ解釈される (重複しない)
- 小節長チャンネルは、小節ごとに適用される (効果は継続しない)
- 小節長
1
のとき、その小節の小節長チャンネル文は省略できる
- “
BMSC や GDAC2 における小節長を、
- BMSE は最小 1
/64 拍子からを扱えます。小節長の値はすべて、 64 分音符で割り切れる値に丸められます (【1 ÷ 64 = 0.015625
】の倍数)。 - BMSE は最大 64
/4 拍子までを扱えます。 16
以上の小節長は16
になります。 - BMSE は読み込み時に小節長の値を丸めたうえで配置データを解釈します。
このため、
- 例 1: 小節長
0.01
が 200 小節続く譜面 -
BMSE 上で、小節長
0.01
は0.015625
に丸められます。この区間は丸め誤差0.005625
が 200 小節分累積し、本来の長さより「8 分音符 × 9 個分」長くなるでしょう。 - 例 2: 小節長
32
を 8 等分する間隔でオブジェクトを配置している譜面 -
この小節は BMSE 上では「長さ
16
を 8 等分する間隔」になり、元の長さより「4/4 拍子における 16 小節分」短くなるでしょう。
小節長は曲の長さとほぼ同義です。
既存の譜面を編集したい場合は、対象譜面を BMSE で開く前に、
BMSE の苦手分野について
BPM 120 で経過する 4
【BPM 対 小節長】の比の値を一定に保てば、
たとえば先の例で、小節の経過時間を変更せずに、譜面スクロール速度のみを BPM 119 に変更したいなら、[120:1]
を [119:0.991666…]
に変更することで実現できます。119
を指定し、小節長に 0.991666
を指定すればよいわけです。
BMSC
一方 BMSE では、曲を変えずに譜面スクロール速度のみを変更する場合でも、オブジェクトの配置間隔も併せて変更する必要があります。しかし第一の難点として、0.991666
は BMSE 上では拍子として表現できない値なので、
BMS をテキストエディタなどで開いて小節長を直接変更すれば、それを BMSE で開くと配置間隔が適切に変更されたかのように見えます。しかし「64 分音符単位で割り切れない小節長」ならば、結局のところ配置間隔は狂います。
BMSE から見れば、長さ 0.991666
の小節は「64 分音符 (長さ 0.015625
) × 63.46662 個分」です。これは最終的に「64 分音符 × 63個分」に丸められます。元々の「小節を 4 等分するリズム」も 63 等分リズムの型に嵌めざるをえませんが、割り切れないので誤差を最小化するために「189 個分の 192 分音符」が要請されます。
BMSE は仕様上、変拍子に強い反面、比の小節長を苦手としています。
なお Bemuse 拡張 #SCROLL[01-ZZ]
定義を使えば、#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
に翻訳したサンプル譜面です。
ついでなので Bemuse 拡張 #SPEED[01-ZZ]
についても解説します。これは指定した区間内のノート描画間隔をキーフレーム単位で変更します。
曲の鳴り方を変えずに、一定の割合で徐々にノート間隔を開き、#SCROLL
に置き換えると劇的にすっきりしますが、各区間の変化率を逐一定義して配置するのはまだ面倒です。#SPEED
なら始点と終点の割合・位置を指定するだけです (これは明示的な線形補完と等価です)。附録
小節長の値と、 BMSE の小節長解釈に関するまとめ
- 値
0
、文字列、空、省略時 - 小節長
1
(4/4 拍子) とみなす - 負数や、
0.015625
未満の値 0.015625
(1/64 拍子) とみなす 16
より大きい値16
(64/4 拍子) とみなす 0.015625
の倍数でない値- 直近の
0.015625
の倍数に丸める (循環小数になる場合あり) - 有効数字 15 桁
- たとえば小節長
0.03
は2.60416666666667E-02
として解釈される - 有効範囲 ±
170.666…
- 絶対値が
170.666…
を超えるとオーバーフローして強制終了する
拍子タブからは指定できない拍子
16 以下の、#00002:
” と記述すると、#000
は 65
拍子タブはこれを正しく表示できませんが、譜面の編集や保存は問題なく行えます。#00002:
” なら、#000
は 1023
拍子を別の値に変更したうえで “元に戻す” と、これらの拍子も正しい値で表示されるようになります。
- 小節長はダイレクト入力枠からも直打ちできますが、表示が変になるうえ “やり直し” もできません。小節長に関しては譜面をテキストエディタなどで開いて編集するほうが安全です。
小節内での譜面スクロール速度変更は、一種の変拍子
たとえばこのサンプル譜面は、聴覚上は最初から最後まで一定速度の 4 分打ちとして再生されます。
(ただし、小節長に対応していない O2mania
鳴り方が等しいとき、小節内のある区間において、
BMSE は、このタイプの演出なら BMSC や GDAC2 よりもはるかに手軽に行うことができます。各エディタの性質は以下の通りです。
- BMSE は (おそらく beditor も) 小節長の足し引きに強い
- BMSC や GDAC2 は小節長の比率操作に強い
- iBMSC や μBMSC はどちらもこなせる
- BMS コードを理解して直接編集できるなら、テキストエディタが最強
近年では、区間長の考え方を百歩も二百歩も押し進めたギミック譜面が空前絶後のスクロール芸を繰り広げています。テキスト直打ちなら、
Lunatic
LR2 の BPM 表示欄を詐称するために極大値の拡張 BPM 変更が要請され、それに合わせる形で極大値のストップシーケンスが設置されます。視覚上の小節線を吹っ飛ばすこの手法は非常に応用が利くもので、
この種の演出に関しては、
拡張命令タブ
BMSE が直接サポートしていない命令を記述するテキストボックスです。テキスト入力についてはテキスト入力フォームの操作を、拡張命令の詳細は各ソフトウェアのドキュメントや BMS command memo などを参照してください。
BMSE が扱っていない命令のほぼすべてがこのタブに隔離されます。ただし例外もあり、たとえばフリーゾーンや地雷の配置チャンネル文は、
ランダム分岐
BMS の書式仕様には、
分岐命令を直接サポートする譜面エディタは存在しませんが、
BMSE で普通に譜面を開くと消されてしまうフリーゾーンや地雷などのオブジェクトをどうしても残したい場合、これらの記述を「隔離用のダミー分岐命令」で包んでおく方法があります。#IF n
~ #ENDIF
の区間内の命令行をほぼすべて拡張命令タブに隔離します。この仕組みを利用します。
#IF 1
~ #ENDIF
だけでは BMSE 以外のソフトウェアで構文解析エラーが発生するので、1
までの正の整数をランダムに生成する宣言 (#RANDOM 1
)」を最初に書いておきます。この場合はもちろん、選択肢 #IF 1
~ #ENDIF
の区間の内容が、プレイ時に必ず適用されます。
#ENDRANDOM
は BMS の標準仕様にない拡張命令ですが、ダミー分岐の最後に書いておくと、ナナシグルーヴでプレイする際に多少安全になります。
(わざわざダミー分岐を書きたくない場合は、フリーゾーン対応の BMSC などを利用してください。もしくはテキストエディタをご利用ください。)
このダミー分岐にはいろいろな内容を記述できます。
普通の分岐も拡張命令タブに隔離されますが注意すべき点があり、#WAV00
は他の #WAVxx
と一緒に巻き上げられた挙句、削除されます。もし拡張命令タブに空っぽの分岐を見つけたら、元の譜面の内容をテキストエディタなどで確認してください。
もうひとつ注意すべき点があり、巨大な分岐は拡張命令タブに収まりきらない場合があります。
ファイルサイズ 64 KiB 以上 (65535 bytes 以上) の譜面は巨大な分岐を持っている可能性があるので、
拡張命令タブの仕様
BMSE から保存したとき、拡張命令タブの記述は、MAIN DATA FIELD
” の直前位置に挿入されます。
拡張命令タブに収容されうる記述がある譜面を開くと、タイトルバーの文字列末尾にアスタリスク (“*
”) が表示されます。
- 拡張命令タブが収容できる内容の上限
-
- [Windows 95] ANSI 換算で 63356 bytes。超えると強制終了。
- [Windows 98
/ME] ANSI 換算で 63348 bytes。超えると強制終了。 - [Windows 2000
/XP 以降] 65535 文字。 65536 文字以降は切り捨て。
Windows 95
拡張命令タブを経由してクリップボードに格納できる内容の上限サイズも、
- [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 は、#
”) で開始される行のみを解釈します。
- “
%EMAIL
” (作成者のメールアドレス) - “
%URL
” (作成者の WEB サイト) - オブジェクトパネル → 情報タブ (作成者のコメントやメッセージなど)
これらの行は、
行頭に “#
” を挿入しておけば、これらも 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 で開いてしまうと:#BPMzz
や#STOPzz
の定義だけが巻き上げられる- それらの配置データ文は分岐の中に残り続ける
- 巻き上げられた
#BPMzz
や#STOPzz
は無意味とみなされて消える
-
“
#RANK 4
” や文字列値難易度などの「拡張された値」は矯正されます。( #RANK 4
相当の#DEFEXRANK
を指定しておくことは可能です) <Materials>
記法はエラーにこそなりませんが、BMSE が 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
#CHANGE
… 対応チャンネルOPTIONzz #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 などを参照してください。
#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]
… 拡張命令タブ内に保持します。- インデントされた行 … 先頭が “
#
” でないので無視します。 - ブロックコメント … 解釈しません。
削除されるチャンネルも、分岐に括れば残すことができます。