なさの雑記

アウトプットの掃き溜め

F10atmaneuverの譜面のギミックについて+感想もあるよ【BOFXV後日談】

 俺は曲を作る!やるぞやるぞやるぞ!とタスクを詰めまくったら予定が絶賛大炎上し、卒業が危うくなっています。

 どうもNASAです。人の身体は一つしかないことを忘れちゃいけない。

 f:id:nasashiki:20191123134040p:plain

 さて、今回はBOFXVの拙作「F10atmaneuver」の譜面のギミックについて解説します。

 

 

 とはいっても、既にReadmeである程度分かる人向けに説明はしてあるので、その文章を土台に「BMS制作わからん 譜面制作もっとわからん」みたいな人の中でギミック興味あるよ!という人向けに補足をしていきます。

 事前にお伝えします、まあまあ長い記事になります。覚悟の準備をしておいてください。あと最後に感想もあります。

 

 

 


 

 

 では早速解説に入りますが、ここからは同梱のReadmeファイル「_readme.txt」の一部と「_w_how_to_gimmick.txt」を引用しながら補足していきます。文章は多分前後すると思います。

 頭についてるwの意味は、草!ではなく、本体からテキストを見た時にreadmeが前に来るようアルファベット順で後ろに持っていくための配慮です。

 

 

F10atmaneuverのギミックの作り方

 

BPMと小節長

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

 

 STOP!既に抜けている工程があります。まずは画像を見てください。

f:id:nasashiki:20191123134604p:plain

 これはF10atmaneuverのI譜面をテキストで開いたものになります。譜面ファイルをテキストで開くとこんな感じなんですね。
 これらの文章の中で、#XXXYY:~ のXXX何小節目か、YY何を行うか(命令)を示しています。
 例えば、YY01だとBGMレーンの音の配置、02だと小節長、11~16,18,19は1P側の配置といった感じです。
 ここで、命令のないorデフォルトの数値と同じと認識されたYYの定義は全て省かれます。つまり、画像の001小節だと、スクラッチのみしか配置されていないため、クラッチを示す00116以外の11~15,18,19の記述は省かれています


 ここで重要なのは、今回のギミックには何としてもテキストでの小節長の編集が必要であることです。


 小節長のデフォルト数値は1、つまり4/4拍子なので、そのまま譜面を作るとテキストには表示されないことになります。それは困る!ので、今回の作品ではBPMと小節長をあらかじめ2倍にして作っています。

 作り方は、"Beat(拍子)"のタブを開き、001小節から曲の終わりまで全部小節長を2(8/4)にします。iBMSC/μBMSCでは、拍子の詳細設定にある「配置の絶対位置を保つ」にチェックを入れてから、同様の操作を行ってください。次に、初期BPMを2倍にします。
 ここからが重要で、次はテキスト形式で譜面を開き、001小節の前に「#00002:2」と入力します。これを行わないと、BPMを1/1000にした際に、プレイヤーは000小節目で13分待ちぼうけを食らい、考えるのをやめることになります。

 

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

 

 初期BPMと途中に挿入したBPMを1/1000にするというそのままの意味です。と言いたいところですが!拡張定義ってなんやねんと思われた方もいると思います。説明しましょう。

 

 BPMは本来03の定義で示されます。しかし、この定義は16進数であり、BPMが01~FF(=1~255)の整数の場合しか対応していません。

 そこで、拡張命令として拡張BPMという概念があります。定義は08です。そもそも拡張定義って書き方間違えてるなコレ。あらかじめ定義しておいたBPMを任意の箇所に引用することが出来るという、可能性の塊みたいな命令です。

 

f:id:nasashiki:20191123141845p:plain

 画像のように、#BPMXX (変えたいBPM)といった感じで定義し、あとで#XXX08:01と入力すると、そこからのBPMが定義した数値になります。便利!まあまず普通に譜面を作ってるうちはテキストから直接入力する機会はほぼないと思いますが!

 

3.小節長を1/1000にします。
メモ帳の置換を上手く使って、小節長を1/1000にしましょう。
("02:2"→"02:0.002"のように変換すると良いです)

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

 

 そのままの意味です。もし小節線を使った演出を仕込むなら、この工程はちょっと面倒なことになる、ということです。同梱譜面は結構面倒なことになってました。

 

 以上までの工程を行うと、「BPM0で譜面が動いてる!不思議~~~!!!」というBMSを再現することが出来ます。BPM0の謎はここまでで大体説明できたと思います。

 ちなみに、プレビューではLR2でもorajaでもBPM1と表記されると思いますが、これは本作品中最後のノイズの直後にBPM1を敢えて挿入したからです。もしこれを削除し、BPM1未満の地帯だけになれば、LR2のプレビューではBPM数値の表示を諦めます。こんな感じで。

f:id:nasashiki:20191123143946p:plain

本来のプレビューではこの表示が

f:id:nasashiki:20191123144014p:plain

こうじゃ!皆さんも使ってみてくださいね。使う機会あるか分かんないけど。

 

 

 そういえば、ここまでのBPM関連の話でもう一つ解説しておくべきギミックがあります。

 

