Skip to content

Instantly share code, notes, and snippets.

@kb10uy
Last active October 15, 2023 03:58
Show Gist options
  • Star 27 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save kb10uy/c171c175ba913dc40a73c6ce69da9859 to your computer and use it in GitHub Desktop.
Save kb10uy/c171c175ba913dc40a73c6ce69da9859 to your computer and use it in GitHub Desktop.
SUS フォーマット v2.7 仕様

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? タップ 1
    • 2? タップ 2
    • 3? タップ 3
    • 4? タップ 4
    • 5? タップ 5
    • 6? タップ 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"
@kb10uy
Copy link
Author

kb10uy commented Nov 20, 2020

v2.7 rev2
書き忘れていたので #MEASUREBS#MEASUREHS を追加。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment