Seaurchin Wiki

The Ground Slider Simulator

ユーザ用ツール

サイト用ツール


wiki:score:format

Susフォーマット

現在のバージョンは v2.17.0 です。

概要

susフォーマットは、bmsフォーマットをベースに例のゲームの譜面を再現できるように改変を加えたものとなっています。 互換性はほとんどありませんが、そもそもこのゲームは他と違ってノーツの長さから変わってきやがるので互換性を維持するのは無理があるというものです。

現段階ではLR2などが対応している譜面の制御構造には対応していません。仕方ないね。

仕様

  • susフォーマットの規定のエンコーディングはUTF-8です。BOMの有無は問いませんがない方がいいです。SJISもUTF-16もアウトです。うん
  • susフォーマットでは先頭が'#'でない行は全てコメントとみなされます。よってこのファイル自体も有効なものです。

また、“このように”文字列リテラルの形で表されている部分は““がなくても多くの場合正常に動作しますが、わかりやすさのためにくくるべきです。

  • 文字列リテラル以外の部分で大文字と小文字は区別されていません。この仕様は将来変更される可能性があります。

ヘッダ

susフォーマットで有効なヘッダは次の通りです。同じヘッダを複数記述した場合は後の方が適用されます。

#TITLE "Title text"

曲のタイトルを指定します。現時点ではU+0000~U+FFFFの文字が正常に表示できます。

#ARTIST "Artist name"

曲のアーティストを指定します。表示可能な文字は#TITLEに準じます。

#DESIGNER "Score Designer"

譜面製作者を指定します。表示可能な文字は#TITLEに準じますが、そもそもまだAPIを実装してないです。

#DIFFICULTY 0~4 or "n:type"

譜面の難易度を指定します。レベルではないです。パラメーターには数値か文字列を指定できます。

  • 数値を指定する場合、次の対応となります。
    • 0: BASIC
    • 1: ADVANCED
    • 2: EXPERT
    • 3: MASTER
    • 4: WORLD'S END
  • 文字列を指定する場合は以下のとおりになります。
    • “4”のみ: WEという事実のみ
    • “4:両”: 記号指定
    • ☆の数はPLAYLEVELで表現されます。PLAYLEVELを2にした場合☆☆になります。

#PLAYLEVEL 0~

数値のレベルを設定します。任意の正の整数が設定できますがあんまり非常識なのはやめてください(圧迫面接にLv94とかつけるのはokです)。末尾に+をつけることで11+,12+などに対応できるつもりですが、パーサー作る際には解析はまぁなんとかしてください。

#SONGID "some string"

楽曲IDを文字列で指定します。これはsus独自のヘッダで、主に楽曲選択での表示を適正化するために用います。差分・発狂譜面などはもとの譜面のIDを保持するべきです。

#WAVE "filename.wav"

楽曲ファイルのパスを指定します。この際、susファイルの位置からの相対パスで認識されます。現在対応しているのはWaveとOgg VorbisとMP3(のはず)です。おすすめはOgg Vorbisですね。

#WAVEOFFSET 0.00

楽曲のオフセットを秒単位で指定します。正の値を指定すると譜面より遅れて再生が開始します。 あんまり早くすると開始前メトロノームがバグります。

#JACKET "jacket.jpg"

ジャケットの画像ファイルを相対パスで指定します。サイズは640×640、フォーマットはbmp/jpg/pngです。ただしサイズにかんしてはスキンの都合なのでうまく作ると任意のサイズに対応できます。

#BACKGROUND "image.jpg"

背景画像を相対パスで指定します。サイズは1280×720でほかはジャケットと同じ感じです。

#MOVIE "movie.mp4"

背景動画を相対パスで指定します。任意のサイズが画面いっぱいに拡大されて描画されます。ということでサイズは16:9推奨です。 使用可能な形式は何でしょうね。とりあえずmpgとmp4は使えると思います。

#MOVIEOFFSET 0.00

背景動画のオフセットを秒単位で指定します。正の値を指定すると譜面より遅れて再生が開始します。 マイナス値の場合は譜面開始時点のフレームにシークされます。

#BASEBPM 120.0

スクロール速度の基本値となるBPMを指定します。指定しない場合は開始時のBPMが適用されます。 例えば曲中のBPMが60と240しかない場合に#BASEBPM 120.0を指定すると、60のところでは0.5倍速、240のところでは2倍速でスクロールするようになります。

#REQUEST "..."

