AudioCore β€” Fully Dynamic Audio System for Unreal Engine
Complete Reference Β· v1.0

AudioCore

A fully dynamic, component-based audio system for Unreal Engine 5.8+. One system. Every situation. Total immersion.

Unreal Engine 5.8+ Component-Based Combat Music & Stems Interior Acoustics Day / Night Weather & Seasons World Sources Darksaint Games
πŸ“‹ Table of Contents
πŸš€
Section 1

Quick Start

  1. Enable the plugin

    Edit β†’ Plugins β†’ search "Audio Core" β†’ Enable β†’ restart the editor. AudioCore enables the MetaSound and Synthesis plugins it depends on automatically.

  2. Add the player component

    On your player pawn (Blueprint or C++) add an Audio Core Player component. This one component drives all music, ambience, combat, interiors and day/night.

  3. Give it music

    Either assign a Default Profile (a Sound Profile data asset) for the full package, or just drop a sound into Default Day Music for a basic setup. Optionally set Combat Music.

  4. Place a zone (optional)

    Drag an Audio Core Zone into the level, size its Box/Sphere, and assign a Sound Profile or inline Day/Night music. Walking in takes over the soundscape; walking out fades back.

  5. Mark your enemies (optional)

    Add an Audio Core Enemy Marker component to enemy actors so they trigger combat music when near the player.

  6. Drive time of day (optional)

    Call SetTimeOfDay(0–24) from your own time/sky logic so day/night music variants switch automatically.

  7. Test in PIE

    Type AudioCore.Debug 1 in the console to show the live debug overlay.

πŸ—
Section 2

How It Fits Together

AudioCore is built around one component on the player plus a few optional actors and data assets. There is no manager actor to place and no required setup beyond the player component.

🧩
Section 3

Components & Actors

Audio Core Player

Add to your player pawn. The heart of the system β€” manages the zone & interior stacks, scans for enemies, runs the day/night clock, and crossfades music across two slots. Exposes a full Blueprint runtime API.

UAudioCorePlayerComponent

Audio Core Zone

A Box or Sphere trigger placed in the level. On overlap it pushes its music/profile onto the player's zone stack; on exit it pops. Highest Priority wins. Can silence ambience and carry its own resume rules.

AAudioCoreZone

Audio Core Interior Volume

A Box or Sphere that changes how everything sounds while inside: universal muffle (low-pass) and reverb on the whole mix, music ducking, exterior-ambience leak control, room tone, and optional interior music.

AAudioCoreInteriorVolume

Audio Core Enemy Marker

Add to any enemy actor. While one or more markers are active within the player's detection radius, combat music plays. Each marker can specify its own combat track and a priority (e.g. boss theme).

UAudioCoreEnemyMarker

Audio Core Settings

GameInstance subsystem for Master / Music / SFX / Ambient volumes. Wire to UI sliders, apply to Sound Classes, save/load to GameUserSettings.ini, and broadcast changes for any save system.

UAudioCoreSettingsSubsystem

Sound Profile

Data asset bundling music + dynamic ambience. Assign to a zone or the player's Default Profile slot. Create via Content Browser β†’ Miscellaneous β†’ Data Asset β†’ Audio Core Sound Profile.

UAudioCoreSoundProfile

Audio Core Sound Source

A world-positioned point emitter: waterfall, forge, campfire, surf, humming crystal. Engine attenuation handles distance falloff and virtualizes it when far. Muffled by interiors automatically.

AAudioCoreSoundSource

Audio Core Spline Source

A world emitter that follows a path. Lay the spline along a river, wall of flame, or stretch of surf and one voice rides the nearest point to the listener β€” a tube of sound along the entire path.

AAudioCoreSplineSource

Audio Core Sound Emitter

A component for any actor β€” an animal, bird, frog, creaking tree, machine, torch β€” that plays occasional one-shots on its own random timer. Timer-driven, no tick.

UAudioCoreSoundEmitterComponent

Audio Core Snapshot

Data asset for a predefined mix state: underwater, low-health, dream, spirit realm, drunk. Push it from gameplay to muffle/reverb the whole mix, duck or re-pitch music. Composes with interiors.

UAudioCoreSnapshot

Audio Core Discovery Volume

