Overview¶
.chart is a text-based custom chart format originating from the GH1/2 era, similar in form to .ini files. It was originally created as an intermediate format, meant to be converted for use in a game, but nowadays it is typically used directly. See Brief History for more details on the history of the format.
This document lays out the core infrastructure of the .chart format. To keep these docs easily extensible, specifications for different game/instrument types will go in separate documents, and only the base infrastruture will be detailed here.
Note that the usage of C-style comments in examples throughout these documents is not reflective of the actual format. Comments are not allowed in actual .chart files.
File Names¶
.chart files may be found either with a custom name (usually the song name), or with a name of notes.
Some charts have multiple .chart files whose names are suffixed with one of the following:
[Y]/[F]- Chart has forced notes (HOPO/strum flip, tap notes, open notes)[N]- Chart does not have forced notes
These suffixes may also be found in lowercase, and may be surrounded with parentheses instead of square brackets.
Example:
Song Name [Y].chart
Song Name [N].chart
If multiple .chart files are found, the one named notes should be preferred over custom-named .chart files, and names suffixed with [Y] or [F] should be preferred over [N] or no suffix.
Basic Infrastructure¶
Sections¶
.chart files are comprised of named sections. These sections start with their name in square brackets, which is typically written in PascalCase, and outside of a . The contents of sections are encapsulated by curly brackets.
Sections are not separated with line breaks, and can show up in any order, at least for instrument tracks.
[SectionOne]
{
// Section data goes here
}
[SectionTwo]
{
...
}
[SectionThree]
{
...
}
Section Data¶
Section data is comprised of key-value pairs, each one separated by a line break and typically indented by a couple spaces or a tab, stored in this general format:
<Key> = <Value[]>
Keyis the identifier for the value. It may or may not be unique, depending on the specific type of data being represented.Value[]is a set of one or more space-separated values that hold the data for the key.- If a value might contain spaces in it, quotation marks are used to encapsulate that value (much like using quotation marks for arguments in a command-line terminal). .chart has no character escapes however, so values (normally) cannot have quotation marks in them.\ Of course, people did this anyways, so care must be taken to ensure these are handled correctly. Thankfully, all uses of quoted values have only a single value in the set, so handling of those data types can bypass the space-separation system.
[SectionOne]
{
Key1 = Value1
Key2 = Value2 Value3
Key3 = "I hold text!"
}
Each section has different data, and a data entry in one section may mean something different in another, but there are common structures shared between sections.
Value Types¶
Value types used throughout these .chart documents are as follows:
| Value type | Description |
|---|---|
number |
An integer number written in base 10. |
decimal |
A decimal-allowing number written in base 10. Must use a period/full stop . as the decimal place. |
string |
Any amount of text surrounded by quotes. |
bare string |
Any amount of text not surrounded by quotes. It's recommended to ignore space separation for these due to edge-cases. |
boolean |
Either true or false. |
file path |
A file path surrounded by quotes, or None if not specified.Can be either relative to the chart file, or absolute. |
Named Entries¶
Named entries contain data that should be referred to by name.
<Name> = <Value>
Nameis the name of the entry, typically written in PascalCase.Valueis the value of the entry. The value type depends on which entry it is paired to.
Named entries must be unique within the section containing them, and their ordering vary.
Track Events¶
Track events contain data for a note, phrase, or other event that happens at a certain tick within the chart.
<Position> = <Type Code> <Value[]>
Positionis a number indicating which tick this event is located at.Type Codeis a set of characters which indicates the type of event.A: Tempo position anchorB: Tempo changeE: Text eventH: (Legacy) Guitar Hero 1 hand animation position. Specified in the 5-Fret Guitar page.N: Note eventS: Special phraseTS: Time signature changeValue[]is a set of one or more individual values. The amount of values and type of each value varies per event type.
More than one event may occur at the same tick. Some events may modify other events at the same tick, or may modify multiple events throughout a provided length value.
Events within the same section should be written in increasing order of tick position. Out-of-order events may cause issues in or be rejected by some games/programs.
Section Names¶
Typically, the first few sections are:
[Song]– Song/chart metadata[SyncTrack]– Time signatures and tempo markers[Events]– Global events and practice mode sections
Following these are the instrument tracks. Typically, each difficulty of every instrument is its own section, with the standard nomenclature of these sections' names being the name of the difficulty followed by a code name for the instrument:
[<Difficulty><Instrument>]
For example, Hard on Drums is written as [HardDrums].
Available instrument section names can be found in each game type's respective document. Any unrecognized/unknown sections should be ignored.
All sections aside from Song (for chart resolution) and SyncTrack are optional. Instrument sections may show up in any order. A missing section is equivalent to a section with no data.
Song Section Details¶
The [Song] section contains metadata about the song and chart. It uses named entries to store the metadata. The order of metadata tags may vary, and they must be unique. Any unknown metadata should be ignored.
Basic Metadata¶
| Tag Name | Description | Data type |
|---|---|---|
Name |
Title of the song. | string |
Artist |
Artist(s) or band(s) behind the song. | string |
Album |
Title of the album the song is featured in. | string |
Genre |
Genre of the song. | string |
Year |
Year of the song’s release. Typically preceded by a comma and space, for example , 2002, to make importing into GHTCP quicker. |
string |
Charter |
Community member who charted the song. | string |
Resolution |
(Required) Number of positional ticks between each 1/4th note in the chart. | number |
Difficulty |
Estimated difficulty of the song. | number |
Length |
The length of the song, in seconds. This should not be relied on, it is metadata only. |
decimal |
Offset |
Start time of the audio, in seconds. A higher value makes the audio start sooner. |
decimal |
PreviewStart |
Time of the song, in seconds, where the song preview should start. | decimal |
PreviewEnd |
Time of the song, in seconds, where the song preview should end. | decimal |
Audio Files¶
Audio files may be specified through the following metadata tags:
| Tag Name | Description | Data type |
|---|---|---|
MusicStream |
The main audio stream. When other audio stems are present, this is background audio not in the other tracks and/or instruments not charted. |
file path |
GuitarStream |
Lead Guitar audio. | file path |
RhythmStream |
Rhythm Guitar audio. | file path |
BassStream |
Bass Guitar audio. | file path |
KeysStream |
Keys audio. | file path |
DrumStream |
Drums audio for the kick drum, plus snare, tom, and cymbal audio if 2-4 are not present. | file path |
Drum2Stream |
Drums audio for the snare drum, plus tom and cymbal audio if 3 and 4 are not present. | file path |
Drum3Stream |
Drums audio for toms, plus cymbal audio if 4 is not present. | file path |
Drum4Stream |
Drums audio for cymbals. | file path |
VocalStream |
Vocals audio. | file path |
CrowdStream |
Background crowd noise/singing audio. | file path |
Not all charts use these tags deliberately though, and instead rely on the reserved file names defined here. The preferred method of loading audio would be to first check for the reserved names, then fall back on the files in the metadata.
Legacy Metadata¶
- GHTCP stands for Guitar Hero Three Control Panel, a tool to modify Guitar Hero 3, which includes importing songs.
- dB refers to the Feedback Editor program.
| Tag Name | Description | Data type |
|---|---|---|
ArtistText |
(GHTCP) Text to use before the artist name. Can be custom, but most commonly "by" or "as made famous by". |
string |
Singer |
(GHTCP) Indicates which singer should be used in-game. | string |
Bassist |
(GHTCP) Indicates which bassist should be used in-game. | string |
Boss |
(GHTCP) Indicates whether or not this is a boss song? Unsure what data is valid for this tag. |
string |
Player2 |
(GHTCP) Instrument to use for player 2. Valid values are Bass/bass and Rhythm/rhythm. |
bare string |
CountOff |
(GHTCP) The countoff sample to use in-game. | string |
GuitarVolume |
(GHTCP) Sets the volume for the guitar audio track. | decimal |
GuitarVol |
(GHTCP) Same as the above. | decimal |
BandVolume |
(GHTCP) Sets the volume for the band audio track. | decimal |
BandVol |
(GHTCP) Same as the above. | decimal |
HoPo |
(GHTCP) The HOPO threshold that should be used for this chart. This value is equal to (<step size denominator>) / 4 (1/4 step = 1.00, 1/8 = 2.00, 1/2 = 0.50, etc.). |
decimal |
Fretboard |
(dB) The fretboard image to use for this song, without the file extension. | file path |
MediaType |
(dB) Type of media to display in-game? | string |
MusicURL |
(dB) URL for the song audio file. | string |
PreviewURL |
(dB) URL for the preview audio file. | string |
song.ini¶
Most modern .chart files use an accompanying song.ini file, carried over from the .mid format, instead of deliberately using the [Song] section. The metadata in the song.ini should be prioritized over the metadata in the .chart, as often times in these chart files the .chart metadata is not properly filled out.
See the song.ini docs for info on song.ini data.
Song Section Example¶
[Song]
{
Name = "Example Song"
Artist = "Example Artist"
Album = "Example Album"
Genre = "Example Genre"
Year = ", 2021"
Charter = "Example Charter"
Resolution = 192
Difficulty = 4
Offset = 0.56
PreviewStart = 45.28
PreviewEnd = 75.28
MusicStream = "Example Song.ogg"
}
SyncTrack Section Details¶
The [SyncTrack] section contains tempo and time signature data for the chart.
Time Signatures¶
Time signature markers use the TS type code, and are written like this:
<Position> = TS <Numerator> <Denominator exponent>
Numeratoris the numerator to use for the time signature.Denominator exponentis optional, and specifies a power of 2 to use for the denominator of the time signature.- Defaults to 2 (
x/4) if unspecified. - This value is limited to a minimum of 0, for a resulting denominator of
x/1.
A time signature marker must exist at tick 0 in the chart to set the initial time signature. If one is not present, a time signature of 4/4 is assumed.
Examples:
0 = TS 4 // 4/4
0 = TS 4 2 // Also 4/4
768 = TS 7 4 // 7/16
1104 = TS 3 3 // 3/8
Tempos¶
Tempo markers use the B type code, and are written like this:
<Position> = B <Tempo>
Tempois a whole number representation of the desired tempo. The first 3 digits starting from the right are the decimals, giving tempos a maximum of 3 decimal places.
A tempo marker must exist at tick 0 in the chart to set the initial tempo. If one is not present, a tempo of 120 BPM is assumed.
Examples:
0 = B 120000 // 120 BPM
768 = B 60000 // 60 BPM
1104 = B 150325 // 150.325 BPM
Tempo Anchors¶
Tempo anchors lock an accompanying tempo marker to a time position relative to the audio. They use the A type code, and are written like this:
<Position> = A <Audio time position>
Audio time positionis the time relative to the audio that the associated tempo marker should be set to, in microseconds.
This event is typically only used for chart editing, and should be ignored otherwise. A chart editor should adjust the tempo of the preceding tempo marker to maintain this lock if any of the preceding tempo markers are adjusted.
Example:
768 = A 2250000 // 2.25 seconds
768 = B 60000 // 60 BPM
SyncTrack Section Example¶
[SyncTrack]
{
0 = TS 4 // 4/4
0 = B 120000 // 120 BPM
768 = TS 7 4 // 7/16
768 = A 2250000 // 2.25 seconds
768 = B 60000 // 60 BPM
1104 = TS 3 3 // 3/8
1104 = B 150325 // 150.325 BPM
}
Events Section Details¶
The [Events] section contains global events.
Global Events¶
Global events are events that apply to the chart as a whole. They use the E type code, and are written like this:
<Position> = E "<Text>"
Textis a string containing event data.
Some events may have [square brackets] surrounding them (such as [end]), and some may be found in either square bracketed or plain versions.
As mentioned in the Section Data section, quotation marks are normally not allowed in data values, as there are no escape characters available to escape them. However, it is recommended to ignore these semantics and just strip off the very starting and ending quotation marks.
Local events also use the E type code, but local events are only in instrument sections, whereas global events are only in the Events section.
Basic Global Events¶
| Name | Description |
|---|---|
section <name> |
Marks the start point of a section, used by Practice mode and post-game summary. Note that some of these events may have an underscore _ instead of a space before the section name. |
prc_<name> |
Same as the above. |
end |
Marks the end of a song. |
Events Section Example¶
[Events]
{
768 = E "section Start"
3840 = E "prc_End"
9216 = E "end"
}
Instrument Section Details¶
This section details the base events found in instrument sections.
Notes and Modifiers¶
Notes and modifiers use the N type code, and are written like this:
<Position> = N <Type> <Length>
Typeis the type number of this note/modifier.Lengthis the length of this note in ticks. This value typically doesn't do anything for modifiers.
Modifiers are applied to existing notes, but listed as separate events. A modifier applies to all notes on the same tick, so different notes on the same tick cannot have different modifiers unless the modifier specifically targets a single note value.
Special Phrases¶
Special phrase events mark phrase or phrase-like events. They use the S type code and are written like this:
<Position> = S <Type> <Length>
Typeis the type number of this special phrase.Lengthis the length of this phrase in ticks.
A special phrase usually does not apply to the tick at the very end of its length, i.e. the value of (Position + Length), except for when they are 0 ticks long. Any other exceptions will be noted.
Note, Modifier, and Special Phrase Type Divisions¶
To help prevent issues with future additions creating nonsensical orderings for event type numbers, the values for each are divided into groups of 32 for organization. In general, the divisions are as follows:
| Type Number | Description |
|---|---|
| 0 thru 31 | Standard |
| 32 thru 63 | Guitar Hero |
| 64 thru 95 | Rock Band |
No new divisions are currently planned, as there aren't many additional features supported by GH or RB that could be added. Any extensions that games wish to create should be done as a custom/proprietary variant of the format with a distinct file extension, rather than directly in .chart itself.
Local Events¶
Local events are events that appear in instrument tracks. They use the E type code, and are written like this:
<Position> = E <Text>
Textis a bare string that contains the event data.
Much like how global events disallow quotation marks in their text, spaces are normally not allowed in local events since values in section data are space-separated. It is also recommended to ignore these semantics and to treat all text following the type code as a single parameter.
References¶
These are the references for all of the .chart docs.
A large part of the info for .chart comes from FireFox's .chart specifications.
Other info comes from:
- Feedback Editor:
- GitHub
- ScoreHero page
- Some ScoreHero posts:
- Guitar Hero Three Control Panel page
- Open GHTCP:
- some .chart metadata tags
- Data types for those tags:
Lastly, some info or specifics are either gleaned from what's reasonable, or are modern recommendations based on things that have happened over the years.