実装依存性があったり個別のディレクティブ用意するまでもなさそうな動作を設定します。現在実装されているのは以下のものです。

  • ticks_per_beat <正の整数値>
    • 1拍あたりのTick数を設定します。
    • 主にHSタイムラインの指定に影響します。
    • 2^n \* 3 \* 5 の数値がおすすめです。
  • metronome [disabled/enabled]
    • 曲開始前のメトロノームの有無を設定します。
  • enable_priority [true/false]
    • 後述する優先度付きノーツ描画の有効・無効を設定します。
    • 使う場合は有効必須です。
  • segments_per_second <正の整数値>
    • 曲線Slideの分割数を指定します。
    • デフォルトは20です。

データ

データ行は #mmmtl か #mmmtlx で始まり、コロンで区切って譜面データを記述します。 mmmは小節番号(000~999)、tはレーン種別(1~5)、lはレーン番号(0~f)、xはロングレーンの識別番号(0~z)です。ショートノーツのレーンでこれを指定することはできません。 データは1単位あたり2文字で、そのデータ行における小節の分割数はこのデータ単位の数で決定します。 データの1文字目は種別、2文字目はノーツ幅です。

ロングレーンの識別番号は、扱いがやや特殊です。 全ての識別番号は、終了を同じタイミングで開始を行えます。 全ての識別番号は、種別(SLIDE/HOLD/AIR)が違えば、同じ識別番号を同時に使用する事が可能です HOLDの識別番号はレーンが違えば、同じ識別番号を同時に使用する事が可能です。 要するに、可能な限り使い回しが出来るようになっています。

#mmm10 ~ #mmm1f

地を這うショートノーツ用レーン、Tap Ex-Tap Flick Hell-Tap(未実装) Airが該当します。

  • 00, 10, 20, … z0 : なし。みやすさのためにI0やl0を一部に使うのもありですね。
  • 11, 12, … 1g : Tap。
  • 21, 22, … 2g : ExTap。
  • 31, 32, … 3g : Flick。
  • 41, 42, … 4g : HellTap。
  • 51, 52, … 5g : (0.31.0以降) AwesomeExTap(やべーやつ) 上方向。
  • 61, 62, … 6g : (0.43.0以降) AwesomeExTap(やべーやつ) 下方向。

#mmm50 ~ #mmm5f

Airノーツ用レーンです。上のショートノーツレーンとは別に指定する必要があります。

  • 11, 12, … 1g : 上Air
  • 21, 22, … 2g : 下Air
  • 31, 32, … 3g : 左上Air(↖)
  • 41, 42, … 4g : 右上Air(↗)
  • 51, 52, … 5g : 左下Air(↙)
  • 61, 62, … 6g : 右下Air(↘)
  • 71, 72, … 7g : 地面付き上Air
  • 81, 82, … 8g : 地面付き左上Air(↖)
  • 91, 92, … 9g : 地面付き右上Air(↗)

地面付きとあるものは、ショートノーツの上に(通常緑色の)Air用ノーツがついているものです。 明示的に指定しなくても、「ロング系ノーツの終点と完全に重なっている場合」か、 もしくは「どのノーツとも重なっていない場合」は自動的に地面付きになります。

#mmmk0x ~ #mmmkfx

  • #mmm20x ~ #mmm2fx : Hold用レーン
  • #mmm30x ~ #mmm3fx : Slide用レーン
  • #mmm40x ~ #mmm4fx : Air-Action用レーン

この3つは全てロング扱いです。Air-Actionがなぜロングなのかは補助線の存在に理由の一端があります。 Holdは曲げられませんが、AirActionは曲げることができます。用途はわかりませんが。

  • 11, … 1g : 開始。
  • 21, … 2g : 終了。
  • 31, … 3g : 中継点(Hold/Slide)、Air-Action。
  • 41, … 4g : 変曲点(Slide)。
  • 51, … 5g : 不可視中継点。Air-Actionでやる必要性はないかも。

中継点はStep、変曲点はControlという別名がありますがsusフォーマットでは関係ありません。内部表現ですが、便宜上こちらを用いて解説します。

Controlはロングノーツの間に任意の個数を挟むことができます。StepとStepの間(開始と終了含む)にControlが存在しない場合、そのセグメントは直線変化になります。Step間には仕様上いくつでもControlを挟めますが、処理効率などを考えると多くても3つ位が限度でしょう。可能なら1つだけでどうにかしてほしいです。Controlによって生成される曲線はベジエ曲線になります。各Stepが開始点と終了点になると考えればわかるかと思います。

5xの定義は明示的に中継ノーツを置きたくないけどカチッっと曲げたい時や、決まった位置まで確実にカーブを持っていきたいときに使えます。ただし今の所描画が汚くなるのであんまりホイホイ使えるものではないですね…

