diff --git a/src/android/i_sound.c b/src/android/i_sound.c
index 109faf57d5ab0254e01c54cd46c6720413bad82b..7440676230531115e42a11bbe76b7e56b4463546 100644
--- a/src/android/i_sound.c
+++ b/src/android/i_sound.c
@@ -87,6 +87,11 @@ boolean I_LoadSong(void *data, size_t len)
         return -1;
 }
 
+void I_SetMIDIMusicVolume(INT32 volume)
+{
+        (void)volume;
+}
+
 boolean I_PlaySong(void)
 {
         (void)handle;
diff --git a/src/djgppdos/i_sound.c b/src/djgppdos/i_sound.c
index 993e164c991efcf7060b88a164e35cb327d6b1ed..a0ad2855334a2a570fffe687c784e6e299a40dab 100644
--- a/src/djgppdos/i_sound.c
+++ b/src/djgppdos/i_sound.c
@@ -140,6 +140,15 @@ void I_SetSfxVolume(INT32 volume)
 	set_volume (Volset(volume),-1);
 }
 
+void I_SetMIDIMusicVolume(INT32 volume)
+{
+	if (nomidimusic)
+		return;
+
+	// Now set volume on output device.
+	set_volume (-1, Volset(volume));
+}
+
 //
 // Starting a sound means adding it
 //  to the current list of active sounds
@@ -494,7 +503,7 @@ void I_SetDigMusicVolume(INT32 volume)
 		return;
 
 	// Now set volume on output device.
-	set_volume (-1, Volset(volume));
+//	CONS_Printf("Digital music not yet supported under DOS.\n");
 }
 
 boolean I_SetSongSpeed(float speed)
diff --git a/src/dummy/i_sound.c b/src/dummy/i_sound.c
index ef186d5f34f632ce77a4e97c3fb847e8825166d9..a70dcef8333f4d2a7d32e1eea55eb2e92d855583 100644
--- a/src/dummy/i_sound.c
+++ b/src/dummy/i_sound.c
@@ -65,6 +65,11 @@ void I_InitMusic(void){}
 
 void I_ShutdownMusic(void){}
 
+void I_SetMIDIMusicVolume(UINT8 volume)
+{
+	(void)volume;
+}
+
 void I_PauseSong(INT32 handle)
 {
 	(void)handle;
diff --git a/src/sdl/sdl_sound.c b/src/sdl/sdl_sound.c
index fb4c301ae79cabc5e15bacc2e3fd4b84bc6e45b1..c1badfe65fe1707cc6ab8db7c6ff84625746a85c 100644
--- a/src/sdl/sdl_sound.c
+++ b/src/sdl/sdl_sound.c
@@ -1679,6 +1679,21 @@ boolean I_LoadSong(void *data, size_t len)
 	return false;
 }
 
+void I_SetMIDIMusicVolume(UINT8 volume)
+{
+#ifdef HAVE_MIXER
+	if ((nomidimusic && nodigimusic) || !musicStarted)
+		return;
+
+	if (Msc_Mutex) SDL_LockMutex(Msc_Mutex);
+	musicvol = volume * 2;
+	if (Msc_Mutex) SDL_UnlockMutex(Msc_Mutex);
+	Mix_VolumeMusic(musicvol);
+#else
+	(void)volume;
+#endif
+}
+
 #ifdef HAVE_LIBGME
 static void I_CleanupGME(void *userdata)
 {
@@ -1915,17 +1930,7 @@ static void I_StopGME(void)
 
 void I_SetDigMusicVolume(UINT8 volume)
 {
-#ifdef HAVE_MIXER
-	if ((nomidimusic && nodigimusic) || !musicStarted)
-		return;
-
-	if (Msc_Mutex) SDL_LockMutex(Msc_Mutex);
-	musicvol = volume * 2;
-	if (Msc_Mutex) SDL_UnlockMutex(Msc_Mutex);
-	Mix_VolumeMusic(musicvol);
-#else
-	(void)volume;
-#endif
+	I_SetMIDIMusicVolume(volume);
 }
 
 boolean I_SetSongSpeed(float speed)
diff --git a/src/win32/win_cd.c b/src/win32/win_cd.c
index 2278fbddafa522a0f9cf34e7feb93e1617806565..f6c430748e26e42f1654478e061c00ab8fef5877 100644
--- a/src/win32/win_cd.c
+++ b/src/win32/win_cd.c
@@ -470,6 +470,7 @@ void I_PlayCD(UINT8 nTrack, UINT8 bLooping)
 
 	//faB: stop MIDI music, MIDI music will restart if volume is upped later
 	cv_digmusicvolume.value = 0;
+	cv_midimusicvolume.value = 0;
 	I_StopSong (0);
 
 	//faB: I don't use the notify message, I'm trying to minimize the delay
diff --git a/src/win32/win_snd.c b/src/win32/win_snd.c
index 559feb2ae32b0df75f11a39434fa6f75f694a8e1..c49be100d6927790cb25e5baff871807fb7418a7 100644
--- a/src/win32/win_snd.c
+++ b/src/win32/win_snd.c
@@ -775,6 +775,14 @@ boolean I_SetSongTrack(INT32 track)
 // Fuck MIDI. ... Okay fine, you can have your silly D_-only mode.
 //
 
+void I_SetMIDIMusicVolume(UINT8 volume)
+{
+	// volume is 0 to 31.
+	midi_volume = volume;
+	if (midimode && music_stream)
+		FMR_MUSIC(FMOD_Channel_SetVolume(music_channel, volume / 31.0));
+}
+
 boolean I_PlaySong(void)
 {
 #ifdef HAVE_LIBGME