BPM表示バグ(LR2限定)

 通常のBPMから0<BPM<1の領域にソフランさせた場合、LR2限定で特殊な現象が起きます。本作品の2:00あたりからが該当します。

 

 なんかBPMがうにょうにょしてますね。これはLR2の仕様(バグ)の一種です。ギミック譜面の中に表現としてしばしば用いられる技法で、本作品中でも終盤で色々ぶっ壊す展開になるので導入しています。

 本作品で言えば、最初のBPMを0.36に設定すると、初期のBPMは0と正しく表記されますが、サビ終わり(2:00くらい)でもう一回BPMレーンに0.36と置くと「ソフランした?」とLR2が認識し、そのパートからBPMうにょうにょが始まります。

  

 使いどころは少し限られますが、演出として面白いギミックですので、みなさんもLR2がメインストリームであるうちに使ってみては!とオススメしておきます。 

 

 

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

 譜面がワープしてきてびっくり!みたいな演出、憧れたことはありませんか?いいですよね、ワープ。ぼくは好きです。

 この「譜面をワープさせる」という技術の根本的な原理は「見えないところから急に譜面が登場すること」です。

 その方法は色々あるのですが、今回のようなBPM1未満という特殊な環境でも、ワープさせることが出来る方法があったので、紹介しておきます。

 

・beatoraja用の場合


1.SCROLL定義を使用するので、uBMSCを導入しましょう。
導入の仕方は各自調べること!

 

 各自調べて導入して!iBMSCとかBMSEが動けば流石に動くから!

 

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

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

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

 

 SCROLL定義は、その名の通り譜面のSCROLLスピードを直感的に調整できる機能です。大体下に示す画像のようなイメージ。

f:id:nasashiki:20191216152357p:plain

 

 これを前提知識として、実際の譜面内のワープ箇所を示します。

 

f:id:nasashiki:20191123145010p:plain

 

次に、同梱の解説文前半+この画像版の説明を置いておきます。

 

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

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

  SCROLLに65535が挿入されている225小節の頭がワープ点です。この225小節の小節長は1/32ですが、SCROLLによって65535倍に引き伸ばされているので、プレイ時に流れてくる見かけ上の小節長は65535/32=約2048になります。この時点で、プレイヤーは225小節が終わるまで、226小節以降の譜面を視認することはできません。しかし!225小節の実際の長さはわずか1/32しかないため、瞬く間に226小節以降の譜面が飛んでくることになります。

 

 これがSCROLLでのワープの原理です。面白いですよね。本作品では動画の0:37~で使っています。

 応用的な視点では、どんな値のBPMでも適用できるというのが非常に強い点です。恐らく、原理と方法さえ分かれば譜面制作初心者でも安易に仕込むことが出来ると思います。しかし、SCROLLはbeatorajaとbemuseしか対応していないという弱点があります。いつかorajaやbemuseがもっと盛り上がった時、最も重要視される命令だと考えています。

 

 余談ですが、SCROLL自体は、0を入れれば「ちゃんと時間が経過する」STOPになり、負数を入れれば逆走が出来る、かなり優秀で新規性のある命令です。詳しいことはまた別途解説記事が作られれば……。

 また、この辺りの話を最大限拡張した譜面がwitchcraft [14SCROLLMAGIC]なのでみんなも観ましょう。ギミックの自由度の高さが良く分かると思います。

 

・LR2の場合

 

 例によってまず当該箇所の画像を示します。

f:id:nasashiki:20191123152713p:plain

 

 同じワープなのにヤケに間隔空いてますね?なんでこんなことになるんだ!解説しましょう。

 

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

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

 

 この画像の場合だと、225小節の頭でワープさせたいので、そこにSTOP 1を置き、後からテキスト形式での編集でSTOP -1に置換しています。

 あと、少し手順が飛びますが、後から知ったので付け加えておくと、μBMSCでは直接STOP -1が置けるらしいです。びっくらこいた。ですので、4の手順は不必要になります。

 

 さて、STOP -1というパラメータが出てきました。本来、STOPは正の整数値が使われ、n/192分(nはSTOPに入力した値)の区間譜面の進行を止めるという命令です。テキスト形式では09になります。

 譜面の進行を止める命令に入る負数、一体これが何を意味するのか?それは同梱の解説にも示しています。

 

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

 

 凄くないですか?何その仕様?どうして教えてくれなかったの?

 それはこの仕様自体がLR2のバグだからです。 現状のoraja(ver0.7.5)ではこの定義は無視されるため、動作しません。これがLR2とorajaで譜面を分けなければならなくなった決定的な要因です。ぐぬぬ

 そしてこのSTOP -1はあんまり融通が利かないため、次のような操作を行っています。

 

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

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

 

 今回の解説内で一番分かりにくい部分です。Readmeの解説部分を後から見返したんですけど、この文で理解出来る人間いなくない?

 Readmeを書いていた時は結構追い込まれた状態だったので、色々思案した結果こんなクソ文になっていますが、改めて考えるととても単純な原理だったので、ここだけReadmeガン無視で解説します。(Readme読めばわかるとか言っといてごめんなさい)

 

 STOP -1は1/192小節分ワープすると説明しましたが、本作品の1小節当たりの小節長は0.002(=1/500)なので、STOP -1が1個あるだけで、飛んでくる方のワープに足りるくらいの移動距離があります

 そこで、ワープさせる始点にSTOP -1を置き、後で小節長を1/1000した際にワープ区間の小節長が1/192になるよう、譜面制作段階ではワープ区間の小節長を1000/192にします。この方法を操作2,3で説明しています。めっちゃ簡潔やんけ。

 

f:id:nasashiki:20191216164109p:plain

こういうことしてるわけですね、ややこしい!

 BPMと小節長を1/1000にしたなんてイレギュラーなことをやったせいでこんなことになっているだけで、普通に譜面をワープさせるだけならもっと手間かからないので安心してください。この記事では本作品での特例を取り扱っているだけなので……怯えないで……ギミックはいいぞ……。

 

 

 使用したギミックについての解説は以上になります。分からないことがあったら直接DMででも聞いて!以下感想!!!!!

 

 

感想

 この度は沢山のプレイインプレありがとうございました。個人スコア17位ですって?身に余り過ぎるくらいの高評価ですねこれは……。「みんなギミック譜面に興味ないのかな……」と内心悄気かけていた筆者の心は無事救われました、ありがとうございます。また、インプレに賛否が出るのは覚悟していたのですが、多くのプレイヤーの方々に前向きな捉え方をして頂けたようで大変嬉しい限りです。

 これだけインプレが伸びたのは、曲のクオリティだけでなく、譜面のコンセプトBGAの調和という総合的に合わさった結果なのかなと考えています。こういう言い方をするとかなりアレですが、「まだちゃんとBMSとして見てくれてるのね!」という言葉が本音に非常に近いです。

 個人的には、海外の方からの評価が結構高かったな~という印象があります。何が琴線に触れたのかは正確に推測できない部分ではありますが、「曲の奇特さ」と「譜面」が色々と上手い事働いてくれたのかな、というふわっとした推察をしています。


 ここからはちょっとだけ作品について感想的な何かを述べておきます。

 

 今回の作品は概要やReadmeにも書いた通り、「譜面でやりたかったこと」が最初のコンセプトになっています。なので、コンセプトにあった曲とBGAが必要になるわけです。


 正直なところ、曲に対する自信が水素原子一個分ほどしかないので、「曲がコンセプト負けするんじゃないか……」と発表まで非常に不安でした。なので、デジタルな印象とドライな雰囲気を目指して、不安に立ち向かえるようにクオリティを高めるぞ!と色々限界(多忙)な状態で作曲していました。メンタルきちい~~(^~^)と音を上げたり上げなかったりしていましたが、最終的にはある程度プレイヤー側に思い通りの雰囲気が伝わっていたようで、ようやく肩を撫で下ろすことが出来ました。

 mix段階でとても苦戦していたところを手助けしてくれたかきぴーかなでや、完成した曲や譜面に対して前向きなコメントを残してくれたおとしぶたとえおりあさんには大変感謝しております。自分がチーム戦の恩恵を一番受けていた気がするな!

 あとはReadmeでも困っていましたが、正確な曲のジャンルは……何でしょう……?新しく名づけるなら、Chipbreakから派生して「Bitbreak」とか付けてみたいですよね。この手のジャンルは結構お気に入りということが作る中で分かったので、これから積極的に作っていきたいです。

 

 BGAはインプレ返しにも書きましたが、めっちゃ突貫です。作業日数2日とかだった気がします。一応0と1しか書いてない画像を基盤にする!という部分までは頭の中で決まっていたので、あとはノリと勢いで作業をシバきました。毎回頑張って映像まで表現しようとBGAを作るんですが、映像の知識が無さ過ぎて毎回クッソアナログな作業を強いられています。今回の連番も1枚ずつ全部手動で作ってます。正直なところそろそろ誰かに頼みたいです……。

 

 あとこれは完全に個人的な主観というか、ちょっと意外だな~と思ったので触れておくと、HS-FIX使ってない人結構いるんだな~!って。自分の周囲しか知る機会がなかったので、今までは8割くらいの人がHS-FIX使ってるのかな~というイメージでした。なのでインプレで「初めてHS-FIX使いました!」とか見ると、ちょっとだけ申し訳ない気持ちになったりならなかったりしました。まあここは一つBMSにはこういう可能性もあるということで!

 

 

 

 感想は以上なんですが、最後にちょっとだけ宣伝をば。

 

 しれっと難易度表を立ち上げました。その名も「ギミック譜面案内所」。ギミックを含む譜面をべべッとまとめた表になります。まだまだ追加できる譜面はあると思うので、是非とも「こんな譜面あるよ!」と気軽に提案していただければ幸いです。

 

ギミック譜面案内所 (@Gimmick_info) | Twitter

 

 それでは!ギミック譜面はいいぞ!