> ## Documentation Index
> Fetch the complete documentation index at: https://chart-spec.enchor.us/llms.txt
> Use this file to discover all available pages before exploring further.

# Settings

> The song.ini keys that change how a song plays: the drum type, sustains, chords and the background video, and the older keys that still do.

Most songs need none of these keys. A chart written the way it should play reads the same in every game without them:

```ini theme={null}
[song]
name = Song Name
artist = Artist
charter = Charter
video_start_time = 1500
five_lane_drums = True
```

Here the drums are 5-lane, though their notes don't show it, and the background video skips its first 1.5 seconds.

## Drum type

| Key | Value |
| - | - |
| `five_lane_drums` | `True` when the drums are 5-lane |
| `pro_drums` | `True` when the drums are pro, with cymbals |

[Drums](/chart/drums#drum-types) gives how a scanner decides the drum type. **Recommended:** leave both keys out when the notes already give the type, and set one only when they don't. `False` means the same as leaving the key out: scan-chart reports `False` as `defaultIniValue` with its `styleNotes` option, and `fixIssues` removes it. scan-chart reports a key that sets the type the notes already give as `redundantDrumType`, and `fixIssues` removes it.

**Required:** not both `five_lane_drums = True` and `pro_drums = True`.

## Sustains and chords

| Key | Value |
| - | - |
| `sustain_cutoff_threshold` | In ticks. A note whose sustain is no longer than this is read with no sustain |
| `chord_snap_threshold` | In ticks. Notes closer together than this are merged into chords |

* [How notes resolve](/chart/note-resolution) gives what each one does. Without `sustain_cutoff_threshold`, a `.chart` file has no cutoff, and a `.mid` file has a default cutoff of about a third of a beat.
* **Required:** a `sustain_cutoff_threshold` of 0 or more in a `.mid` song.
* **Recommended:** leave both out of a new chart, and write each sustain and each chord as it should play. Charts that set them stay valid.
* scan-chart's converter writes `sustain_cutoff_threshold` when it converts a `.chart` file to `.mid`, so that sustains the `.mid` default would cut keep their length.

## Background video

| Key | Value |
| - | - |
| `video_start_time` | In milliseconds: how much of the background video to skip when it starts. A negative value delays the video's start instead |

Without it, the video starts at its beginning. Clone Hero's song settings menu writes this key when a player changes it.

## Deprecated

Older charts use these keys, and a scanner still reads them, so that those charts play as they always have. An exporter writes the chart so that it plays as it should without them, except for `multiplier_note = 116` in the edge case below.

Removing a key changes how the chart plays, unless the chart changes with it. A [TrackHash](/hashes/btrack) holds the track as a scanner reads it, not these keys: see [What the TrackHash holds that games ignore](/hashes/btrack#what-the-trackhash-holds-that-games-ignore). So a chart rewritten to read the same without a key keeps its TrackHashes and its SongHash. Removing a key without rewriting the chart changes a TrackHash only where the track then reads differently, such as `multiplier_note = 103` in a track with star power.

* **`delay`**, in whole milliseconds: Clone Hero moves every note this much later against the audio, or earlier when it's negative. YARG reads it too. A `delay` of 0 means not set, and a `.chart` file's `Offset` applies instead: see [\[Song\]](/chart/song). Line the notes up with the tempo map and the audio's leading silence instead. Removing `delay` moves every note in time, so the chart or the audio has to change with it. Clone Hero's song settings menu writes `delay` when a player changes the song's offset.
* **`hopo_frequency`** and **`eighthnote_hopo`** change the HOPO threshold: see [How notes resolve](/chart/note-resolution#deprecated). A `hopo_frequency` of 0 or less means not set. Force the notes that should be strums or HOPOs instead. scan-chart's `fixIssues`, and its saving of an edited song, force each note whose strum or HOPO the keys change, and remove the keys. Every TrackHash and the SongHash stay the same.
* **`multiplier_note`**, `103` or `116`: the MIDI note that marks star power in a `.mid` file's 5-fret, 6-fret and keys tracks, and in YARG also in its drums track. A `.chart` file ignores it. **Required:** `103` or `116`.
  * With `103`, a scanner reads note 103 as star power in those tracks, and ignores note 116 there. Move the star power phrases to note 116 instead, and remove the key. scan-chart's `fixIssues`, and its saving of an edited song, do so.
  * With `116`, a scanner reads note 116 as star power and note 103 as solos in those tracks. Without the key, it does the same, except in the tracks the edge case below describes.
  * scan-chart reports star power that `multiplier_note` makes a scanner ignore as `badStarPower`.
* **`pro_drum`** and **`star_power_note`**, older names for `pro_drums` and `multiplier_note`. A scanner reads one only when the main key isn't in the file. YARG reads them as the main keys too, but when a file holds both names, it uses whichever line comes later. Write `pro_drums` instead of `pro_drum`, and treat `star_power_note` as `multiplier_note` above. scan-chart's `fixIssues`, and its saving of an edited song, rename them.
* **`frets`** and **`track`**, older names for `charter` and `album_track`: see [Metadata](/ini/metadata#deprecated).

**Edge case: `multiplier_note = 116`.** Note 103 also marks solos, and Guitar Hero 1 charts mark star power with it without setting the key. So in a `.mid` 5-fret, 6-fret or keys track with two or more solo notes and no star power, a scanner reads the solos as star power, unless `song.ini` sets `multiplier_note`. `multiplier_note = 116` keeps such a track's solos as solos: an exporter writes it only for a song with such a track. scan-chart's converter writes it in that case.

## Ignored

* **`end_events`.** No game reads it. A chart's end events work the same either way: see [The end of the song](/chart/events#the-end-of-the-song). Leave it out. scan-chart reports it as `defaultIniValue` with its `styleNotes` option, and `fixIssues` removes it.
* **`hopofreq`**, a Frets on Fire X key. Clone Hero, YARG and scan-chart ignore it. Leave it out. scan-chart reports it as `unknownIniTag`.

## Invalid forms

<Accordion title="A delay with a decimal point, such as delay = 1.5">
  A scanner reads it as seconds, as Clone Hero and YARG do, and drops any fraction of a millisecond: `delay = 1.5` is 1,500 milliseconds, `delay = -0.85` is -850, and `delay = 0.0004` is 0, which means not set. A value with a decimal point that isn't a number, such as `1.2.3`, is 0 too. Charts that hold such a `delay` mean seconds: it's often the `.chart` file's `Offset`, copied over. scan-chart reports it as `invalidValue`.

  Clone Hero multiplies in single precision, so a few values come out 1 millisecond lower there: `delay = 0.251` is 250 milliseconds.
</Accordion>

<Accordion title="A multiplier_note other than 103 or 116">
  Clone Hero and scan-chart read it as if the key weren't there, and so read the solos of the tracks in the edge case above as star power. YARG uses note 116. A scanner reads it as Clone Hero does. scan-chart reports it as `invalidValue`.
</Accordion>

<Accordion title="Both five_lane_drums and pro_drums set to True">
  A scanner reads the drums as 5-lane: see [Drums](/chart/drums#invalid-forms). scan-chart reports it as `invalidValue`.
</Accordion>

<Accordion title="A negative sustain_cutoff_threshold in a .mid song">
  A scanner uses the `.mid` default cutoff, as Clone Hero and scan-chart do. YARG uses the value as written, so it cuts no sustains.
</Accordion>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.