A Box or Sphere that fires a one-shot moment when the player walks in: a stinger, SFX one-shot, narration (with auto music duck), and/or a pushed mix snapshot. Fires once by default with a save-friendly Discovery Id.

AAudioCoreDiscoveryVolume

Sound / Spline Source Profile

Reusable data assets that bundle a complete world-emitter setup. Author "RiverLoud" or "Campfire" once and reuse it anywhere. Assigning one fully drives the source and hides its inline fields.

UAudioCoreWorldSourceProfile
βš™
Section 4

Player Component β€” Key Properties

PropertyDefaultDescription
Default ProfilenoneSound Profile used outside all zones (music + ambience). Overrides the inline Default*Music when it defines music.
Default Day Music / Night MusicnoneSimple inline fallback music when no profile is set. Night falls back to Day if empty.
Combat MusicnoneComponent-level combat track, used when no nearby enemy or active profile supplies one.
Enemy Detection Radius2000 cmDistance within which active enemy markers trigger combat music.
Enemy Check Interval0.25 sSeconds between enemy scans.
Crossfade Duration2.0 sSeconds to blend between music tracks.
Resume Music PositiontrueResume a track where it left off instead of restarting it next time it plays.
Resume Memory Duration30 sIn-game seconds a saved position stays valid before the track restarts. 0 or less = never expire.
Respect Settings VolumestrueScale this component's audio by the Settings sliders (Master Γ— Music for music; Master Γ— Ambient for ambience).
Day Start Hour / Night Start Hour6 / 18Hours (24h clock) that mark the day and night windows.
🎼
Section 5

Sound Profiles

A Sound Profile is a data asset that describes a complete soundscape for an area. Any sound asset works in every slot β€” Sound Wave, Sound Cue, or MetaSound Source. Profiles are optional; zones and the player component also accept inline music for basic setups.

Music Section

PropertyDescription
Day MusicLooping music played during the day.
Night MusicLooping music played at night. Falls back to Day Music if empty.
Combat MusicTrack used while enemies are near and no nearby enemy supplies its own.
Combat StemsOptional intensity layers that ride on top of the combat track and fade in as the fight escalates (by nearby enemy count). Each stem has: Stem, Fade In At Enemy Count, Volume, and Fade Time.

Ambient Beds β€” Continuous Loops

Steady layers that play the whole time the area is active: wind, rain, room tone, river, crowd, machinery.

