同梱のギミックの作り方


●BPMと小節長

1.普通に譜面を作ります。

2.BPMを1/1000にします。
この時、拡張定義で設定している#BPM01と#BPM02の値も1/1000にすること！

3.小節長を1/1000にします。
テキストで譜面ファイルを開いた時、" #(小節数)02:(数値) "の部分が小節長のフォーマットです。
小節長が1の場合この定義が挿入されないので、わざとBPMと小節長を2倍にしてこの定義が表示されるようにしています。
メモ帳の置換を上手く使って、小節長を1/1000にしましょう。
("02:2"→"02:0.002"のように変換すると良いです)

小節長を変更した場合は、適宜その箇所だけ変更しましょう。


●ワープ(ちょっと高度な話です。)

・beatoraja用の場合

1.SCROLL定義を使用するので、uBMSCを導入しましょう。
ここにあります→https://github.com/zardoru/iBMSC/releases
導入の仕方は各自調べること！

2.ワープさせたい箇所の始点に、デカい数値のSCROLL(1万以上でOK)を定義します。

3.デカい数値のSCROLLの直後(1/32以下、出来れば1/192以下が望ましい)にSCROLL 1を置きます。
ゆっくり加速させたい時や減速させたい時は、適宜変更してもOKです。

4.テキストで小節長と小節線を直すのは仕込んだ後でOKです。


☆原理
SCROLL定義は、入力した数値分譜面が伸縮します。
0.5と入力すれば、適用された区間の譜面の長さが1/2倍になります。
要はBPMが半分になった時と同じ振る舞いをします。
逆に2と入力すれば、譜面の長さは2倍になり、BPMが倍になった時の挙動をします。

では、微小区間に対してクッソデカい値を適用させるとどうなるか？

例えば上記に倣い、ワープさせる瞬間にSCROLL10000を入力し、その1/192後にSCROLL 1を置いたとします。
すると、1/192小節分の区間が10000倍され、その後ろの譜面は10000/192小節≒約52小節分先まで飛ばされることになります。
つまり、ワープする前の時点では、ワープ開始地点より後ろの譜面が確認出来なくなります。オイオイ。
そして1/192小節進むと、何事もなかったかのように譜面は等速で流れ出します。なんだお前！？
この時、1/192小節分の区間は時間的には一瞬であり、大抵の人間は感知できないので、あたかも譜面が急に現れたかのように見えます。

この辺りの話を最大限拡張した譜面がwitchcraft [14SCROLLMAGIC]なのでみんなも観ようね。


・LR2の場合

1.あらかじめワープさせたい箇所に、STOP 1を置きます。

2.拍子のExpand内の「絶対的な位置を保つ」を選択した状態で、ワープ開始点の小節長を1/192、後続の小節長を小節の頭と音が合う長さにします。
(単純に1小節飛ばすだけなら、後続1小節の小節長は1)

3.拍子のExpand内の「小節の長さに合わせて位置を変化させる」に変更し、ワープ開始側の小節長をを1000/192にします。

4.テキストで小節長とBPMをいじり、#STOP(数値) 1の値を#STOP(数値) -1に変更します。


☆原理
この話はまず、#STOP -1が何者かを理解しておく必要があります。

一般に#STOPは、入力した数値×1/192小節分譜面を止める定義です。
1/16小節だけ止めたいなら、STOPに12と入力すればOK！といった感じです。

一方で、STOPに負の値を入力すると、その絶対値の大きさに関わらず、1/192小節分ワープします。
つまり、STOP -1を192分の間隔で192個敷き詰めると、1小節ワープさせることができます。
これが"負数STOP"です。


ここからは今回の譜面の特異的な部分です。
BPMと小節長が1/1000の環境で安易に負数STOPを置くと、譜面がスゴイ勢いで吹き飛びます。なぜ？
それは今回の小節長がとても短いからです。
今回の同梱譜面の小節長は、長くても0.01=1/100です。
その中に1/192区間だけ飛ばすものを入れるとどうなるか？自明ですね。

これは仕込むの無理か？いいえ、諦めるのは早いです。
BPMと小節長が1/1000になったことで、STOPの影響が1000倍になります。
つまり、ワープする区間を1000倍にして対応すればいいのです。
そのための1000/192！ウオオ！
こうしてLR2でもワープを仕込むことに完成したのでした。　完





余談ですが、負数STOPはorajaで認識しないし、SCROLLはLR2で認識しないので、
譜面を分ける必要があった、ということです。

for orajaをLR2で再生すると、SCROLLが読み込まれないだけなので正常に動くと思います。
for LR2をorajaで読み込むと、1000/192小節開けた分だけ正常に再生出来ないと思います。

orajaでの負数STOPの扱いをどうするか次第で今後の挙動が変わりますが、
そもそもがLR2固有のバグの一種なので、そんなに期待はしていません。