Skip to content

Instantly share code, notes, and snippets.

@kb10uy
Last active August 18, 2024 16:13
Show Gist options
  • Save kb10uy/c171c175ba913dc40a73c6ce69da9859 to your computer and use it in GitHub Desktop.
Save kb10uy/c171c175ba913dc40a73c6ce69da9859 to your computer and use it in GitHub Desktop.

Revisions

  1. kb10uy revised this gist Nov 20, 2020. 1 changed file with 21 additions and 1 deletion.
    22 changes: 21 additions & 1 deletion sus-specification-2.7.md
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    # SUS Format Specification v2.7
    # SUS Format Specification v2.7 (rev2)
    注: **SUS** は今や *Sliding Universal Score* の略であり、 *SeaUrchin Score* ではありません。

    ## 1. 概要
    @@ -162,6 +162,26 @@
    #NOSPEED
    ```

    ### `#MEASUREBS` 小節番号ベース値
    * 指定した時点から、データ行の小節番号に常に指定された値が加算されるようになる。
    * 複数回指定した場合は最後に指定した値で加算値が上書きされる。

    ```
    ... 0-999
    #MEASUREBS 1000
    ... 1000-1999
    #MEASUREBS 2000
    ... 2000-2999
    ```

    ### `#MEASUREHS` 小節線スピード変化指定
    * アプリケーションが小節線の表示をサポートする場合、その小節線のスピード変化を指定できる。
    * 指定する値は `#TIL` と同じもの。

    ```
    #MEASUREHS 01
    ```

    ### `#mmm1x` タップ
    * 位置が移動しない単押しのノーツ。
    * 仕様として予約されているのは以下の 3 つである。
  2. kb10uy created this gist Oct 12, 2020.
    221 changes: 221 additions & 0 deletions sus-specification-2.7.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,221 @@
    # SUS Format Specification v2.7
    注: **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
    ```

    ### `#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"`