simai語の譜面書式

「simai語の譜面書式」の編集履歴(バックアップ)一覧に戻る

simai語の譜面書式 - (2023/07/25 (火) 18:33:51) のソース

#contents
※BREAKは、それぞれのノーツの項で説明します

*simai語について

simai語とは、[[maimai]]に登場する様々なノーツを一般的な文字で表現することを目的とし、2013年にCelecaが定義した記法です。
半角英数記号を組み合わせルールに従って記述することで、理論上はあらゆるmaimaiの譜面を文字だけで正確に書き起こすことができます。
この記法は2013年2月5日に公開されたmaimai用譜面シミュレータ「simai」で初めて用いられました。
その後maimaiを題材とした様々なソフトが有志によって制作されており、
simai語はほとんどのソフトで譜面を表すための記法として使われております。

2023年2月5日にsimaiの公開を終了させていただく一方で、
simai語を使用するユーザーがまだ一定数存在している為、このページの作成に至りました。
ソフトによっては、そのソフト独自の記法を実装してsimai語を拡張・発展させたものがある場合もありますが、
ここに記載しているのは「『simai語』として正式に定義されている記法」のみとなります。
simai語を用いたソフトの制作を考える場合、このページの記法を取り扱えるように開発を行っていただくことを推奨します。
またそのようなソフトを作られる場合、simai語の権利はCelecaが持っている為、
可能であれば、Celecaへご一報いただければ幸いです。連絡なしでも問題ありませんが、あれば嬉しいです。

*ボタン番号

&sizex(7){ ⑧① }
&sizex(7){⑦  ②}
&sizex(7){⑥  ③}
&sizex(7){ ⑤④ }

maimaiには入力デバイスとして8つのボタンがあります。
時計の1時の方向にあるボタンを1番として、時計回りに1~8番と定義されています。
どこのボタンまたはセンサーにどのようなノーツがやってくるのかを表す際に、このボタン番号を使用します。

*譜面構成と終了

simai語は、カンマ「,」とノーツ情報を書き連ねていくことで譜面を構成します。
例えば、カンマが1秒の長さを持っているとします。この時カンマを10個記述すると、10秒の長さがある譜面となります。

 【1,1,1,1,1,1,1,1,1,1,】と記述すると、1秒ごとに1番にTAPが10個発生する譜面となります。

一度譜面が始まってからはカンマとノーツ情報で譜面を構成していけるのですが、
例えばフェードインから始まるような曲に譜面を宛てる場合、そのために大量のカンマを記述しなければならなくなります。
その手間を省くため、音源を再生してから何秒後に譜面の最初を持ってくるのか、というパラメータがあります。
simaiでは「first」というパラメータがこれを担当します。

 譜面が始まるタイミングは厳密に正確に決める必要があるため、たいていの場合、1.234秒のように細かい小数を設定することがほとんどです。
 もしfirstが1.234秒であれば、同じ【1,1,1,1,1,1,1,1,1,1,】という譜面でも、
 再生から1.234秒、2.234秒、3.234秒……10.234秒に1番にTAPが発生する譜面となります。

現実の音楽で使われる楽譜にも終止符があるように、simai語も終わりを定義しないと延々と音源が流れ続けてしまいます。
※simaiではMP3の長さよりも長い譜面を書いても、MP3を最後まで再生した時点で終了します

 譜面の終了を定義するには「E」を記述します。
 firstが1.234秒で「1,1,1,1,1,1,1,1,1,1,E」という譜面だった場合、
 10.234秒までは前述の通りで、最後のカンマも1秒の長さを持っていますので、11.234秒まで流れて初めて譜面が終わります。

実際にsimai語で譜面を記述すると、大量のカンマとそれぞれのノーツ情報、そして最後にEが書かれる長い文字列となります。
文字列の途中で改行やスペース・タブスペースを挟み、見やすく整形することもできます。
譜面の分析を行う際にこれらの文字はスキップするようになっています。

*BPM、音符の長さ

