Park/MusicManager.cs
using Sandbox.Audio;

/// <summary>
/// A component that handles background music playback with volume fade-in.
/// </summary>
public sealed class MusicManager : Component
{
	[Property] public SoundFile SongFile { get; set; }
	[Property] public float MaxVolume { get; set; }
	[Property] public float VolumeFadeInTime { get; set; }

	public MusicPlayer MusicPlayer { get; private set; }

	private Mixer _musicMixer;
	private TimeSince _timeSinceStart;

	protected override void OnStart()
	{
		base.OnStart();

		MusicPlayer = MusicPlayer.Play( FileSystem.Mounted, SongFile.ResourcePath.Replace( "vsnd", "mp3" ) );
		MusicPlayer.Repeat = true;
		MusicPlayer.ListenLocal = true;

		_musicMixer = Mixer.FindMixerByName( "Music" );
		_musicMixer.Volume = 0f;
		MusicPlayer.TargetMixer = _musicMixer;

		_timeSinceStart = 0f;
	}

	protected override void OnUpdate()
	{
		base.OnUpdate();

		if ( _timeSinceStart < VolumeFadeInTime )
			_musicMixer.Volume = MathX.Remap( _timeSinceStart, 0f, VolumeFadeInTime, 0f, MaxVolume );
	}
}