ロングノーツは対応をチェックします。Holdが終わる時に幅が違うとかそういうのです。まあでもチェックしてないところも多少はあります。

#BPMll:120.0

BPM定義です。これは半分データで半分ヘッダみたいなやつです。#BPM01:150.00のようにして定義します。

#mmm08

BPM変更定義です。これだけBMSと同じような指定方法をします(データが定義番号)。

#mmm02: 4.0

拍数変更定義です。その性質的に小節ごとにしか定義できません。

常識的に考えて p / 2^n (p, n ∈ N) の小数を指定してください。お願いします。それ以外を指定してもすぐに死んだりはしませんがズレます。

内部表現は1拍を192分割してるのでノーツの分割数もそれの約数になるような数を指定してください。 例えば4/4拍子の小節は192 * 4 = 768tickあるので768の約数の分割に対応できます。

#TILll:"..."

ハイスピードタイムライン定義です。文字列の中にはハイスピードタイムラインのキーフレームをカンマ区切りで記述します。 以上のように速度は小数で、可視状態はv(visible)かi(invisible)を指定します。 引数の指定する順番は自由ですが、必ず1つ以上は指定する必要があります。 なお同じ番号のタイムラインを複数行に分けて書いても問題ありません。逆に一つのタイムラインを別の定義番号に分けて書くと大体動作がおかしくなります。

以下にいくつか例を示します。

  • <meas>'<tick>:<speed>:<visibility>… のような形でキーフレームを定義します。
  • 4'192:1.5 4小節192tick(=4小節1拍)の時刻から流速が1.5倍になります。
  • 10'0:0, 11'0:1 10小節0tickから11小節0tickの間ノーツが停止します。
  • 0'0:i, 16'0:v 16小節0tickの時刻から突然ノーツが現れます。
  • inherit:3K 定義番号3Kのハイスピード情報をコピーします。

#HISPEED ll

文法はコマンドですが兼ね合いからこちらに記述しています。 この指定から下に書かれたノーツ定義に指定した番号のハイスピードのタイムラインを適用します。

#NOSPEED

文法はコ(ry この指定から下のノーツ定義のタイムラインをデフォルト(1倍速)に戻します。

#MEASUREHS ll

文法は(ry 小節線が従うハイスピタイムラインを指定します。この指定より上で指定した番号のタイムラインが定義されていない場合は 何も起きません。

#MEASUREBS mmm

文法(ry データ行の小節番号のオフセットを設定します。例えば#MEASUREBS 1000とした場合、それ以降に#00010と書くと1000小節目になります。

#ATRll: "..."

ノーツアトリビュート定義です。文字列の中にこれを適用するノーツに適用したい属性値を記述します。 prop1:value1, prop2:value2, …のように、プロパティと値はコロンで、設定値はコンマで区切ります。 以下に設定可能なプロパティを示します。

  • pr:<unsigned int value>
    • 別名: priority
    • ノーツの描画優先度を指定します。
    • 小さい整数を指定されたノーツが先に描画されます。
  • h:<float value>
    • 別名: height
    • ノーツの「高さ」を指定します。
    • 現状AirActionのみに対応しています。
    • 正負両方の値が指定できますが、上には2.0ぐらいが限界っぽいですね。
  • rh:<timeline definition word>
    • 別名: rollhs
    • ハイスピードタイムライン定義(00~ZZ)を指定します。
    • Airの流れるスピード「だけ」がこのHSに従うようになります。

#ATTRIBUTE ll

文法はコマンドですが兼ね合いからこちらに記述しています。 この指定から下に書かれたノーツ定義に指定した番号のアトリビュートを適用します。

#NOATTRIBUTE

文法はコマンドですが兼ね合いからこちらに記述しています。 この指定から下のノーツ定義のアトリビュートをデフォルトに戻します。

実装予定の構文(案)

  • #OFFSET ディレクティブ
    • 表示位置を指定分だけずらす
    • だんだん早くなる[時]を書いててちょっと欲しくなった
    • でも件の曲でこれを適用するとろくでもない行数になりそうですね
  • #IF #ELIF #ENDIF #SWITCH #CASE #VAR #RANDOM …ディレクティブ
    • あって誰が得するんだこれ
    • 先頭から一行ずつの処理でいいならまぁ大丈夫だと思う
    • ただしノーツ数や経過時間がnon-deterministicになりうるので油断はできない
  • #ILLUMINATE ディレクティブ
    • 専コンができてからじゃないと話にならん
    • 専コンのイルミネーションを制御するために導入?
    • でもREQUESTディレクティブでも良い気がする
wiki/score/format.txt · 最終更新: 2019/01/11 17:49 by amenoshita_429