Skip to content

SSC format

Rodrigo Alfonso edited this page Mar 9, 2024 · 32 revisions

Header properties

Field Type Description
TITLE String Id of the song
SUBTITLE String Name of the song
ARTIST String Author of the song
SONGCATEGORY One of ORIGINAL, K-POP, WORLD MUSIC Channel of the song
LASTSECONDHINT Number (Optional) Timestamp (in seconds) when the song ends. Used when songs have a trailing silence
BGCHANGES Custom (Optional) Used to calculate video offset (see below)
PIUGBA Object (Optional) Custom configuration of the song. See the example below

Chart properties

Field Type Description
NOTEDATA Empty The #NOTEDATA:; indicates the start of a chart. It should be empty.
STEPSTYPE One of pump-single, pump-double, pump-couple, pump-routine Indicates the type of chart. Single uses 5 arrows and the others 10 arrows. Couple/Routine are co-op charts.
DESCRIPTION String Name of the chart, used by the importer. If this field contains the word half the chart will be ignored!
DIFFICULTY One of NORMAL, HARD, CRAZY, NUMERIC Named difficulty level
METER Int Numeric difficulty level
PIUGBA_ORDER Int (Optional) METER override for sorting purposes
OFFSET Number Audio offset (in seconds) from the chart notes. If positive, audio starts after the chart
BPMS Dictionary Dictionary with all the BPM changes.

Beat => BPM
SPEEDS Quad Dictionary Speed factors that affect display BPM.

Beat =>
Percent (scroll factor) =>
Delay (a value of 1 will make it linearly scale from the current scroll speed to the new one in 1 beat/second) =>
Unit (0 = delay is in beats, 1 = delay is in seconds)
TICKCOUNTS Dictionary Affects how often a hold note will fire a combo tick. The figure will be 4 * the number (i.e. 2 means one tick every 8th note, 4 means one tick every 16th note)

Beat => Multiplier
STOPS Dictionary Completely stops the scrolling and affects all the next events.

Beat => Length (in seconds)
DELAYS Dictionary Same as STOPS
SCROLLS Dictionary Sets the scrolling ON or OFF, without affecting all the next events. Used to fake stops (also called "async stops").

Beat => Enabled (0 = no, 1 = yes)
WARPS Dictionary Teleports to another part of the chart.

Beat => Jump (in beats)
FAKES Dictionary Notes during this segment won't be counted for or against players.

Beat => Length (in beats)
Notes Event array The actual notes of the song.

Fast BPM Warps

If a BPM segment sets BPM to anything higher than 999999, StepMania interprets it as a warp to the next BPM change. If there're STOPS/DELAYS in the middle, it stops and then continues warping so it can create stuttering effects like warp-stop-warp-stop-warp-stop...

Formats

Dictionary

KEY=VALUE separated by ,

Object

Like Dictionary, but separated by ,,,

Quad Dictionary

KEY=VALUE=PARAM1=PARAM2 separated by ,

Event array

Note data is defined in terms of "measures" where a measure is several lines of text, terminated by a comma. The final measure in a chart is terminated by a semicolon instead. Each line consists of a set of characters representing each playable column in the chart type.

Valid note types are 4th, 8th, 12th, 16th, 24th, 32nd, 48th, 64th, and 192nd. Each measure consists of a number of lines that corresponds to one of these numbers. The total number of beats covered by any given measure is 4, and each line represents a portion of that. If a measure has 64 lines, for example, each line represents 1/64th of those 4 beats, or 1/16th of a beat, with the first line representing beat 0 within the measure. The note type of a given line can be determined by taking said beat value, dividing by 4, and then simplifying the fraction as much as possible and looking at the denominator. If the denominator is 96, 192 is used as the note type instead.

Note types

  • 0 – No note
  • 1 – Normal note
  • 2 – Hold head
  • 3 – Hold tail
  • F - Fake tap

#BGCHANGES

This can be a list of multiple videos / backgrounds, e.g.:

#BGCHANGES:-10000.000=black.mpg=1.000=1=0=1===CrossFade==,
-4.100=123.mpg=1.000=0=0=0=StretchNoLoop====,
99999=-nosongbg-=1.000=0=0=0;

The important parts are:

  • 123.mpg (name of the video file, has to match the audio file name)
  • -4.100 (video offset in beats). If negative, the first BPM of #BPMS is used to translate it to seconds. Negative means the video starts earlier (relative to song start).

The rest of the fields (playback rate, effect, transitions, etc.) are ignored.

Example

#TITLE:230;
#SUBTITLE:Name of the song;
#ARTIST:Author of the song;
#SONGCATEGORY:WORLD MUSIC;
#LASTSECONDHINT:99.002441;
#SAMPLESTART:27.322994;
#SAMPLELENGTH:15.000004;
#BGCHANGES:-0.300=123.mpg=1.000=0=0=0=StretchNoLoop====,
99999=-nosongbg-=1.000=0=0=0 // don't automatically add -songbackground-
;

#PIUGBA:
APPLY_TO=101,,,
IS_BOSS=TRUE,,,
PIXELATE=BLINK_IN,,,
JUMP=ON,,,
REDUCE=RANDOM,,,
BOUNCE=ALL,,,
COLOR_FILTER=POSTERIZE,,,
SPEED_HACK=AV,,,
MESSAGE=
This is a message to be
read before the song.
The maximum is 25 cols,
4 lines between \r\n.
;

# APPLY_TO = Indicates what campaign modes are affected by those options (101 means "NORMAL & CRAZY, but not HARD").
# IS_BOSS = Changes the song's channel to BOSS

# Other chart properties can be here, e.g.: BPMS, STOPS, etc.
# They serve as a default value when a chart doesn't include them

//---------------pump-single - s8----------------
#NOTEDATA:;
#STEPSTYPE:pump-single;
#DESCRIPTION:s8 Pro;
#DIFFICULTY:NUMERIC;
#METER:8;
#OFFSET:0.003000;
#BPMS:0.000000=158.000000
,156.000000=197.500000
,158.000000=237.000000
,160.000000=276.500000
,162.000000=316.000000
,176.000000=276.500000
,178.000000=237.000000
,180.000000=197.500000
,182.000000=158.000000
,184.000000=118.500000
,185.000000=104.500000
,186.000000=158.000000
;
#STOPS:186.000000=3.038000
;
#DELAYS:;
#WARPS:;
#TICKCOUNTS:0.000000=4
;
#SPEEDS:0.000000=1.000000=0.000000=0
;
#SCROLLS:0.000000=1.000000
;
#FAKES:;
#NOTES:
// measure 0
00000
01100
00001
00000
,  // measure 1
00000
00200
00000
00000
,  // measure 2
00000
00000
00000
00300

//---------------pump-single - s19----------------
#NOTEDATA:;
#STEPSTYPE:pump-single;
#DESCRIPTION:s19;
#DIFFICULTY:CRAZY;
#METER:19;
#OFFSET:0.003000;
// ...