SUS Format Specification v2.7 (rev2)
注: SUS は今や Sliding Universal Score の略であり、 SeaUrchin Score ではありません。
1. 概要
- テキストデータであり、全て printable character で構成される。
- 拡張子:
*.sus
- EOL: CRLF もしくは LF
- エンコード: 常に UTF-8
#
で始まる行がデータとして意味を持ち、それ以外の行はコメントとして無視される。- 文字列データを指定する部分は
" ~ "
でクォートする。
2. メタデータ行
#
に続けて以下で列挙する各種命令を記述する。(ASCII)
と書かれている項目は、内容に ASCII 文字のみが利用可能。(UTF-8)
と書かれている項目は、内容に ASCII 文字以外も利用可能。
#TITLE
楽曲タイトル (UTF-8)
#TITLE "Song Title"
#SUBTITLE
楽曲サブタイトル (UTF-8)
#SUBTITLE "Song Subtitle"
#ARTIST
楽曲アーティスト (UTF-8)
#ARTIST "Artist"
#GENRE
楽曲ジャンル (UTF-8)
#GENRE "Genre"
#DESINGER
譜面デザイナー (UTF-8)
#DESIGNER "Designer"
#DIFFICULTY
譜面難易度種別 (ASCII/UTF-8)
- 整数値または文字列で譜面の難易度の種類を指定する。
- 数値指定について、仕様として予約されているのは以下の 5 つ。
#DIFFICULTY 0
#DIFFICULTY 1
#DIFFICULTY 2
#DIFFICULTY 3
#DIFFICULTY 4
- 文字列で指定することもできるが、その処理はアプリケーションごとに異なる。
#PLAYLEVEL
譜面レベル (ASCII)
- 整数値で譜面のレベルを指定する。
#PLAYLEVEL 10
- 末尾に
+
を指定することも可能。#PLAYLEVEL 14+
#SONGID
楽曲 ID (ASCII)
- この値の処理はアプリケーションごとに異なる。
#SONGID "songid"
#WAVE
音声ファイル
- sus ファイルからの相対パスで指定する。
- 対応ファイルフォーマットはアプリケーションごとに異なる。
#WAVE "filename.wav"
#WAVEOFFSET
音声ファイルオフセット
- 譜面再生開始と音声ファイルの再生タイミングの差を指定する。
- 単位は秒。小数で指定可能
- 正の値を指定すると、譜面が先に流れる。
- 負の値を指定すると、音声が先に流れる。
#WAVEOFFSET 0.5
#JACKET
楽曲ジャケット
- sus ファイルからの相対パスで指定する。
- 対応ファイルフォーマットはアプリケーションごとに異なる。
#JACKET "jacket.jpg"
#BACKGROUND
背景画像ファイル
- sus ファイルからの相対パスで指定する。
- 対応ファイルフォーマットはアプリケーションごとに異なる。
#BACKGROUND "jacket.jpg"
#MOVIE
背景動画ファイル
- sus ファイルからの相対パスで指定する。
- 対応ファイルフォーマットはアプリケーションごとに異なる。
#MOVIE "movie.mp4"
#MOVIEOFFSET
背景動画ファイルオフセット
- 譜面再生開始と動画ファイルの再生タイミングの差を指定する。
- 単位は秒。小数で指定可能
- 正の値を指定すると、譜面が先に流れる。
- 負の値を指定すると、動画が先に流れる。
#MOVIEOFFSET 0.5
#BASEBPM
スクロール速度算出用テンポ
- スクロール速度の基準となるテンポを指定する。
- 実際のスクロール速度は、この値に対する比率で変化する。
- 指定しない場合、最初の BPM 変化の値になる。
#BASEBPM 120.0
#REQUEST
特殊属性
- アプリケーションに対して特殊な命令を送信する。
- 4 にて後述する。
#SUBTITLE "Song Subtitle"
3. 譜面データ行
-
各行は「ヘッダ部、
:
、 データ部」という構成をとる。 -
ヘッダ部の後に
:
を付与する必要がある。 -
データ部は 2 桁で 1 セットであり、セット数で小節を分割し、それぞれのタイミングとする。
- 例えば
11111111
と指定した場合、 4 分間隔で配置される。 - 最大分割数はアプリケーションごとに異なるが、少なくとも 512 分割(データ部 1024byte)をサポートするべきである。
- 2 桁のデータについて、 1 桁目はデータ種類ごとに異なるが、
0
は常に無配置である。 - 2 桁目は常にノーツの幅を表し、同様に 1 ~ z で 1 幅 ~ 35 幅を表す。
- よって、ノーツの存在しない位置については
00
で埋めるべきである。
- 例えば
-
mmm
- 特定の文字列の場合特殊データである。
- それ以外の場合は一般データであり、小節番号である。
- 小節番号は 0 からスタートする。
-
x
- ノーツの左端のレーンを指定する。
- 左側から 0, 1, 2, ..., 9, a, b, c, ... と続く。
- 大小文字は区別されない。
-
y
- ノーツごとのチャンネルを指定する。
x
と同様に、 0 ~ z までを使用可能。- 大小文字は区別されない。
-
zz
- 特殊データの番号を指定する。
- Base36 で 01 ~ zz までを使用可能。
#mmm02
小節長
- その小節番号以降の小節長を拍数で指定する。
- 小数値が指定可能。ただし、 M / 2^n (M, n ∈ N) となる値が望ましい。
#BPMzz
, #mmm08
BPM 定義・変化
- その地点以降のテンポを BPM 定義から参照して指定する。
- テンポの値は小数値が指定可能。
#BPM01: 140.0
#00008: 01
#ATRzz
, #ATTRIBUTE zz
, #NOATTRIBUTE
ノーツ属性定義
- ATR でノーツ属性のセットを定義する。
- 文字列で定義し、コンマで複数の値を区切る。
rh:<小数>
ディレクショナルのロール速度h:<小数>
ノーツの高さpr:<整数>
ノーツの描画優先度
#ATTRIBUTE zz
を記述すると、その行以降のデータにzz
のノーツ属性が適用される。#NOATTRIBUTE
を記述すると、その行以降のデータにはノーツ属性は適用されなくなる。
#ATR01: "pr:100, h: 1.5"
#ATTRIBUTE 01
#00010: 14141414
#NOATTIRBUTE
#TILzz
, #HISPEED zz
, #NOSPEED
スピード変化定義
- ノーツごとに異なる速度を適用する(以下ハイスピード定義)ことができる。
- ハイスピード定義は文字列で定義し、コンマで複数の値を区切る。
meas'tick:speed
形式の文字列。meas
小節番号(整数)tick
ティック(整数) (小節をさらに分割する単位。デフォルトでは 1 拍は 480tick となっているため、1 小節で 1920tick となる)speed
速度(小数) (負の値も指定可能)
#ATTRIBUTE zz
を記述すると、その行以降のデータにzz
のハイスピード定義が適用される。#NOATTRIBUTE
を記述すると、その行以降のデータにはハイスピード定義は適用されなくなる。
#TIL01: "0'0:1.0, 0'960:2.0"
#HISPEED 01
#00010: 14141414
#NOSPEED
#MEASUREBS
小節番号ベース値
- 指定した時点から、データ行の小節番号に常に指定された値が加算されるようになる。
- 複数回指定した場合は最後に指定した値で加算値が上書きされる。
... 0-999
#MEASUREBS 1000
... 1000-1999
#MEASUREBS 2000
... 2000-2999
#MEASUREHS
小節線スピード変化指定
- アプリケーションが小節線の表示をサポートする場合、その小節線のスピード変化を指定できる。
- 指定する値は
#TIL
と同じもの。
#MEASUREHS 01
#mmm1x
タップ
- 位置が移動しない単押しのノーツ。
- 仕様として予約されているのは以下の 3 つである。
1?
タップ 12?
タップ 23?
タップ 34?
タップ 45?
タップ 56?
タップ 6
#00010: 2414141434141414
#mmm2xy
ホールド
- 位置が移動しない長押しのノーツ。
- 全ての点において同じ幅を指定しなければならない。
- チャンネルが同じもの同士が連結する。
1?
開始点2?
終了点3?
中継点
#00020a: 14002400
#mmm3xy
スライド 1
- 位置が移動する長押しのノーツ。
- 各点ごとに異なる幅を設定可能。
- ベジエ曲線によってなめらかに形状を設定することができる。
- 曲線の形状については、各中継点と制御点のノーツの中心を結んだ連続する線分によって定義される。
- チャンネルが同じもの同士が連結する。
1?
開始点2?
終了点3?
中継点4?
ベジエ曲線制御点5?
不可視中継点
#00030a: 14340024
#mmm4xy
スライド 2
- 位置が移動する長押しのノーツ。
- 基本的な仕様はスライド 1 と同等なので省略。
#mmm5x
ディレクショナル
- 方向のあるノーツ定義。
- 必ずしも他のノーツの上に重ねる必要はなく、単独で配置することも可能である。
1?
上2?
下3?
左上4?
右上5?
左下6?
右下
#00050: 14241424
4. #REQUEST
で指定できる特殊属性
仕様として定義されているのは以下の通りである。
ticks_per_beat
拍あたりの tick 数の変更
#REQUEST "ticks_per_beat <整数>
- 譜面で n 分音符を使用する場合、小節拍数 * tick 数 の約数になるように指定するべきである。
enable_priority
優先度付きノーツ描画の有効・無効切り替え
#REQUEST "enable_priority true/false"
v2.7 rev2
書き忘れていたので
#MEASUREBS
と#MEASUREHS
を追加。