GTFO
Install with App

Details

Latest version
1.0.0
Last Updated
First Uploaded
Downloads
16
Likes
0
Size
114KB
Dependants

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

  1. Install with r2modman, and start the game once.
  2. Put your .ogg or .wav files in BepInEx/config/GTFOCustomMusic/.
  3. Edit playlist.json in 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 }
  ]
}
  1. 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.

Thunderstore development is made possible with ads. Please consider making an exception to your adblock.