Text values
Every text value follows one style, so that songs read alike in the song list and are easy to find:- No abbreviations, unless the artist uses them. “ft.” or “feat.”, and “OST”, are common exceptions.
- Title Case: every word capitalized except minor words, such as “the”, “an”, “a” and “of”.
- The artist’s own styling: unusual capitalization or styling of the words, such as
deadmau5, only where the artist uses it. Style tags are a separate choice. - “and” and ”&”: text the artist wrote keeps its “and”. Where separate names are joined, such as two artists or two charters, use ”&”:
Charter A & Charter B. - Spacing: single spaces, and a space on each side of
&,/and each title tag. A title tag is text after the song’s name in parentheses or brackets, such as(Live). - Romanized names: a value in a language that is hard to type on an English keyboard may be written in its romanized form, so that players can search for it. The original may follow it in a title tag:
Gangnam Style (강남스타일).
metadataStyle option, scan-chart reports some values that may not follow this style. These are guesses, and can be wrong. It reports two spaces in a row as textSpacing, and a charter that joins names with something other than ” & ” as creditSeparator. The keys below name its other reports.
Style tags
A text value may hold style tags, the rich-text tags of Unity’s TextMesh Pro, such as<b> and <color=#AEFFFF>:
- Every tag works, including tags that change size and position, such as
<size>,<voffset>and<br>, which can push text out of its space in the song list. Inloading_phrase, YARG keeps only<b>,<i>,<u>,<s>,<sub>,<sup>,<color>,<alpha>,<lowercase>,<uppercase>,<smallcaps>and<br>. - Recommended: colors as
#RRGGBB. The games also read 22 color names, such aslime, except Clone Hero inloading_phrase, where onlyblack,blue,green,orange,purple,red,whiteandyellowwork. - Tags in
charterstop Clone Hero from finding an icon named after the charter: seticoninstead. - Clone Hero and YARG remove the tags from text they send out of the game, such as their Discord status.
- scan-chart keeps the tags, unless its
removeStyleTagsoption istrue. The SongHash ignores them. - Both games ignore tags and letter case to sort and search. Clone Hero ignores any text between
<and>, even when it isn’t a tag, and both games show such text as written:Song <Live>shows its<Live>, but sorts as “Song”, and a search for “live” doesn’t find it in Clone Hero.
The song
- Recommended: every key in the table. A scanner lists a song without
artist,album,genre,yearorcharterwith a placeholder, such as “Unknown Artist”. - A
.chartfile’s[Song]section may repeat these keys: see [Song]. - scan-chart reports a missing
name,artist,album,genre,yearorcharterasmissingValue.
name
- Several songs in one chart: their names separated by
/, as inSong A / Song B. - Featured artists: in a title tag that starts with “ft.”, or with “feat.” when the original title uses it:
Song Name (ft. Guest Artist). scan-chart reports a featured artist outside a title tag, innameor inartist, asfeaturingFormat. - Title tags that are part of the song’s name whatever the chart, such as “ft.”, a remix or “Full Album”, come first.
- Title tags that tell charts of one song apart, such as “Overchart”, “6-Fret” or “Open Notes”, come after every other title tag. scan-chart reports one that comes before a title tag of the song as
titleTagOrder. - Recommended: title tags in parentheses. Brackets are for a title tag that has a reason for them. scan-chart reports a title tag in brackets as
bracketTitleTag.
artist
- The song’s artists, joined with ”&” when they’re separate names.
- A cover: the covering artist, with the covered artist in the song’s name.
- A remix: the remixed artist, with the remixing artist in the song’s name.
covered_by: see Read by YARG only.
album
- A song with no album: the song’s name, followed by
- (Single):Song Name - (Single). scan-chart reports a single’s album written another way, such asSingle, assingleAlbum. - A live recording: the place where it was performed.
- A song on several albums: any of them, with the audio and the album art of the album named.
genre
One genre, as specific as possible: “Complextro” rather than “Electronic”. scan-chart reports a value that lists several, such asRock, Metal, as multipleGenres.
year
- Only the year, in four digits, without a month, a day or a time. scan-chart reports any other form as
yearFormat. - The year the album named in
albumwas released. For a live recording, the year of the performance. Clone Hero’s Artist - Album sort orders by artist, then year, then album, so one year for every song of an album keeps the album together.
year as written, in song details and on the main menu, and sorts and groups songs by the smallest four-digit number in the value. YARG shows only the value’s first run of four or more digits, or the whole value when it has none. So year = , 2002, with the , that older charts write before [Song]’s Year, shows as ”, 2002” in Clone Hero and as “2002” in YARG.
charter
- The names of everyone who placed notes in the chart, joined with ”&”.
- Credit for other work, such as reviewing note placement, adding lyrics, tempo mapping or preparing the audio, may go in
loading_phraseinstead. - When charters split the work by instrument or difficulty, each name may be followed by its part in parentheses:
Charter A (Guitar) & Charter B (Keys). A song with part credits doesn’t need the parts in parentheses. - Write
charter, notfrets: see Deprecated.
charter is the song’s one credit. Clone Hero and YARG show it and sort songs by it, and Clone Hero looks for an icon named after it.
Part credits
A song may also name the charters of each part, in these keys:- Each value names the charters of its part, joined with ” & ”, in the style of
charter. - Recommended:
charternames every charter in the part keys. An exporter that writes part keys writescharterfrom them: each name once, in the order of this table, joined with ” & ”. - A game that shows one credit shows
charter. A game that shows credits by part shows each part key that’s set. - YARG reads the part keys, and shows some of them in its credits menu, for songs from its own sources. Clone Hero doesn’t read them.
- scan-chart reads them. With its
metadataStyleoption, it reports a name in a part key thatcharterdoesn’t hold, asuncreditedPartCharter.
Difficulties
Each key is the difficulty of one instrument:- Each value is a whole number. Recommended: from 0 to 6, or up to 10 for a very hard chart. scan-chart reports a value outside 0 to 10 as
difficultyRange. - Recommended: a difficulty for every instrument the chart has, vocals included, and no key for an instrument it doesn’t have.
- Recommended:
diff_bandwhen the chart has more than one instrument part, counting vocals. With one part, that part’s difficulty is the song’s. - Clone Hero shows any value, with 7 and up as higher tiers. A difficulty that isn’t set shows as
?. - scan-chart reports a missing difficulty of an instrument the chart has as
missingValue, exceptdiff_bandanddiff_drums_real. It reports a difficulty of an instrument the chart doesn’t have asextraValue.
The song list
song_length
- Required: when set, the length of the longest audio file other than
crowdandpreview, in milliseconds, rounded up. - Clone Hero and YARG show
song_lengthin the song list, and sort by it. Clone Hero also adds it up for a setlist and for its play-time statistic, writes it into a replay, and sends it to the leaderboard as the song’s duration. - Neither game uses it to decide when the song ends: a song plays until its audio and its last note have ended, or until a valid
endevent. See The end of the song. - When
song_lengthis missing or 0, Clone Hero measures the audio, withoutcrowd. When it can’t, it takes the end of the last note, plus one beat. It writes the value it found intosong.ini, except for a.sngfile or an encrypted song, which it doesn’t write to. YARG measures the audio when the value is 0 or less, and doesn’t write it. - scan-chart reports a missing
song_lengthasmissingSongLength. It reports asong_lengthshorter than where the chart’s last note ends in the audio asshortSongLength, a warning, placing the chart bydelay, or without one by the.chartfile’sOffset. With itsmediaIssuesoption, it also reports asong_lengthmore than a second away from the longest audio file’s length assongLengthMismatch.fixIssuessets the value to that length. - A
.chartfile’s[Song]section may repeat it asLength, in seconds: see [Song].
Previews
Clone Hero and YARG play the preview frompreview_start_time to preview_end_time. With only one of them set, they play 30 seconds from the start, or the 30 seconds before the end. An end at or before the start counts as not set.
With neither set, the games differ. Clone Hero plays 30 seconds from 20 seconds in, or from the start when the audio is shorter than 20 seconds. YARG plays from 20 to 50 seconds, or the middle 30 seconds of audio shorter than 50 seconds, or the whole of audio shorter than 30 seconds.
- A
preview_end_timeof 0 means not set: a preview can’t end at the start of the song. - A
.chartfile’s[Song]section may repeat both times: see [Song].
album_track and playlist_track
Clone Hero sorts the songs of an album byalbum_track, and the songs of a playlist by playlist_track, then by name. A song without one comes last.
album_track: Recommended for a song on an album, counting from 1. A single has none. Clone Hero writes16000, its default, when it creates asong.ini: leave the key out instead. scan-chart reports a missingalbum_trackasmissingAlbumTrack, unless the album marks a single.playlist_track: the chart’s position in its setlist, counting from 1, only when it’s in one. A setlist is any group of charts meant to be downloaded as one unit, such as all the charts of an official game, a chart pack, a full album or a discography.
playlist and sub_playlist
Clone Hero reads both in lowercase, and lists the song undersub_playlist within playlist. When they aren’t set, it makes a playlist from the song’s folder path. YARG reads only playlist. scan-chart reads both.
icon
Clone Hero shows the icon with this name, in any letter case, from the icons that come with the game or are in its custom icons folder, not from the song folder. Whenicon isn’t set, or names no icon, it looks for an icon named after the charter instead: the charter value in lowercase, with any style tags.
- The icon’s name, without its extension:
icon = mysetlist, notmysetlist.png. Icon names hold only lowercase letters, digits,-and_. scan-chart reports any other form asiconName, andfixIssuesremoves the extension and writes the name in lowercase. - No
iconwhen it would be the charter’s name in lowercase andcharterhas no style tags: Clone Hero already looks for that icon. - Icons come with the game, not with a chart: the list of icons gives their names. A new icon is added through the sources repository.
- scan-chart reads
iconin lowercase, and as not set when it’s the charter’s name.
loading_phrase
A phrase shown before the song starts: Clone Hero shows it on the loading screen, and YARG on the song setup screen. It may also credit work other than placing notes: see charter.modchart
True for a modchart, and left out otherwise. Clone Hero’s song list can filter by it. It has no effect on play, and YARG doesn’t use it. modchart = False changes nothing: scan-chart reports it as defaultIniValue with its styleNotes option, and fixIssues removes it.
explicit_lyrics
True when the lyrics are explicit, and left out otherwise.
- Clone Hero shows an explicit-lyrics badge after the song’s name in the song list when it’s
True. It showsFalseand no key alike, soexplicit_lyrics = Falsechanges nothing. - Clone Hero’s test builds from 1.1.0.5275 to 1.1.0.5684 checked each song without the key against a list of words, and wrote
TrueorFalseinto itssong.ini. Other builds don’t. - YARG doesn’t read
explicit_lyrics. Its own key for this israting: see Read by YARG only. - scan-chart reads it. In every scan, it reports lyrics that hold a word from its list of strong profanities and slurs while
explicit_lyricsisn’tTrue, asmissingExplicitLyrics, a recommendation. It checks English words only, so it can also report a name, or a word that means something else in another language. A word list can’t show that lyrics are clean, so it never reports aTrue, andfixIssuesdoesn’t change the key. - Recommended: when the check reports lyrics that aren’t explicit, list its code in
ignored_issues. This records that the charter has checked the lyrics.explicit_lyrics = Falsecan’t record it, since it means the same as no key: scan-chart’sfixIssuesremoves a key that holds its default value.
Read by YARG only
YARG reads more keys, which other games ignore. A song may hold them, and an exporter keeps them. scan-chart reads each as a metadata field, by the rules on Syntax, so a blank number there is not set, where YARG reads 0. It reportsvideo_loop = False, rating = 0, clean_vocals = False and tuning_offset_cents = 0 as defaultIniValue, since each is the key’s default:
YARG also reads
credit_album_art_by and credit_album_cover as credit_album_art_designed_by, and uses whichever of the three lines comes last. Recommended: credit_album_art_designed_by.
scan-chart reads these keys too, as fields of its metadata beside the keys above, by the rules of Syntax, and reads the two other names of credit_album_art_designed_by as YARG does.
Read by tools
Edge case: an issue that means games read the file differently can’t be ignored: scan-chart reports such a code, and an unknown code, in
ignored_issues itself.
Deprecated
frets, an older name forcharter. A scanner reads it only when there’s nocharterline. Writecharterinstead.frets = 0, common in older files, shows the charter as “0” when there’s nocharterline.track, an older name foralbum_track. Clone Hero reads it only when there’s noalbum_trackline, and YARG uses whichever of the two comes later in the file. Writealbum_trackinstead.
fixIssues, and its saving of an edited song, rename frets to charter, and track to album_track.
Ignored
- Keys of older games and tools that no scanner acts on, such as
lyrics,version,count,tutorial,unlock_keys,cassettecolor,boss_battle,scores,scores_ext,early_hit_window_size,link_name_a,banner_link_a,sysex_keys,drum_fallback_blue,_typekeys such asguitar_type,diff_drums_real_ps,diff_keys_real_ps,diff_dance,real_keys_lane_count_left,real_keys_lane_count_right, the tuningsreal_guitar_tuning,real_guitar_22_tuning,real_bass_tuningandreal_bass_22_tuning, and Editor on Fire’seof_midi_import_keys. YARG reads some of them, but nothing uses them. An exporter may keep them. diff_coop,diff_coopghlanddiff_rhythmghl, names from one Clone Hero test build. No game reads them: writediff_guitar_coop,diff_guitar_coop_ghlanddiff_rhythm_ghlinstead.md5_hash, which only a Clone Hero tool reads, when it builds Clone Hero’s encrypted song packs. It has no effect in a song folder.
Invalid forms
No name, or a blank one
No name, or a blank one
Clone Hero doesn’t list the song. YARG shows a blank
name as “Unknown Name”, and doesn’t list a song with no name line. scan-chart shows “Unknown Name”, and reports it as missingValue. A scanner’s SongHash holds Unknown Name, as Clone Hero’s HashScanTool and scan-chart calculate it: see SongHash.A blank charter or album_track, or album_track = -1, with frets or track
A blank charter or album_track, or album_track = -1, with frets or track
Clone Hero uses the main key whenever it’s in the file: a blank
charter shows as “Unknown Charter”, a blank album_track sorts the song last, and album_track = -1 sorts it first. YARG does the same for charter, and for album_track and track uses whichever line comes later. A scanner reads the main key as not set, and doesn’t read frets or track. scan-chart reports the main key’s value as a blank value or -1.A song_length that isn't the audio's length
A song_length that isn't the audio's length
Clone Hero measures the audio only when
song_length is missing or 0, and YARG only when it’s 0 or less, so both show the wrong length, and Clone Hero sends it to the leaderboard. scan-chart reports a song_length shorter than the end of the last note as shortSongLength. With its mediaIssues option, it reports one more than a second away from the longest audio file’s length as songLengthMismatch, and fixIssues sets it to that length.