Audio Files

Audio is split into what your pack owns and what it replaces in another pack.

Sounds/                          owned sound effects and voices
Musics/                          owned music tracks
Musics/<track>.json              loop points for one track
Audio Replacements/
  <Target Pack>/
    music-replacements.json      redirect that pack's music to yours
    sound-replacements.json      redirect that pack's sounds to yours

Owned audio

Drop audio files into Sounds/ or Musics/. Supported formats are .wav, .mp3, and .ogg.

Everything references audio by base file name, without the extension.

Sounds/heavy-hit.wav      ->   "heavy-hit"
Musics/stage-1.ogg        ->   "stage-1"

That name is what goes in logic.json sounds groups, a SoundEvent's soundName, a hitbox's soundName, an art file's musicName, and a Lua play_sound call:

game.this_character.play_sound("My Pack", "heavy-hit", 1)

Anything in these folders that is not a .json file is treated as an audio asset, so keep stray files out.

Sound names must be unique within a folder regardless of extension. punch.wav and punch.ogg are the same name "punch", and which one wins is not defined.

Music loop points

A music track loops from the start by default. To loop a section, add a JSON file beside the audio with the same base name:

Musics/Fighting In The Streets.ogg
Musics/Fighting In The Streets.json
{
  "loopStartTimeInSeconds": "8.132",
  "loopEndTimeInSeconds": "32.865"
}
Field Meaning
loopStartTimeInSeconds Where the loop restarts from.
loopEndTimeInSeconds Where the loop jumps back from. 0 or omitted loops at the end of the clip.
loopTimeInSeconds Legacy name for the loop start, read only when loopStartTimeInSeconds is absent. Prefer the explicit pair.

The Audio Editor writes these values as JSON strings, as shown. Plain numbers work too. Either way they are parsed with invariant culture, so the decimal separator is a dot regardless of the player's locale — a loop point of 12.5 behaves the same on a machine that formats numbers with a comma.

Times are in seconds and are converted to sample positions against the clip's own sample rate, so they stay correct whatever the file's encoding.

Replacing another pack's audio

To use your audio in place of another pack's — nearly always Classic — add a replacement map under Audio Replacements/<Target Pack>/. The target pack's own files are untouched; the redirect lives entirely in your pack.

Both files are plain objects keyed by the target pack's audio identifier.

music-replacements.json

Keys are Classic music identifiers such as M00, M03, M06.

{
  "M00": { "packName": "My Pack", "musicName": "Stage 1 Remix" },
  "M03": { "packName": "My Pack", "musicName": "Fighting In The Streets V2" }
}

sound-replacements.json

Keys are Classic sound slot numbers, written as strings.

{
  "0":  { "packName": "My Pack", "soundName": "hit-1" },
  "13": { "packName": "My Pack", "soundName": "power-blast" }
}

In both files, packName is the pack providing the replacement, normally your own, and the name resolves inside that pack's Musics/ or Sounds/ folder.

You only list what you are replacing. Anything absent from the map keeps the target pack's original audio, so a partial replacement map is perfectly normal.

An empty map, or one that fails to parse, is skipped entirely — no replacements are registered and no error is raised. If a replacement seems to do nothing, check the file parses and that the folder name matches the target pack exactly.

Which mechanism to use

You want Use
A new sound for your own character's punch Owned audio in Sounds/, referenced from logic.json.
Your own music on your own level Owned audio in Musics/, referenced from the level's - art.json.
Every Classic punch to sound different sound-replacements.json.
Classic Stage 1's music replaced music-replacements.json.
A sound at one exact animation frame A SoundEvent in logic.json.
The music to change mid-animation A MusicEvent in logic.json.