MusicManager.cs
using Sandbox;
using Sandbox.Audio;

public sealed class MusicManager : Component
{
	[Property] public List<string> DrumPaths { get; set; }
	[Property] public List<string> MelodyPaths { get; set; }

	public Mixer MixerDrums { get; set; }
	public MusicPlayer MusicDrums { get; set; }
	public int DrumsNum { get; set; }
	private int _drumProgressionCounter;

	public Mixer MixerMelody { get; set; }
	public MusicPlayer MusicMelody { get; set; }
	public int MelodyNum { get; set; }

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

		MixerDrums = Mixer.FindMixerByName( "MusicDrums" );
		MixerDrums.Volume = 0.15f;

		MixerMelody = Mixer.FindMixerByName( "MusicMelody" );
		MixerMelody.Volume = 0.15f;

		Restart();
	}

	public void Restart()
	{
		//MusicDrums?.Stop();
		//MusicDrums?.Dispose();

		//MusicMelody?.Stop();
		//MusicMelody?.Dispose();

		//DrumsNum = 0;
		//_drumProgressionCounter = 0;

		//PlayDrums( 0 );
		//PlayMelody( 0 );
	}

	void OnDrumsRepeat()
	{
		//_drumProgressionCounter++;

		if ( DrumsNum < DrumPaths.Count - 1 )
			PlayDrums( DrumsNum + 1 );
	}

	void OnMelodyRepeat()
	{
		if ( MelodyNum < MelodyPaths.Count - 1 )
			PlayMelody( MelodyNum + 1 );
	}

	void PlayDrums( int num )
	{
		if ( num >= DrumPaths.Count )
			return;

		//Log.Info( $"PlayDrums: music/song1/drums{num}.wav" );

		MusicDrums?.Stop();
		MusicDrums?.Dispose();
		//MusicDrums = MusicPlayer.Play( FileSystem.Mounted, $"music/song1/drums{num}.wav" );
		MusicDrums = MusicPlayer.Play( FileSystem.Mounted, DrumPaths[num] );
		MusicDrums.Repeat = true;
		MusicDrums.ListenLocal = true;
		MusicDrums.OnRepeated = OnDrumsRepeat;
		MusicDrums.TargetMixer = MixerDrums;
		_drumProgressionCounter = 0;

		DrumsNum = num;
	}

	void PlayMelody( int num )
	{
		if ( num >= MelodyPaths.Count )
			return;

		MusicMelody?.Stop();
		MusicMelody?.Dispose();
		//MusicMelody = MusicPlayer.Play( FileSystem.Mounted, $"music/song0/melody{num}.wav" );
		MusicMelody = MusicPlayer.Play( FileSystem.Mounted, MelodyPaths[num] );
		MusicMelody.Repeat = true;
		MusicMelody.ListenLocal = true;
		MusicMelody.OnRepeated = OnMelodyRepeat;
		MusicMelody.TargetMixer = MixerMelody;

		MelodyNum = num;
	}

	public void SetPaused( bool paused )
	{
		if ( MusicDrums != null )
			MusicDrums.Paused = paused;

		if ( MusicMelody != null )
			MusicMelody.Paused = paused;
	}

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

		//if ( MusicDrums != null )
		//{
		//	Gizmo.Draw.ScreenText(
		//		$" Drums: {DrumsNum}/{DrumPaths.Count - 1}"
		//		+ $"\n {DrumPaths[DrumsNum]}"
		//		+ $"\n Duration: {MusicDrums.Duration}"
		//		+ $"\n PlaybackTime: {MusicDrums.PlaybackTime}"
		//		+ $"\n Repeat: {MusicDrums.Repeat}"
		//		+ $"\n ListenLocal: {MusicDrums.ListenLocal}",
		//		//+ $"\n _drumProgressionCounter: {_drumProgressionCounter}",
		//		new Vector2( 50, 30 ) );
		//}

		//if ( MusicMelody != null )
		//{
		//	Gizmo.Draw.ScreenText(
		//		$" Melody: {MelodyNum}/{MelodyPaths.Count - 1}"
		//		+ $"\n {MelodyPaths[MelodyNum]}"
		//		+ $"\n Duration: {MusicMelody.Duration}"
		//		+ $"\n PlaybackTime: {MusicMelody.PlaybackTime}"
		//		+ $"\n Repeat: {MusicMelody.Repeat}"
		//		+ $"\n ListenLocal: {MusicMelody.ListenLocal}",
		//		new Vector2( 50, 200 ) );
		//}
	}
}