BMS Scrollギミックの作り方

こんにちは、初めまして、numutoと申します。ギミック譜面を作り始めたのが2022年4月下旬で2022年10月頃まで集中的にギミック譜面を作成しておりました。ギミック界隈では全然名の知れた者ではない新参者ですが、自分なりにScrollギミックに関して試行錯誤した経緯がありましたので、それを形にしようと思いました。何かのお役に立ちましたら幸いです。今回は、自作BMSの「Odyssey in the sky」を使用してまずは基本的なギミックの説明を行います。思ったより長くなってしまったので、実際の譜面を用いた解説はまた今度……。ですが、基礎の基礎はほぼ全部かけたかなぁと思ってます。
BMS:Odyssey in the sky / numuto | pupuly (nekokan.dyndns.info)
Soundcloud:Stream Odyssey In The Sky by numuto | Listen online for free on SoundCloud

①基本的なギミック

BMSのギミック系命令には大きく分けて「Scroll」「BPM」「Stop」の三種類があります。
Scroll:譜面の流れる幅を変えます(※Scroll≠速さの変化、の意識は重要です!)
BPM:曲の流れる速さを変えます
Stop:譜面を指定された時間だけ止めることが出来ます
これらを用いてまずは基本的なギミックを紹介したいと思います。

1:加速・減速

基本的なギミックと言えば加速・減速です。以下に「Scroll」「BPM」「Stop」をそれぞれ用いた加速・減速の方法を載せたいと思います。

~Scroll編~
前述の通りScrollは譜面の流れる幅を変えるギミックです。幅が変更するけど時間が変わらないので加速・減速しているように見えるということです。以下に簡単な加速減速の例を載せます。少し見にくいですが、Scrollを1→0.5→0.25→0.5→1→2→3→2と変化させています。Scrollギミックの最大のメリットは幅を変化させることなので、ノーツを動かさなくて済むことです。

~BPM編~
BPMは曲の流れる速さを変化させるギミックなので、Scrollとは異なり単純に速度を変えるだけでは曲の速さが変わってしまいます。そこで、変化させた具合に合わせて全体を圧縮・拡張する必要があります。以下に例を載せます。順に150→75→37.5→75→150→300→450→300と変化させております。いて分かる通り全体を圧縮拡張しなければならないので少々面倒ですが、LR2ではscrollギミックが非対応ですので、このようにせざるを得ません。

~Stop編~
stopはその名の通り譜面を一時停止させるコマンドです。曲に規定されたBPM(エディタ上で右上に記載されているもの)を基準に192を1小節分としております。一時停止で減速ってどうやるの?と思われるかもしれませんが、中身は単純です。超高速で瞬間停止を連続させて擬似的に低速になります。基準となるBPMで1小節192ということは、1/2倍にする場合は全体を96にする(つまり96stop必要)、1/4倍にするには全体を48にする(144stop必要)、2倍にするには全体を384にする(-192stop必要)、となります。ただし、負数stopはエディタ上では入力できませんので、.bmsファイルをtxtで開いて編集する必要があります。その入力方法に関しても簡単に載せて置きます。stopはBPMと同じく速さを調整する変化ですので、全体を圧縮拡張する必要があります


2:ワープ

こちらもギミックには欠かせない要素です。地雷ノーツが突然実ノーツに具現化したり、LNが突然消えたりなど表現の上では絶対に必要になってきます。scroll、BPM、stopでそれぞれワープを表現する手法を紹介します。

~scroll編~
ワープしているように見せるとはつまり次のノーツまでを高速移動させることです。前述の通りscroll変化はノーツ間の幅を調整する命令ですのでつまり、それをメチャクチャ長くすればワープしているように見えます。今回は簡単にLNが消えるワープを表現します。

~BPM編~
BPMでワープさせるには一般的に100001倍BPMが使用されます(どうして100000倍ではなく100001倍なのかに関しては、LR2上で見た目のBPMが変化しないことが一つメリットとして挙げられます)。前述の通り幅の変化ではなく速さの変化なので、それに合わせて譜面全体を移動させる必要があります。上のScrollギミックと同じことをBPMで表現します。

