Repository navigation
SJSON File Format
The .sjson (Song JSON) file format is used by Band BoomBox to store song metadata, audio timing information, section markers, and chart note data. Although .sjson uses a custom file extension, files are standard JSON documents. They can be read, created, edited, and validated using any standard JSON tool, library, or text editor. However, when creating custom songs, this is generally not necessary, as the Band BoomBox includes full song editing functionality.
Each song in Band BoomBox resides in a subfolder within a configured Songs directory (such as StreamingAssets/Songs/<artist>/). A typical song folder contains the following files for each song:
-
<SongName>.sjson: The song data file containing chart and timing information. -
<AudioFile>.ogg(or.wav/.mp3/.flac): The audio track. -
<JacketArt>.png(or.jpg): Optional album artwork image.
At the root level, an .sjson file is a single JSON object with the following top-level properties:
{
"ID": "ec4a377a-5fce-4896-a9ba-8470ec9fc31b",
"Version": 1,
"Title": "Lightseeker",
"Subtitle": "",
"Artist": "thomeval",
"ChartAuthor": "thomeval",
"Issues": "",
"Url": "",
"AudioFile": "BoomBox-LightSeeker.ogg",
"AlbumJacketArtFile": null,
"Bpm": 120.0,
"AudioStart": 8.2,
"Offset": 16.2,
"Length": 177.46,
"BeatsPerMeasure": 4,
"Sections": {
"0": "Verse 1a",
"32": "Verse 1b",
"64": "Break",
"96": "Verse 2a"
},
"SongCharts": [ ... ]
}| Field | Type | Description |
|---|---|---|
ID |
string | A unique identifier (UUID/GUID string) for the song. Automatically set by the Song Editor when a song is first created. |
Version |
integer | The version of the song. Increment this to reset individual and team high scores if the song receives significant changes later on. |
Title |
string | The display title of the song (e.g., "Lightseeker"). |
Subtitle |
string | Optional subtitle or remix detail (e.g., "Band Version" or ""). |
Artist |
string | Name of the song's musical artist/creator (e.g., "thomeval"). |
ChartAuthor |
string | Name of the chart creator who mapped the note notes for Band BoomBox. |
Issues |
string | Optional notes regarding chart/audio issues or maintainer comments. |
Url |
string | Optional URL link to the artist or song source page. |
| Field | Type | Description |
|---|---|---|
AudioFile |
string | Filename of the audio file relative to the song folder (e.g., "BoomBox-LightSeeker.ogg"). |
AlbumJacketArtFile |
string / null | Optional filename of jacket artwork image (e.g., "cover.png" or null). |
Bpm |
float | Beats Per Minute (BPM) of the song track (e.g., 120.0). |
AudioStart |
float | Timestamp in seconds when audio playback starts during gameplay. This should be set to a couple of seconds before the Offset. |
Offset |
float | Time offset in seconds before Beat 0 of the chart (the first playable beat of the song) begins. |
Length |
float | Time offset in seconds where the playable segment of the song ends. |
BeatsPerMeasure |
integer | Time signature numerator; beats per bar/measure (defaults to 4). |
Sections is a JSON object mapping beat positions (as numeric strings) to section names. These section names are displayed in-game during gameplay, as well as in the Chart Editor. See ![Official Charting Standard] for more details on adding Sections.
Example from Lightseeker:
"Sections": {
"0": "Verse 1a",
"32": "Verse 1b",
"64": "Break",
"96": "Verse 2a",
"128": "Verse 2b",
"160": "Bridge 1a",
"192": "Bridge 1b",
"224": "Verse 3a",
"256": "Verse 3b",
"288": "Verse 3c"
}The SongCharts array contains one or more chart objects each representing a single playable chart. Songs will typically feature several of these (one for Beginner, one for Medium, one for Mild etc).
{
"Group": "Primary",
"Difficulty": 0,
"DifficultyLevel": 1,
"NoteCounts": {
"TapNotes": 51,
"HoldNotes": 56,
"AverageNps": 1.01079,
"MaxNps": 1.25,
"TrimmedAverageNps": 1.00833333,
"LaneNotes": [ 0, 83, 80, 0 ],
"TotalNotes": 163
},
"Notes": [
"0200",
"0000",
"0G00",
"0000"
]
}| Field | Type | Description |
|---|---|---|
Group |
string | Group name, used to differentiate songs that have more than one chart for the same Difficulty. Default is Main. |
Difficulty |
integer | Integer enum representing the difficulty mode (see table below). |
DifficultyLevel |
integer | Numeric difficulty rating displayed in the Song Select Screen and Difficulty Select Screen. Typically ranges from 1 to 18. |
NoteCounts |
object | Precalculated chart metrics (see section below). |
Notes |
array of strings | Array of encoded note blocks, indexed by beat number. |
Multiple charts with the same difficulty are allowed, but they must have a different group set.
| ID | Difficulty Name |
|---|---|
0 |
Beginner |
1 |
Medium |
2 |
Hard |
3 |
Expert |
4 |
N.E.R.F. |
5 |
Mild |
10 |
Extra |
The NoteCounts object holds calculated statistics for the chart:
-
TapNotes(integer): Total number of tap notes. -
HoldNotes(integer): Total number of hold notes. -
AverageNps(float): Average notes per second across the entire chart. -
MaxNps(float): Peak notes per second. -
TrimmedAverageNps(float): Average notes per second excluding silent or empty chart sections. Note that theAverage NPSdisplay on the Difficulty Select screen uses this value. -
LaneNotes(array of 4 integers): Number of notes in each lane[Lane 0, Lane 1, Lane 2, Lane 3]. The fourth value is currently unused. -
TotalNotes(integer): Sum of notes across all lanes, calculated asTapNotes+HoldNotes+ReleaseNotes.
The Notes property in a SongChart is an array of strings where each element index corresponds to an integer beat number:
[`beat 0`,
`beat 1`,
beat 2`,
...]Each element in Notes is subdivided into or more 4-character blocks. Each one of these blocks represents a specific point within that beat. If the same beat contains multiple note events or sub-beat notes (e.g., eighth notes, sixteenth notes, triplets), multiple 4-character blocks are appended in the string (separated by spaces):
-
1 block (4 characters, e.g.
"0200"): Whole beat step (step size =1.0). Note occurs at beatx.0. -
2 blocks (8 characters, e.g.
"0100 0010"): Half beat step (step size =0.5). Notes occur at beatsx.0andx.5. -
3 blocks (12 characters): Triplet step (step size =
1/3). Notes occur atx.0,x.333,x.666. -
4 blocks (16 characters): Quarter beat / 16th note step (step size =
0.25). Notes occur atx.0,x.25,x.50,x.75.
Supported subdivision block counts per beat are: 1, 2, 3, 4, 6, 8, 12, 24.
Each individual block consists of 4 characters, one for each lane:

- Lane 0: Triggers / Shoulder controls (
LB,LT,RB,RT, orAnyT). - Lane 1: Directional D-Pad controls (
Left,Down,Up,Right, orAnyD). - Lane 2: Action / Face Button controls (
A,B,X,Y, orAnyB). - Lane 3: Currently reserved / unused (typically
'0').
Each character within a block specifies both the Note Type (which specific button/input) and the Note Class (Tap, Hold Start, or Hold Release):
| Character | Lane 0 (Triggers) | Lane 1 (Directions) | Lane 2 (Buttons) | Note Class |
|---|---|---|---|---|
'0' |
(None) | (None) | (None) | Empty |
'1' |
Any Trigger (AnyT) |
Any Direction (AnyD) |
Any Button (AnyB) |
Tap |
'2' |
Any Trigger (AnyT) |
Any Direction (AnyD) |
Any Button (AnyB) |
Hold Start |
'4' |
LB |
Left |
X |
Tap |
'5' |
LB |
Left |
X |
Hold Start |
'7' |
LT |
Down |
A |
Tap |
'8' |
LT |
Down |
A |
Hold Start |
'A' |
RB |
Up |
Y |
Tap |
'B' |
RB |
Up |
Y |
Hold Start |
'D' |
RT |
Right |
B |
Tap |
'E' |
RT |
Right |
B |
Hold Start |
'G' |
Release | Release | Release | Release (Hold End) |
NOTE: Hold notes consist of a Hold Start character (
'2','5','8','B', or'E') at the starting beat position, followed by a Release character ('G') at the beat position where the hold finishes. The game will automatically convert the Release character to the appropriate Note Type when loading the chart.
Consider the opening 8 beats of the Primary Expert chart ("Difficulty": 3) from Lightseeker.sjson:
"Notes": [
"0080",
"0400",
"40G0",
"0A00 00D0",
"B000",
"00A0",
"G400",
"0070 0D00",
"0080"
]
Step-by-step breakdown:
-
Beat 0 (
"0080"):- Lane 2 (Action Buttons) has character
'8'(AButton Hold Start). - An
Abutton hold note begins at beat 0.0.
- Lane 2 (Action Buttons) has character
-
Beat 1 (
"0400"):- Lane 1 (Directions) has character
'4'(LeftD-Pad Tap). - A
LeftD-Pad tap note occurs at beat 1.0 while theAhold note in Lane 2 continues.
- Lane 1 (Directions) has character
-
Beat 2 (
"40G0"):- Lane 0 (Triggers) has character
'4'(LBShoulder Trigger Tap). - Lane 2 (Action Buttons) has character
'G'(Release). - An
LBtrigger tap note occurs at beat 2.0 while theAhold note in Lane 2 ends.
- Lane 0 (Triggers) has character
-
Beat 3 (
"0A00 00D0"):- Contains two 4-character blocks, dividing the beat into half beats (
0.5step size). - At beat 3.0 (
"0A00"): Lane 1 has character'A'(UpD-Pad Tap). - At beat 3.5 (
"00D0"): Lane 2 has character'D'(BButton Tap).
- Contains two 4-character blocks, dividing the beat into half beats (
-
Beat 4 (
"B000"):- Lane 0 (Triggers) has character
'B'(RBShoulder Trigger Hold Start). - An
RBtrigger hold note begins at beat 4.0.
- Lane 0 (Triggers) has character
-
Beat 5 (
"00A0"):- Lane 2 (Action Buttons) has character
'A'(YButton Tap). - A
Ybutton tap note occurs at beat 5.0 while theRBhold note in Lane 0 continues.
- Lane 2 (Action Buttons) has character
-
Beat 6 (
"G400"):- Lane 0 (Triggers) has character
'G'(Release). - Lane 1 (Directions) has character
'4'(LeftD-Pad Tap). - A
LeftD-Pad tap note occurs at beat 6.0 while theRBhold note in Lane 0 ends.
- Lane 0 (Triggers) has character
-
Beat 7 (
"0070 0D00"):- Contains two 4-character blocks (half-beat division).
- At beat 7.0 (
"0070"): Lane 2 has character'7'(AButton Tap). - At beat 7.5 (
"00D0"): Lane 1 has character'D'(RightD-Pad Tap).
-
Beat 8 (
"0080"):- Lane 2 (Action Buttons) has character
'8'(AButton Hold Start). - An
Abutton hold note begins at beat 8.0.
- Lane 2 (Action Buttons) has character