GTFOCustomMusic
A sound engine for GTFO that plays your own music, driven by what the team is doing. Combat music and a boot sound so far, synced in multiplayer. Ships no music.
By 000_000_0000
| Last updated | 5 hours ago |
| Total downloads | 5 |
| Total rating | 0 |
| Categories | |
| Dependency string | 000_000_0000-GTFOCustomMusic-1.0.0 |
| Dependants | 0 other packages depend on this package |
This mod requires the following mods to function
BepInEx-BepInExPack_GTFO
BepInEx pack for GTFO. Preconfigured and includes Unity Base DLLs.
Preferred version: 3.2.3README
GTFOCustomMusic
A sound engine for GTFO that plays your own music in place of the game's, driven by what your team is actually doing.
Status: combat music and a boot sound are done. More (elevator drop, menus, expedition end, stingers) is planned. The package ships no music: you bring the tracks.
What it does
- Combat music. It plays the right mood for what the team is doing:
- Suspense: a muffled or layered version of the track while you sneak, or when an alarm starts.
- Combat: it opens up into the full loop on contact, or when a room wakes.
- Cooldown: it fades out when the fight is over.
- Pools. Combat, Alarm and Extraction pools, so alarms and the run to the exit get their own tracks.
- Sample-accurate playback. Loops, lead-ins and stingers are scheduled on the audio clock: no seams, no gaps.
- Synced multiplayer. The host decides, and every player hears the same track at the same moment.
- GTFO's own music is muted while yours plays. Your Master and Music sliders still apply.
- Boot sound. An optional clip plays when you press Inject on the start screen.
- Pause support. It pauses along with GTFOPause, or anything else that stops game time.
Setup
- Install with r2modman, and start the game once.
- Put your
.oggor.wavfiles inBepInEx/config/GTFOCustomMusic/. - Edit
playlist.jsonin that folder (the first start creates an empty one; comments are allowed):
{
"BootSound": "boot.ogg", // optional
"Tracks": [
{ "Id": "my-song", "Pools": ["Combat"], "Loop": "my-song-loop.ogg", "Bpm": 120 },
{ "Id": "big-one", "Pools": ["Alarm", "Extraction"], "LeadIn": "big-one-leadin.ogg",
"Loop": "big-one-loop.ogg", "Volume": 0.8, "Bpm": 140 }
]
}
- Press F10 in game to reload the playlist without restarting (only while no music is playing).
Track fields
Only Id and Loop are required.
| Field | What it is |
|---|---|
Loop |
The part that loops through a fight. Cut it on whole bars. |
LeadIn |
A build-up played when suspense starts. It ends exactly where Loop begins. |
Stinger |
A short hit played when a scout screams, right before Loop. |
SuspenseLayer |
A quieter version of Loop with exactly the same length, played while sneaking. Without one, a muffled copy of Loop is used. |
Suspense |
A separate looping clip used for suspense instead of the layer. |
Pools |
Combat, Alarm and/or Extraction. Empty pools fall back to the one before. |
Volume, Bpm, BeatsPerBar |
Loudness, and the tempo used to land switches on a bar. |
Meme |
Occasional filler track; how often is set by the MemeChance* settings. |
Multiplayer
Everyone needs the mod and the same playlist and files. If they differ, it's logged on both sides.
The easiest way to share is an r2modman profile export as a file (Settings → Export profile as a file). That .r2z file carries everything in BepInEx/config, including your music and playlist. A profile code is limited to 20 MB, so it usually can't carry the music.
Settings
BepInEx/config/dev.ntainy.GTFOCustomMusic.cfg, or r2modman's config editor:
| Setting | Default | What it does |
|---|---|---|
MasterVolume |
1 |
Balance of your music against the game's |
FollowGameSliders |
true |
GTFO's Master and Music sliders scale your music too |
GameMusic |
MuteWhilePlaying |
Mute GTFO's music while yours plays (Never to keep it) |
BootSoundEvent |
PLAY_06_MAIN_MENU_LAUNCH |
The game sound the boot clip replaces |
RotateAfter |
600 |
Seconds before a long fight moves on to another track |
ShowOverlay |
false |
Debug overlay (F9 toggles it) |
Every detection and playback setting is described in the config file itself.