~stop編~
正直な話、stopでも理論上巨大な負数を定義すればワープ出来ますが、LR2限定な上にわざわざstopで表現するようなことではないので、おすすめはしません。どうしてもLR2で動くギミックでかつBPMを絶対に変化させたくない場合は使用しても良いかも知れません(例えば100001倍で1小節ワープさせる場合は192-100001×192=-19200000のstopが必要になります)。ここでは割愛させて頂きます。

3:アニメーション

さぁ!ギミック譜面の大きな見せ場であるアニメーションです!地雷が少しずつ出現していったり、思いもよらぬ動きを見せたり、妙な模様が出現したりと色んな表現をするのに絶対必要なスキルですが、やっていることは全て「パラパラ漫画」です。ええ、あんな風に動いてくれる特別な命令なんてありませんよ。パラパラ漫画×ワープを繰り返しています。「え、本当にそんなに面倒なことをやっているの!?」と思ったそこのあなた、大正解です!これはね、面倒ですよ~~~笑。BPM変化でパラパラ漫画をするのが一般的なアニメーションですので、そこから説明しようと思います。

~BPM編~
まずは単純に地雷が動くだけのアニメーションを作ってみましょう。地雷が下から上に等速直線運動していくアニメーションです。まず決めることはアニメーションのfpsです。今回デモで使用しているのはBPM150ですので、例えば1小節を32分割すると240/150秒あたりに32コマ、つまり20fpsのアニメーションになります。64分割で40fps、96分割で60fps。それぞれ順番に表示していますので、見比べてみてください。2小節ずつ16分割(10fps)、32分割(20fps)、64分割(40fps)、96分割(60fps)にしてます。今回はワープ間隔を1小節にしていますので、例えば64分割ではstopの値は192×100001÷64-192=299811となります(ここの-192は要するに基準BPMでの1小節分の長さを移動しますよ~ってことですので、ワープ間隔が例えば1/2小節になれば-96になります)


~scroll編~
さて、上記のようなアニメーションをBPMを変化させずにscrollだけで表現することも可能ですが、基本やらないです。というのも、見た目が細かくて非常に煩雑な上にLR2ではアニメーションになってくれないからです。基本は「コマ送り」ですので「コマ」「送り」の両方を作ることになります。コマに関してはstopで表現していましたが、scrollで表現する場合にはscroll=0.0で表現することになります。scroll=0.0だと見た目が完全に止まっていますが譜面の幅が0になっているだけですので曲の流れる速さに変化はありません。ただし、単にscroll=0.0をかけるだけでは判定ライン上で止まるだけなので、一工夫必要です。空中に地雷が停止しているコマとはつまり、「空中に停止している地雷が次の瞬間高速で判定ラインまで流れて消えて行く」ということになりますので、その動きをscrollで表現しなくてはなりません。そして「送り」の瞬間移動を入れるためには、次のノーツが到達する直前に巨大なscrollを入れて幅を広げてあげればOKです。以下に例を載せ