PropertyDescription
SoundThe looping sound for this bed (Wave / Cue / MetaSound).
Volume / Pitch MultiplierSteady level and playback speed.
Volume / Pitch Drift & RateHumanization: how far and how quickly volume/pitch slowly wander so long loops never sound static.
Random Start OffsetStart the loop at a random point so reused assets don't phase-lock.
Play DuringDay & Night, Day Only, or Night Only.
Weather / SeasonOptional tag gates. Empty = always; otherwise only plays when the current tag matches.
Play During CombatOff (default) fades the bed during combat; on keeps it underneath the fight.
Interior Tag / Interior Volume ScaleLet interior volumes quiet this bed by tag, or set a fixed indoor level (-1 = inherit the interior's default).

Scatter Layers β€” Occasional One-Shots

Intermittent sounds fired on a random timer: birds, insects, distant animals, creaks, gusts. Layers are auto-staggered so they never fire in lock-step.

PropertyDescription
SoundsPool of one-shots; one is chosen each time the layer fires.
No Immediate RepeatShuffle so the same clip never plays twice in a row.
Min / Max IntervalRandom gap (seconds) between plays.
Min / Max Burst, Burst SpacingFire several one-shots together (e.g. a flock), each slightly apart with its own random vol/pitch/spot.
Play ChanceProbability (0–1) the layer actually plays each time its timer fires.
Min / Max Volume, Min / Max PitchRandom ranges applied per play.
Spatialize, Min/Max Radius, Min/Max ElevationPlace each one-shot at a random spot around the listener, or play it as 2D.
Attenuation / ConcurrencyOptional Sound Attenuation (3D falloff) and Sound Concurrency (cap simultaneous plays) assets.
🎡
Section 6

Music & Resume

Music plays through two audio slots that ping-pong, so every change is a smooth crossfade of Crossfade Duration seconds. Music is non-positional (2D) β€” it always plays at full level regardless of listener position.

With Resume Music Position on, AudioCore remembers where a track was when it was swapped out. Return within Resume Memory Duration (in-game seconds) and it continues mid-track; wait longer and it starts fresh. Set the duration to 0 or less to always resume. Zones and interior volumes can override these rules per-area via Override Resume Settings.

βš”οΈ
Section 7

Combat Music

While one or more active enemy markers are inside Enemy Detection Radius, combat music takes over. The track is resolved in priority order:

  1. Per-enemy β€” the nearby active enemy with the highest Combat Music Priority that supplies its own Combat Music (e.g. a boss theme).
  2. Active profile β€” the current Sound Profile's Combat Music.
  3. Component β€” the player component's Combat Music.

If the active profile defines Combat Stems, they start in sync with the combat track and fade in or out as the nearby enemy count crosses each stem's Fade In At Enemy Count, building intensity as a fight grows. Ambient beds and scatter layers fade out during combat by default (opt back in per-layer with Play During Combat).

⏱
Section 8

Transition Cooldowns & Hysteresis

The Transitions section on the player component smooths out edge cases from standing on a boundary or fighting trickling enemies. Every value defaults to 0 β€” turn them up only where you want the extra polish.

PropertyDefaultWhat It Does
Zone Transition Cooldown0Debounce (seconds) on zone music/ambience changes so straddling a zone edge doesn't spam crossfades.
Interior Transition Debounce0Debounce on interior acoustic changes so muffle/reverb doesn't flicker in a doorway.
Combat Enter Delay0Wait this long after enemies are detected before combat music engages β€” avoids a stab of battle music for a foe only briefly in range.
Combat Exit Delay0Keep combat music going this long after the last enemy leaves or dies. The single biggest quality win β€” stops music whiplashing between back-to-back fights. Enemies reappearing within the window cancel the exit.
ℹ️
IsInCombat vs IsCombatMusicActiveIsInCombat reports the raw "enemy in range" state. IsCombatMusicActive reports whether the combat music is engaged β€” it can linger after combat thanks to Combat Exit Delay. With both delays at 0 they are identical.
πŸ“
Section 9

Zones & Priority Stacking

Each Audio Core Zone the player overlaps is pushed onto a stack sorted by Priority. The top zone decides the music/ambience. Exiting any zone pops it and the next one down resumes β€” no manual tracking needed.

RuleBehaviour
Higher priority winsA priority-10 zone overrides a priority-5 zone even if entered second.
Equal priorityThe most recently entered zone sits on top.
Start inside a zoneOverlaps present at Begin Play are scanned, so spawning inside a volume uses that volume's audio immediately.

A zone provides sound via a Sound Profile (full package β€” day/night/combat music plus dynamic ambient beds and scatter), or just inline Day/Night Music for a simple area. Its Ambience Mode can be Inherit (use this zone's profile ambience) or Silence (stop all ambient beds and scatter β€” for tense or dead spaces).

πŸ›
Section 10

Interior Volumes

Interior volumes are orthogonal to zones: a zone decides which music plays; an interior decides how the whole soundscape sounds while you are inside it. They stack by Priority and all transitions blend over Blend Time.

⚠️
Affects EverythingThe muffle and reverb run on a submix β€” by default the project's main output submix β€” so they affect all audio (music, SFX, dialogue), not just AudioCore.
PropertyDescription
Muffle (+ Frequency, Resonance)Low-pass filter on the whole mix β€” like hearing through a wall. Lower frequency = more muffled.
Reverb EffectA Submix Effect Preset applied to the whole mix to give the space its acoustics.
Target Submix (Advanced)Leave empty to affect the main output (recommended). Set only to limit the effect to one specific submix.
Music Volume ScaleDuck the AudioCore music while inside. 1 = unchanged, 0 = silent.
Exterior Bed / Scatter Volume ScaleDefault leak for outdoor ambient beds (wind) and scatter (birds) heard through the walls.
Ambience OverridesPer-layer indoor levels by tag β€” e.g. silence "Birds" but keep "Wind" at 0.4.
Interior Ambience (+ Volume)Optional room-tone loop that fades in while inside.
Interior Music / Interior Night MusicOptional dedicated track that replaces zone/default music while inside, with its own day/night variant and resume override.
🌊
Section 11

Mix Snapshots

A Audio Core Snapshot is a data asset describing a predefined mix state pushed from gameplay β€” underwater, low-health, dream sequence, spirit realm, drunk. It is the same kind of acoustic state an interior applies, but driven by code/Blueprint instead of a volume, so it can react to anything: health, items, story beats.

// Push when the player goes underwater, remove when they surface
PlayerComp->PushAudioSnapshot(Tag_AudioCore_Snapshot_Underwater, UnderwaterSnapshot, /*Priority*/ 10);
PlayerComp->PopAudioSnapshot(Tag_AudioCore_Snapshot_Underwater);

Snapshots stack by priority and compose with any active interior: the highest-priority snapshot wins for muffle/reverb, and its music duck multiplies with the interior's.

PropertyDescription
Muffle (+ Frequency, Resonance)Low-pass the whole mix β€” the classic underwater/concussed feel.
Submix Effect (+ Target Submix)A submix effect (reverb, EQ, distortion) applied to all audio.
Music Volume ScaleDuck the music while active (multiplies with interior + manual ducks).
Music PitchRe-pitch the music β€” drop below 1 for a woozy drunk/dream slow-down.
Snapshot Ambience (+ Volume)Optional looping tone that fades in while active (underwater rumble, spirit drone).
Blend TimeSeconds to blend the snapshot's effects in/out on push/pop.

API on the player component: PushAudioSnapshot(Tag, Snapshot, Priority), PopAudioSnapshot(Tag), ClearAudioSnapshots(), and queries GetActiveSnapshotCount, GetActiveSnapshotTag, IsSnapshotActive(Tag).

🌊
Section 12

World Audio Sources

World sources are sounds that live in the level rather than ambience tied to the listener β€” waterfalls, forges, campfires, windmills, magical crystals, ocean surf, flowing rivers. Each works the moment you assign a Sound β€” no attenuation asset to author β€” and is shaped by two editable radii:

Sound Source (Point)

Drop it where a sound should live, assign a Sound, and set the two radii. No tick. Use Set Source Active to switch it on/off from gameplay. Supports optional day/night, weather and season gates.

Spline Source (Path)

Lay its spline along a river, stream, wall of flame, or stretch of surf and the sound plays all along it. A single spatialized voice rides the point on the spline closest to the listener β€” a tube of sound wrapped around the whole path. One voice, no gaps, no phasing, and it costs nothing when out of range.

Select the actor to see a live wireframe tube in the viewport β€” cyan for the Core Radius and orange for the Audible Radius. Enable Use Per-Point Widths to give each spline point its own radii β€” a wide river mouth, a tight upstream channel.

Environmental Ducking (Proximity Masking)

Turn on Duck Other Audio on any Sound Source or Spline Source to gently lower the player's music and ambience as the listener approaches. The dip scales with proximity and multiple sources blend β€” the strongest duck wins per channel, so overlapping rivers never stack into silence.

πŸ’‘
Zero cost when unusedDucking is opt-in (off by default). The player component only runs its lightweight proximity check while at least one ducking source is registered.
♻️
Section 13

Reusable Profiles

World sources and discovery volumes can be configured inline for a one-off, or driven by a profile data asset so one authored setup can be reused across the level. Assigning a profile fully drives the actor and hides its inline fields β€” tweak "RiverLoud" once and every river updates.

ProfileDrivesBundles
Sound Source ProfilePoint sourcesSound, radii, attenuation, concurrency, volume/pitch, fade, auto-play, settings routing, environmental ducking, and day/night + weather/season gates.
Spline Source ProfileSpline sourcesSame world-source settings, authored for paths (river, surf, wall of flame).
Discovery ProfileDiscovery volumesWhat the volume plays: stinger, one-shot, narration + snapshot. The volume's shape and trigger rules stay per-placement.
🐦
Section 14

Periodic Sound Emitters

Drop Audio Core Sound Emitter on any actor to have it play occasional one-shots on its own random timer β€” a wolf that howls, chirping birds, a frog, an owl, dripping water, a sputtering machine. Timer-driven (no per-frame tick), and a BlueprintSpawnableComponent.

PropertyDescription
Sounds / No Immediate RepeatPool of one-shots; one is picked at random each fire, never repeating back-to-back.
Min / Max IntervalRandom gap (seconds) between plays.
Play ChanceProbability (0–1) it actually plays each time its timer fires.
Random Start DelayStagger the first play so clustered emitters don't fire in unison.
Min / Max Burst, Burst SpacingFire several one-shots together (a flock or pack).
Spatialize, Audible Radius, Core RadiusPlay in 3D from the actor with the same both-ears core falloff, or turn off for 2D.
Play During / Weather / Season / Play During CombatThe same gates as the rest of the system β€” e.g. owls at night, birds by day, birds fall silent in a fight.

Runtime API: StartEmitter(), StopEmitter(), IsEmitting(), and PlayNow() to fire one immediately.

πŸ”
Section 15

Discovery Volumes

An Audio Core Discovery Volume is a Box or Sphere that fires a one-shot moment when the player walks in β€” perfect for vistas, ruins, and reveals. Any combination plays together:

Fires once by default (Trigger Once). For exploration saves, expose Has Triggered keyed by the stable Discovery Id to your own save system. Enable Re-Arm On Exit to let it fire again each time the player re-enters. The On Discovered event passes the discovering actor so you can drive quests, UI or markers in Blueprint.

πŸŒ™
Section 16

Day / Night

AudioCore keeps a 24-hour clock that selects day vs night variants of music. Drive the time from whatever sky logic your project uses:

// Standard 24-hour clock (0-24): 12 = noon, 6.5 = 6:30 AM
PlayerComp->SetTimeOfDay(13.5f);

// Convenience for systems that report a 0-2400 clock value
PlayerComp->SetTimeOfDayScaled(1830.f); // 1830 = 6:30 PM

Day Start Hour (default 6) and Night Start Hour (default 18) define the windows. Calling SetTimeOfDay every frame is safe β€” music only re-evaluates when the day/night boundary is actually crossed.

🌧
Section 17

Weather & Season

Weather and season are tag-driven and system-agnostic. Map your project's current state to a Gameplay Tag and pass it in β€” AudioCore never reads any external system directly.

PlayerComp->SetWeather(Tag_AudioCore_Weather_Rain);
PlayerComp->SetSeason(Tag_AudioCore_Season_Winter);

Ambient beds and scatter layers carry optional Weather/Season gates: an empty gate always plays, otherwise the layer only plays while the current tag matches. The On Weather Changed and On Season Changed events let you react in Blueprint without polling.

πŸŽ›
Section 18

Settings & Volume Control

The Audio Core Settings subsystem holds Master, Music, SFX and Ambient volumes (0–1). Grab it from any Blueprint with Get AudioCore Settings (no object pin needed) or in C++ with UAudioCoreSettingsSubsystem::Get(this).

To drive actual channel levels, assign a Sound Mix and Sound Classes once on the subsystem: Audio Mix, Music Sound Class, SFX Sound Class, Ambient Sound Class.

FunctionPurpose
Set/GetMasterVolume, Set/GetMusicVolume, Set/GetSFXVolume, Set/GetAmbientVolumeSet or read a channel (0–1). Wire Set functions to UI sliders.
GetAllSettingsSnapshot all volumes as one FAudioCoreSettings struct (handy for saving).
SaveSettings / LoadSettingsPersist to / restore from GameUserSettings.ini.
OnSettingsChangedMulticast event fired whenever any volume changes β€” bind reactive UI or your save system.

UI Sliders

// On a slider's OnValueChanged:
UAudioCoreSettingsSubsystem::Get(this)->SetMusicVolume(SliderValue);

// To initialise the slider:
MusicSlider->SetValue(UAudioCoreSettingsSubsystem::Get(this)->GetMusicVolume());

Bridging Your Save System

// Persist whenever volumes change
auto* S = UAudioCoreSettingsSubsystem::Get(this);
S->OnSettingsChanged.AddDynamic(this, &UMySave::OnAudioChanged);

// On load, push values back:
S->SetMasterVolume(Saved.MasterVolume);
S->SetMusicVolume(Saved.MusicVolume);
S->SetSFXVolume(Saved.SFXVolume);
S->SetAmbientVolume(Saved.AmbientVolume);
πŸ“˜
Section 19

Runtime API (Blueprint)

All functions live on the Audio Core Player component.

FunctionWhat It Does
PlayStinger(Sound, Vol, Pitch)Fire a one-shot musical accent on top of the current mix. Pair with SetMusicDuck to dip the music under it.
SetMusicDuck(Scale, BlendTime)Lower the music to Scale (0–1) over BlendTime seconds, e.g. while dialogue plays.
ClearMusicDuck(BlendTime)Return the music to full over BlendTime seconds.
SetProfileOverride(Profile)Force a Sound Profile to drive music + ambience regardless of zone, until cleared.
ClearProfileOverride()Return to normal zone/default resolution.
SetMusicOverride(Sound) / ClearMusicOverride()Force one specific track over zones and combat, then release it.
RefreshAudio()Re-evaluate music + ambience now (after changing data, weather or season at runtime).
PushAudioSnapshot(Tag, Snapshot, Priority)Push a predefined mix state (underwater, low-health, dream…). Highest priority wins.
PopAudioSnapshot(Tag) / ClearAudioSnapshots()Remove a snapshot by tag, or remove them all, blending back to the interior/neutral mix.

Read-only state exposed for HUDs and tools: IsInCombat, IsCombatMusicActive, GetNearbyEnemyCount, GetZoneStackDepth, GetInteriorStackDepth, IsInsideInterior, GetActiveTrack, GetActiveProfile, GetTimeOfDay, IsDay, GetWeather, GetSeason, GetActiveSnapshotCount, IsSnapshotActive, and more.

🏷
Section 20

Native Gameplay Tags

AudioCore registers a starter vocabulary of weather, season and snapshot tags so the gates work out of the box. You are not limited to these β€” all gates and API calls accept any Gameplay Tag.

AudioCore.Weather.Clear AudioCore.Weather.Overcast AudioCore.Weather.Fog AudioCore.Weather.Rain AudioCore.Weather.Storm AudioCore.Weather.Snow AudioCore.Weather.Wind AudioCore.Season.Spring AudioCore.Season.Summer AudioCore.Season.Autumn AudioCore.Season.Winter AudioCore.Snapshot.Underwater AudioCore.Snapshot.LowHealth AudioCore.Snapshot.DreamSequence AudioCore.Snapshot.SpiritRealm AudioCore.Snapshot.Drunk
πŸ”§
Section 21

Debugging

Console CommandEffect
AudioCore.Debug 1Show the live debug panel β€” a single organized overlay drawn over the game viewport in PIE.
AudioCore.Debug 0Hide the panel.

The panel groups every AudioCore system into labelled sections: Output / Settings, Music (active track, playback position, crossfade, resume, override), Combat (state, enemy count, transition-delay hysteresis), Ambience (active profile, beds, scatter, proximity duck), Interior / Acoustics (active volume, muffle, reverb), Snapshots, Zones, World State (time of day, weather, season), and World Sources (audible vs virtualized, nearest source state). Values are colour-coded β€” green for healthy/active, amber for warnings, blue for proximity ducking, dim for inactive.

ℹ️
Log FilteringAll log output is prefixed [AudioCore] and routed through the LogDSAudioCore category. Filter the Output Log by it for clean AudioCore-only messages. The panel is editor/PIE-only β€” zero runtime cost in a shipped game.
🌐
Section 22

Multiplayer

🌐
Audio is local to each client.AudioCore plays sound on the machine its component runs on and adds no network traffic of its own.
❓
Section 23

FAQ

No music plays on Begin Play
Make sure the pawn has an Audio Core Player component and that either a Default Profile with music or a Default Day Music sound is assigned.
Zone music does not change when I walk in
The zone looks for the Audio Core Player component on the overlapping pawn. Confirm the component is on the pawn (not the controller) and the zone's trigger overlaps the Pawn channel.
Volume sliders do not change anything
Assign a Sound Mix and the Music/SFX/Ambient Sound Classes on the Settings subsystem. Without them the values are stored but not routed to Sound Classes (the player component still uses Master/Music/Ambient to scale its own audio).
Can I use MetaSounds?
Yes. Every music, bed and scatter slot accepts any sound asset β€” Sound Wave, Sound Cue, or MetaSound Source β€” interchangeably.
Do I need Sound Profiles?
No. They are optional. Zones and the player component accept inline Day/Night/Combat music for simple setups. Profiles add day/night/combat music plus dynamic ambient beds and scatter that inline music cannot provide.
Combat music keeps switching back and forth at the edge of a fight
Set a Combat Exit Delay (e.g. 4–8 seconds) in the Transitions section of the player component. This keeps combat music playing for a few seconds after the last enemy leaves range, smoothing out back-to-back fights.