先程の例ではカンマが1秒の長さを持っていましたが、曲のテンポ(BPM)や音符の長さによって持たせたい長さはその都度変わります。
わざと計算しにくいBPMで計算しますが、BPM174の16分音符1つ分の長さは0.08620689655……秒となります。
この長さをカンマに設定させれば、正確にBPM174の16分音符の長さでノーツを並べることができるのですが、
このような計算を手計算で毎回行っていたのでは大変です。

 simai語では先述のような「BPM174の16分音符」という設定を【(174){16}】と書きます。
 BPMが分かっていなければ音符の長さも計算できないので、必ずBPM→音符の長さの順で書きます。
 両方の数値に小数を使っても問題ありません。

 音源によっては、特殊な効果音などに譜面を宛てようとしてもBPMが[[分からない]]、
 あるいはボーカル合わせな譜面を宛てたい、という場合があるかもしれません。
 その場合、例えば【{#0.35}】と書くと、それ以降のカンマの長さは0.35秒となります。
 この記述の場合、すでにカンマの秒数が確定しているので、音符の長さを改めて指定する必要がありません。

BPMと音符の長さは、譜面のどこでも変更することができます。

*TAP

ここからは、カンマに書き添えるノーツ情報の説明となります。

一番基礎的なノーツであるTAPは、そのボタン番号そのものを記述します。

 1番に発生するTAP……【1,】
 5番に発生するTAP……【5,】

 BREAK TAPにする場合、カンマの前に「b」を加えて【1b,】のようにします。

*HOLD

[[HOLDを配置する]]ためには、ボタン番号に加え、そこをどれくらいの長さ押し続けさせるのかを設定しなければなりません。
例えば、BPM174の2分音符1つ分の長さだけ押し続けさせる場合、長さは0.68965517241……秒となります。
しかしこれもBPMの例と同じように、毎回手計算するのは大変です。

その時点でのBPMが174ということは、その時点よりも前に【(174)】を記述しているはずです。
足りないのは【2分音符1つ分】という時間の長さです。
この長さをsimai語では【[2:1]】と書きます。コロンの前が音符の長さ、後ろがその音符何個分かを表します。
このような長さの表し方はHOLDとSLIDEで使用します。

実際に記述する際は、ボタン番号に加え、HOLDであることを明らかにするために「h」を後ろに加えます。
さらに後ろに上記の長さの表記を加えます。

 5番に2分音符1つ分のHOLD……【5h[2:1],】

これが基本的な記法ですが、厳密に押し続けさせる秒数を指定したい場合は以下のように記述します。

 4番を5.678秒押し続けさせるHOLD……【4h[#5.678],】
 4番をBPM150の2分音符1つ分の長さで押し続けさせるHOLD……【4h[150#2:1],】

 BREAK HOLDにする場合、「h」の後ろに「b」を加えて【5hb[2:1],】のようにします。
 【5bh[2:1],】のように、bとhの位置が入れ替わっていても構いません。

*SLIDE (基本・形状)

[[SLIDEを配置する]]ためには、始点と終点となるボタン番号、それらをどのような形で結ぶのか、
どれくらいの時間をかけて流れるのか、といった様々な要素を設定しなければなりません。

SLIDEはmaimaiの歴史の中でも発展がめざましく、様々な要素が実装されましたが、
ここでは基本的な記述と、SLIDEの形状について説明します。

基本的な記述フォーマットは、【始点・形状・終点・移動時間】の組み合わせになります。

 1番から4番を、直線形で、8分音符3つ分の時間をかけて移動するSLIDE……【1-4[8:3],】

後ろの【[8:3]】の部分は、HOLDで説明した時間の長さと同じ考え方で指定します。
SLIDEの場合、まず星形のTAPが判定ラインに届いてから、実際に動き出すまでには待ち時間があります。
具体的にはその時のBPMの一拍分の長さになります。
星が移動するのにかかる時間と、動き出すまでの待ち時間のそれぞれを直接秒数で指定したい場合、以下のように記述します。

 現在のBPMが120で、1番から4番を、直線形で移動するSLIDEを例とすると、
 BPM160の8分音符3つ分の時間をかけて移動するSLIDE……【1-4[160#8:3],】
 BPM160の待ち時間の後に、2秒間かけて移動するSLIDE……【1-4[160#2],】
 3秒の待ち時間の後に、1.5秒間かけて移動するSLIDE……【1-4[3##1.5],】
 3秒の待ち時間の後に、現在のBPMの8分音符3つ分の時間をかけて移動するSLIDE……【1-4[3##8:3],】
 3秒の待ち時間の後に、BPM160の8分音符3つ分の時間をかけて移動するSLIDE……【1-4[3##160#8:3],】

SLIDEには様々な形状があります。形状を表す記号とともに説明します。

 「-」(直線形)……始点から終点を直線で結ぶ
 「>」「<」「^」(外周形)……始点から終点を画面の外側をなぞるように結ぶ
  始点から右に向かうなら「>」、左に向かうなら「<」を使用し、距離が全体の半分未満なら、終点に対する向きを考えずに「^」で記述できる
 「v」(V字形)……始点から中心を経由して終点を結ぶ
 「p」「q」(p字形、q字形)……中心の周りで円を描くように湾曲しながら始点と終点を結ぶ
 「s」「z」(稲妻形)……稲妻を描くように3本の短い直線を繋げて始点と終点を結ぶ
 「pp」「qq」(大きなp字形、大きなq字形)……中心から外周を結んだ直線を直径とした円を描くように湾曲しながら始点と終点を結ぶ
 「V」(大きなV字形)……始点から通過点(ボタン)を中継し終点を結ぶ。始点から通過点は短い直線形で、通過点から終点は任意の長さの直線形で結ぶ
 「w」(扇形)……始点が1点に対し終点が3つあり、その終点を全て覆うように大きな軌道で結ぶ

「V」(大きなV字形)のみ、始点と終点の他に通過点を表すボタン番号が必要になるため、
例えば【始点が1番、通過点が3番、終点が5番】となるSLIDEの軌道部分は「1V35」と記述します。
また、「v」(V字形)や「p」「q」(p字形、q字形)など、軌道の途中で折れ曲がったり湾曲したりするSLIDEがありますが、
それらを含め、あらゆるSLIDEは必ず始点から終点まで一定のスピードで流れます。SLIDEの途中で流れる速度が変わることは、どのようなSLIDEでも発生しません。

「w」(扇形)は始点に対する終点は必ず対角線上になければいけないなど、SLIDEの形によっては始点に対する終点が限定されることがあります。
それぞれの形における、始点と終点を設定した時にSLIDEが描画できるかどうかの対応表を以下に示します。

 BREAK SLIDEにする場合、「]」の後ろに「b」を加えて【1-4[8:3]b,】のようにします。

**全SLIDEの始点・終点の関係表
#image(slides.png)

*SLIDE (同始点・連結)

**同始点SLIDE

同始点SLIDEとは、ひとつの星形TAPから2本以上の軌道が伸びているSLIDEのことを指します。
始点が同じであること以外、SLIDEごとにあらゆるパラメータが違う可能性があるため、各SLIDEの要素を1本ずつ記述します。
SLIDEごとに流れる速度を変えることもできますが、星が流れだす瞬間は同じになるため、これらのSLIDEはEACHとして扱われます。

 1番から4番を、直線形で、4分音符3つ分の時間をかけて移動するSLIDEと、
 1番から6番を、外周を沿って、8分音符5つ分の時間をかけて移動するSLIDEを同始点SLIDEとして配置する
 ……【1-4[4:3]*-6[8:5],】

始点のボタン番号を先頭に記述した後は、それ以降そのボタン番号を記述する必要はありません。
2本目のSLIDEのさらに後ろに「*」を追加し続けていくこともできます。

**連結SLIDE

連結SLIDEとは、複数のSLIDEの始点と終点部分をつなぎ合わせ、それらをまとめて1本として扱うSLIDEです。
例えば「1V75」という軌道は、内部的には「1-7」「7-5」の2本のSLIDEが1本にまとめられたものでしたが、
それが大きなV字形にとどまらず、あらゆる形かつ2本以上のSLIDEをつなぎ合わせたものを指します。
とんでもなく長い連結SLIDEでも、やはり始点から終点まで一定のスピードで流れるように計算されます。

 1番から4番を直線形で、4番から7番をq字形で、7番から2番を直線形で、全音符2つ分の時間をかけて移動するSLIDE
 ……【1-4q7-2[1:2],】

まずは辿る軌道を次々に並べ、流れる速さは一番最後に記述します。

このSLIDEの場合、1番から最終的に2番に辿り着くまで一定のスピードで星が流れ続けますが、
これらの速度をSLIDEごとに指定したい場合は以下のように記述します。

 【1-4[2:1]q7[2:1]-2[1:1],】

ただしこの場合は、全ての個別のSLIDEに対して必ず速度の設定を行ってください。そうでない場合はエラーとなります。

 連結SLIDEをBREAK SLIDEにする場合、最後の「]」の後ろに「b」を加えます。
 SLIDEごとに速度の設定を行う場合でも、「b」を加えるのは最後の「]」の後ろのみです。
 連結SLIDEの中で部分的にBREAK SLIDEを設定することはできません。
 必ず連結した1本のSLIDEとして通常SLIDEかBREAK SLIDEのどちらかになります。

*TOUCH、TOUCH HOLD、花火エフェクト

**TOUCH

maimaiでらっくすにおいて、プレーヤーが触れることができる画面の領域には34か所の区画が設けられています。
これら全てにセンサーによる接触判定があり、SLIDEは特定の順番で接触判定がなされた場合に処理することができます。
でらっくす以降はこのセンサーを直接触れるノーツが搭載されました。それがTOUCHとTOUCH HOLDになります。

また、区画は大きく5つのグループに分けられており、
ボタンに隣接するように設置されたAグループ、Aグループと中央の間を縫うように設置されたBグループ、
中央を担当するCグループ、Aグループ同士の区画の間を埋めるように設置されたDグループ、
Dグループより少し内側に、Bグループと隣接するように設置されたEグループがあります。
中央のCグループは2つ、それ以外のグループは8つの区画を持ち、時計回りに番号が振られています。

**センサーの配置
&image(bg.jpg)

TOUCHを配置する場合は、配置したい位置のセンサー番号をTAPと同様に記述します。

 B1に発生するTOUCH……【B1,】
 D4に発生するTOUCH……【D4,】

 中央のセンサーは、区画上はC1、C2の2つに分けられていますが、それぞれにTOUCHが発生することはなく、ど真ん中にTOUCHが出現します。
 そのため、中央に発生するTOUCHは番号分けを行わずに【C,】と記述することができます。
 これを【C1,】【C2,】のように記述してもエラーにはならず、【C,】と同じとみなされます。

**TOUCH HOLD

TOUCH HOLDは、センサーを押し続けるノーツとなります。
リザルトではHOLDとしてカウントされます。獲得できるスコアもHOLD=TOUCH HOLDです。

記法的にも、TOUCHとHOLDをそのまま組み合わせたような内容になります。
ボタン番号をセンサー番号に変えるだけでTOUCH HOLDとなります。

 Cセンサーに4分音符3つ分のHOLD……【Ch[4:3],】

TOUCHがFESTiVALから34区画全てに出現するようになった一方、
TOUCH HOLDはでらっくす初代から、少なくともUNiVERSE PLUSまではCセンサーにしか出現していませんが、
センサー番号をC以外にすれば、どこにでもTOUCH HOLDを出現させることができます。

**花火エフェクト

花火エフェクトとは、特定のTOUCHに触れた時、その場所から花火が広がるかのように現れる虹色の放射状の演出を指します。
でらっくす稼働当時にこのエフェクトの公式的な呼び名がなかったため、3simaiでは便宜的に「花火エフェクト」という名前で取り扱っています。

これを発生させるためには、発生させたいセンサー番号の後ろに「f」を付加します。

 B7に発生するTOUCHに花火エフェクトをつける……【B7f,】
 花火エフェクト付きで、Cに全音符2つ分のTOUCH HOLD……【Chf[1:2],】

TOUCH HOLDの場合、HOLDを表す「h」と、花火エフェクトを表す「f」が併記されることになりますが、
「hf」と「fh」のどちらで記述しても構いません。

*EACH

2つ以上のノーツが全く同じタイミングで発生する場合、EACHとして扱われます。
SLIDEの場合、星の移動時間が異なっていても、流れ始める瞬間のタイミングが同じであればEACHとなります。
EACHと扱われたノーツは色が黄色に変化しますが、BREAKのみ色は変化しません。

構成するノーツの要素を「/」で挟むように記述することでEACHとなります。

 1番TAPと8番に2分音符1つ分のHOLDのEACH……【1/8h[2:1],】
 
 順番はどちらでもよく、【8h[2:1]/1,】と記述しても問題なく動作します。
 ただしSLIDEに関しては、【1-4[8:1]/2-6[8:1],】のような記述をした場合、【2-6[8:1]】よりも【1-4[8:1]】が前面に来るように表示されます。
 つまり、先に書いたSLIDEほど前面になるように表示されます。
 
 3つ以上の要素でも、ノーツAの情報/ノーツBの情報/ノーツCの情報……と記述することでEACHとして扱うことができます。  
 
 TAP同士のEACHに限り、「1/2,」のように記述する方法とは別に、「12」と記述することもできます。
 ひとつでもTAP以外のノーツが混ざる場合は「/」で挟む記述を使ってください。BREAKが絡んでも「/」が必要となります。

*EXノーツ

TAP、HOLD、BREAKにはEXノーツの概念が存在します。
EXノーツに設定されたノーツは、GOOD以上の判定で処理できれば、確実にCRITICAL PERFECTになります。
譜面再生だけを行うソフトでは、これを設定せずとも確実にCRITICAL PERFECTのタイミングで処理しますが、
公式譜面を再現する場合や試技が行えるソフトでは需要が見込まれるため、記法を定義しています。

各ノーツをBREAKに変更する時の書式に近く、同じ要領で「x」を加えます。

 1番に発生するEX-TAP……【1x,】
 3番に発生するEX-HOLD……【3hx[α:β],】
 5番に発生するEX-BREAK……【5bx,】
 7番に発生するEX-BREAK HOLD……【7bxh[α:β],】
 
 「x」、「h」、「b」が2文字以上併記される場合、どのような順番で書いても構いません。

*その他の特殊な記法

ここに定義している記法は、MURASAKiで搭載された宴譜面など、特殊な譜面を記述する際の手助けとなりえる記法です。

**通常TAPを星形TAPに変更する

 1番TAPは【1,】と記述しますが、「$」を加えて【1$,】と記述すると、SLIDEを記述した際に現れる星形TAPに変化します。
 BREAK TAPやEX-TAPと併用することもできます。
 「$」、「b」、「x」が2文字以上併記される場合、どのような順番で書いても構いません。
 
 また、「$」を2つ重ねて「$$」にすると、その星形TAPが回転するようになります。
 この時の星形TAPの回転速度は一定の速度になります。

**星形TAPを通常TAPに変更する

 【1-5[8:1],】のようにSLIDEを記述した場合、1番TAPは自動的に星形TAPに置き換わりますが、
 「@」を使って【1@-5[8:1],】のように記述すると、この星形TAPが通常TAPに変化します。
 SLIDEは通常通り処理されるため、通常TAPからSLIDEの矢印が伸びるという図になります。
 
 こちらもBREAK TAPやEX-TAPと併用することもできます。
 「@」、「b」、「x」が2文字以上併記される場合、どのような順番で書いても構いません。

**疑似TAPとなるHOLD、疑似TOUCHとなるTOUCH HOLDを記述する

 【3h[1:1],】というHOLDがあると仮定して、音符の長さを極限まで短くしていくと、
 押し続ける長さが一瞬になり、HOLDの長さも縮まることで六角形のTAPのような見た目になります。
 【3h[1000:1],】のようにすれば、おおむねそのようなHOLDを表せますが、
 長さの指定の記述を外して【3h,】と記述することで、簡単に表現することができます。
 
 TOUCH HOLDでも同様の記述が可能で、【Ch,】と記述すると、処理した瞬間にPERFECT判定になるTOUCH HOLDとなります。
 
 これを使うことで、疑似的なTAPやTOUCHを表現することができます。
 なお、この記述は内部的には【[1280:1]】の長さを指定したものとして扱われます。
 公式が販売しているファンブックの中で、音符の長さを1280分の1分音符に設定していることを仄めかしているためです。

**疑似EACH

 ほぼ同じタイミングであるが、完全に同時ではない2つのTAPを記述する場合、
 
 {96}
 1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
 {8}
 ~~~
 
 このように該当部分の音符をかなり細かくしなければなりません。
 この例では96分音符でずれを表現しましたが、もっと細かい音符を指定したい場合はさらに大変になります。
 公式譜面を厳密に再現することが目的であれば致し方ない部分もありますが、
 自由に譜面を作成している場面で意図的にこのような表現をしたい場合は大変です。
 
 このような、「1番TAPと2番TAPはほぼ同じタイミングだが、2番TAPがほんのわずかに遅い」EACHのようなものを表現する記法として、
 【1`2,】という記述が使えます。
 
 この記述の場合、2番TAPは1番TAPよりも0.001秒遅いTAPとして内部的に処理されます。
 タイミングが同時である、というEACHの条件を満たしていないので、TAPが黄色くなることもなく、リザルトのEACHのカウンターも増加しません。
 【1`2`3/4,】のように記述すると、1番TAPより0.001秒遅れて2番TAPが、それよりさらに0.001秒遅れて3番・4番のEACH TAPが配置されます。
 
 なお、「`」の記号はShiftキーを押しながら「@」を押すことで入力できます。

**星形TAPが存在しないSLIDE

 SLIDEを配置すると、その始点に必ず星形TAPが現れますが、この星形TAPをなくすことができます。
 
 【1-5[2:1],】というSLIDEがあると仮定して、
 【1?-5[2:1],】と記述すると、星形TAPは現れず、移動する星のフェードインのみ処理されます。
 【1!-5[2:1],】と記述すると、星形TAPは現れず、移動する星のフェードインも処理されず、流れ始めるタイミングで初めて星が現れます。
 いずれにおいても、SLIDEの矢印のフェードインは行われます。
 
 「?」と「!」の使い分けですが、文字や記号などを表すような譜面を作る場合は、どこからなぞり始めるのかを明確にするために「?」が、
 一筆書きのような譜面を作る場合は、余計な星を画面に表示させないために「!」が向いているかと思います。

#comment