diff --git a/src/m_menu.c b/src/m_menu.c
index 2c82bf84f82a31c7bb6c90aefef4835399e67483..6a6875aad5e71b9504070e4a33e4d3819c52abc3 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -6992,7 +6992,24 @@ static void M_ToggleDigital(void)
 	{
 		digital_disabled = true;
 		if (S_MusicType() != MU_MID)
-			S_StopMusic();
+		{
+			if (midi_disabled)
+				S_StopMusic();
+			else
+			{
+				char mmusic[7];
+				UINT16 mflags;
+				boolean looping;
+
+				if (S_MusicInfo(mmusic, &mflags, &looping) && S_MIDIExists(mmusic))
+				{
+					S_StopMusic();
+					S_ChangeMusic(mmusic, mflags, looping);
+				}
+				else
+					S_StopMusic();
+			}
+		}
 		M_StartMessage(M_GetText("Digital Music Disabled\n"), NULL, MM_NOTHING);
 	}
 }
@@ -7014,7 +7031,24 @@ static void M_ToggleMIDI(void)
 	{
 		midi_disabled = true;
 		if (S_MusicType() == MU_MID)
-			S_StopMusic();
+		{
+			if (digital_disabled)
+				S_StopMusic();
+			else
+			{
+				char mmusic[7];
+				UINT16 mflags;
+				boolean looping;
+
+				if (S_MusicInfo(mmusic, &mflags, &looping) && S_DigExists(mmusic))
+				{
+					S_StopMusic();
+					S_ChangeMusic(mmusic, mflags, looping);
+				}
+				else
+					S_StopMusic();
+			}
+		}
 		M_StartMessage(M_GetText("MIDI Music Disabled\n"), NULL, MM_NOTHING);
 	}
 }
diff --git a/src/s_sound.c b/src/s_sound.c
index 54ffffc4c20fcd340c8296e383d4f9ed40faa26f..32d9c7b06b789f2bef737f4d2c4f4a1c248a206a 100644
--- a/src/s_sound.c
+++ b/src/s_sound.c
@@ -1215,6 +1215,8 @@ const char *compat_special_music_slots[16] =
 #endif
 
 static char      music_name[7]; // up to 6-character name
+static UINT16    music_flags;
+static boolean   music_looping;
 
 /// ------------------------
 /// Music Status
@@ -1250,9 +1252,17 @@ musictype_t S_MusicType(void)
 	return I_GetMusicType();
 }
 
-const char *S_MusicName(void)
+boolean S_MusicInfo(char *mname, UINT16 *mflags, boolean *looping)
 {
-	return music_name;
+	if (!I_MusicPlaying())
+		return false;
+
+	strncpy(mname, music_name, 7);
+	mname[6] = 0;
+	*mflags = music_flags;
+	*looping = music_looping;
+
+	return (boolean)mname[0];
 }
 
 boolean S_MusicExists(const char *mname, boolean checkMIDI, boolean checkDigi)
@@ -1333,6 +1343,8 @@ static void S_UnloadMusic(void)
 {
 	I_UnloadSong();
 	music_name[0] = 0;
+	music_flags = 0;
+	music_looping = false;
 }
 
 static boolean S_PlayMusic(boolean looping)
@@ -1373,6 +1385,9 @@ void S_ChangeMusic(const char *mmusic, UINT16 mflags, boolean looping)
 		if (!S_LoadMusic(mmusic))
 			return;
 
+		music_flags = mflags;
+		music_looping = looping;
+
 		if (!S_PlayMusic(looping))
 		{
 			CONS_Alert(CONS_ERROR, "Music cannot be played!\n");
diff --git a/src/s_sound.h b/src/s_sound.h
index a0ac6c1589508e343d7b5161eb0cf36d086fd668..a2d51a59bdb58a6dbe8996e3d27aeaf402586deb 100644
--- a/src/s_sound.h
+++ b/src/s_sound.h
@@ -108,7 +108,7 @@ boolean S_MusicDisabled(void);
 boolean S_MusicPlaying(void);
 boolean S_MusicPaused(void);
 musictype_t S_MusicType(void);
-const char *S_MusicName(void);
+boolean S_MusicInfo(char *mname, UINT16 *mflags, boolean *looping);
 boolean S_MusicExists(const char *mname, boolean checkMIDI, boolean checkDigi);
 #define S_DigExists(a) S_MusicExists(a, false, true)
 #define S_MIDIExists(a) S_MusicExists(a, true, false)