普通は下のようにscroll+BPM変化+stopで表現します(scrollなくても問題ありませんが、エディタの都合上999小節長を超えると編集ができなくなりますので、それの対策として小節長を節約する目的でこのように圧縮することは有意義な手段です。

以上が基本的なギミックかと思います。「え?これだけ?」と思われるかもしれませんが、実際それだけです。色んな見た目のギミックがありますが、実際は中身これだけです。逆に言えばこれらをいい感じに組み合わせるだけでかなり多様なギミックが出来ます。本当にヤバイ人はもっと訳わからん技術を使用したりしていますが、それらは基本的なギミックではありませんので……笑

②基本的なScrollギミック

では、いよいよ本題に入ります。今回は色んなギミックの中でもorajaギミックとも呼ばれるscrollギミックに関してのノウハウを自分なりに書いてみたいと思います。上記の基本的なギミックを踏まえた上でscrollギミックならではの面白い演出の数々をご紹介出来たらなと思っております。最終的には自作差分の解説という形で共有できればと思いますが、その前に基本的なscrollギミックを紹介したいと思います。また、beatoraja限定なので、不可視ノーツを使用するものも基本的なギミックとして採用しております。

1:空中停止ギミック

ノーツが空中に停止していてそれを叩くというギミックになります。例えば以下の動画の0:55からの迷路地帯なんかは空中停止ギミックを使用しております。では実際にどのような中身なのか簡単に説明します。

やってることは全然難しくないです。scroll=0.0の間は譜面が停止する性質を利用して空中に止めます。そして、叩く直前までscroll=0.0にしておいて判定ラインまで瞬間移動させるようにscrollを組めば完成です。何度も繰り返しますが、scroll≠速さの調整ではありませんので、ここは意識してください。では具体的な例を載せます。以下は1/16小節、1/8小節、3/16小節、1/4小節部分にノーツが空中停止するギミックです。ノーツを叩く直前に1920分間隔でそれぞれscroll120,240,360,480と入れますと120/1920小節、240/1920小節、360/1920小節、480/1920小節分の幅になりますので、そこを瞬間移動するように見えます。そして、これが重要なことなのですがscroll変化は部分的に適応することが出来なくて一箇所動かすと後ろの譜面も全部動いちゃうのです!だから瞬間移動させたら同じ分だけ瞬間的に後ろに戻してあげないと行けないのです。ここがscrollギミックの大事なところです。折角なので地雷からの具現化も入れてみました。地雷は左から順に120/1920、240/1920、360/1920、480/1920で表示させたいのですが、全部同時に動かすことは出来ないのでバラバラに動かしています。最初のものを120動かして-120戻して、次のを240動かして-240戻して……という感じで120 - 120 - 120 - 120 - -480になります。因みにorajaの性質上scroll=0.0でノーツが重なると後ろにあるノーツが前に表示されてしまいますので、下の画像のようにすると地雷ノーツが空中浮遊しているだけで実ノーツが見えません。なので、動画では実ノーツが見えるように不可視ノーツに変更しております。また、不可視ノーツ部分が流れた直後に適当にscroll=1000とか入れておかないと次のノーツが早く表示されてしまって譜面が切り替わっていく感じが見えなくなってしまいますのでご注意を。動画ではscroll=1000を適当に入れてます。


2:逆走ギミック

その名の通り譜面が逆走します。予想通りscroll=-1.0を使用するのです、が!単にScroll=-1.0にすると以下のようになります。

このように判定ラインより下から流れてくるようになるので非常にプレイがしにくいです。では、どうすればいい感じに上に逆走してプレイすることが出来るのでしょうか。何となくイメージがつくかと思いますが、上まで逆走させた後に判定ラインまで瞬間移動させれば良いのです。例えば緑数字300だとするとノーツ出現から判定ライン到達まで500msになりますので、BPM150では0.5/(240/150)=5/16小節分が瞬間的に画面に表示されていることになりますので、5/16小節分逆走させて直後に判定ラインまで瞬間移動させればいい感じに逆走になりますよね。だから、逆走を使用する場合は譜面情報のどこかに推奨緑数字を記載すると美しくなります。余計な小節線が見えていると思ったそこのあなた!鋭いですねぇ~。それは恐らく後半の順走部分で流れるはずの小節線が事前に上に流れていっているのだと思います。これを解消するには、どっかに適当にscroll10000とか入れておけばOKです。


3:scroll出現/消失バグ

さて、この変から複雑になってきますよ!では、まず代表的なscroll出現/消失バグを使用したギミックを御覧ください!

このように実ノーツが固定されているように見えながら何故かノーツが変化していくギミックです。特に名称が決まっているわけではありませんが、これはscrollの出現/消失のbeatoraja上でのバグを使用したギミックになりますので、ひとまず「scroll出現/消失」バグと呼ばせてください。1008さんのMaxi -C0ffee-は分解能が高すぎてもはや理解不能なレベルなので、もっと簡単なものを作ってお見せしますね。まずはこちらを御覧ください。

このように少しずつノーツが変化していくのは簡単に表現できますので、この譜面に関して説明していこうと思います。中身は以下の通りです。24分間隔でノーツ・不可視ノーツが流れるようになっています。基本的にはscroll=0.0で全体を止めて直前になったら高速移動させて、直後に移動させた分だけ元に戻してあげるという感じです。そして、空中のどの辺に固定させるかはどれだけ高速移動させるかに依存します。以下の譜面では80/1920、160/1920……560/1920小節と変化させています。

簡単ですね。さて、ここまでは単純ですが、皆さんは「どうして561という数字が登場するのか?」とお思いでしょう。では、この561という数字を変化させてみましょう。まずは1561にしてみます。すると……以下のような譜面の見え方になります。

あれ!?何も見えない!?そうなんです、これがbeatorajaの「scroll出現/消失バグ」なのです。あくまで仮説ですが恐らく「+1516」「-1481」などのscrollに関してはそれぞれの絶対値が関係しており、それが一定以上の値になるとscroll演出が見えなくなってしまうのです。そして、これは緑数字やHSを調整することでも実現可能です(例えばscroll1561を採用したとしても緑数字を上げたりHSを下げたりすると演出が可視化されたりします)。なので、Maxi-C0ffee-でもそうなのですが、適切な緑数字と白数字を事前に指定してあげないとこのギミックはいい感じに発動してくれないのです。では今回の「SUDなし」「緑300」ではいくつくらいが良い感じになるかというと……これは計算式は自分はわからないので地道に探すしかないです。あと追加ですが、徐々に出現するようにするにはscroll=0.0ではダメで例えばScroll=0.0625など小さい値にしてあげないといけないです。ではscroll=0.0625にしてみて561でいくとどう見えるか……こう見えます!!!

お、良い感じですね!これは「Scroll値」「SUD」「HS」「緑数字」などで変化させられますので、自分の想定する良い感じの変化が作れたらそれが再現できるように「緑数字」「SUD」を調整するようにアーティスト欄などに追記しておくのが親切です。それだけ脆いギミックですが、見た目は面白いですよね。

4:非アニメーション具現化

アニメーション具現化というと地雷などが一瞬にして実ノーツに変化してそれを叩くというギミックが作れますが、前述の通り瞬間移動で地雷→実ノーツと変化させることでそれを実現できます。scrollギミックてもアニメーションが組めますのでそれが出来るのですが、実はアニメーションではない方法で具現化をすることが出来るのです。これは地雷→実ノーツに変化させて叩かせることもできますし、逆に実ノーツ→地雷に変化させて叩かせることも出来ます。まずはこちらを御覧ください。

このように部分的に具現化したり単に地雷ノーツを叩いたりと色んなことが出来ます。では、その中身を見てみましょう。中身は凄く単純で実ノーツと地雷ノーツを離れて配置させて、scroll変化でそれらが重なるようにしているだけです。そして、上でちらっと話ましたが、ノーツが重なるときは後ろにあるノーツが上になるように表示されますので、実ノーツ→地雷の具現化をするときには地雷を後ろに、地雷→実ノーツの具現化をするときには地雷を前に置くようにします。これも前のギミックと同じでSUDや緑数字などに影響されて後ろの地雷(あるいは後ろの実ノーツ)が出現するタイミングが変わりますので、値次第では具現化が全く見えなくなって単に地雷を叩いているようにも見えますし、値によっては徐々に地雷に変化していくように見えたりもします(これも緑数字やSUDを事前に指定するように誘導すると良いです)。

さて、ここが少し難しいところです。基本的にはマイナススクロールで地雷ノーツを上に高速移動させるので、その分下に表示されて直前の実ノーツに重なって見えるというギミックなのですが、240/1920小節分だけ実ノーツより上にあるのに実際のscrollは-238/1920になっています。これはその補正のscroll命令が開始されるのが判定ラインより地雷ノーツが238/1920小節下に移動したときなので合計で-238戻すことになるということです。では何故その直後は+240で補正しているのかというと「2」「-240」という2つの命令を行うのに2/1920小節分の間隔を利用しているからです。238/1920だけ後ろに戻して上げている間に本来であれば2/1920進んでいるはずなので、戻した分の238だけでは不足しており238+2=240ということになるわけです。これがベースのscrollが0.0ならば240ではなく238で問題ありません。ここが少し面倒なところです。では、0.0625のときはどうなのですかと聞かれますと、これはもう誤差として考えちゃっています……笑

5:部分ワープ

部分ワープとはなんのこっちゃと思われるかと思いますので、まずはこちらを御覧ください。

普通に譜面がながれているはずなのにLNや疑似LN(オレンジの棒)が一瞬にして消えているように見えませんか?これが部分ワープです。やってることはもうここまでくればわかりますよね。1920分間隔のLNをscrollでびよーんと伸ばしてあげて、瞬間移動分だけマイナススクロールで戻してあげるのです。一応中身を載せておきます。例の一瞬で消える皿LNです。中身はこうですが、解読出来ますか?一応説明すると。1920分間隔で240scrollを置いて上げることで8分の長さのLNの見た目になりますが、100001倍BPMで一瞬にして終点に到達しますので、瞬間的にLNは消えます。240/1920小節進んだのでその分戻してあげる必要があるのですが、ベースのscrollが1.0なので-240戻すのではなく-238戻してあげてます(それぞれの命令を使用するのに2/1920小節分進むことになっているので)。さらに、100001倍BPMで移動した分を補正するためにstop30000を入れています。これは100001倍BPMの3/1920小節分ということなので、192×100001÷1920×3-192÷1920×3=30000、ということです。

6:マイナスscrollアニメーション

さて、scrollギミックで最も面白いといっても過言ではないのがマイナスscrollアニメーションになります!これはですね、とてもとても面白いです!まずはこちらを御覧ください!

え!?地雷があるのに普通にノーツ叩けるのですか!?明らかにアニメーションだからさっきのタイミング重ねるのとは全然違うし……。そうなんです、これがマイナスscrollアニメーションです。何が起こっているのか言葉で解説してみますと、実は実ノーツ部分とアニメーション部分が綺麗に分かれていまして、前半に実ノーツだけの部分、後半にアニメーションだけの部分を準備します。実ノーツ部分はscroll-1にしてBPM100001倍のアニメーションを組み、アニメーション部分は全体のscrollを1にして超高速で全てが一瞬で流れるようにしています。実際に何が起こっているかというと、実ノーツ部分が終わった後に超高速で大量のアニメーションが流れていっているのですが、実ノーツ部分の-1scrollに誘導されて後ほど流れるはずのアニメーションが事前に下から上に流れていくように見えているのです。だから実際は叩き終わった直後に物凄い速さでドカーンと大量の地雷やら不可視やらが流れているわけです。以下に簡単

な例を載せますね。

ここで大事なことはアニメーションはマイナスScrollで流れてきますので上の方にあるコマから順番に流れてきます。つまり、一番最初に表示したいコマを一番上に、一番最後に表示したいコマを一番最後に持ってくる必要がありますので、BPM変化で作成する普通のアニメーションとはコマの流れが逆転します。それだけ気をつけてください。ならば実ノーツ部分をscroll=1.0にしてアニメーション部分をscroll=-1.0にすれば良いのでは?と思うかも知れませんが、確かそれはbeatorajaの性質上うまく表示されなかった気がします。このへんは謎です。


以上が基本的なギミックの紹介になります。本当にこれらをベースにして展開しているだけですので、気合があれば何とかなります。メチャクチャ面白いアニメーションはメチャクチャ苦労してます。ホンマにコマ1つずつ作成してます。しんどいです。どこかで実際の譜面に関してギミックの解説が出来たらなぁと思っております。何かの参考になりましたら幸いです。皆さん、是非scrollギミックを作ってください!!私は……気が向いたら作ります笑

この記事が気に入ったらサポートをしてみませんか?