diff --git a/src/d_netcmd.c b/src/d_netcmd.c
index bdbb3747e04066e5939ae4459705b3526e2cd226..6776208ac0f78f65f900d7bf6ff777b538a80191 100644
--- a/src/d_netcmd.c
+++ b/src/d_netcmd.c
@@ -866,6 +866,7 @@ void D_RegisterClientCommands(void)
 	// s_sound.c
 	CV_RegisterVar(&cv_soundvolume);
 	CV_RegisterVar(&cv_digmusicvolume);
+	CV_RegisterVar(&cv_midimusicvolume);
 	CV_RegisterVar(&cv_closedcaptioning);
 	CV_RegisterVar(&cv_numChannels);
 
diff --git a/src/m_menu.c b/src/m_menu.c
index cd4bdb2fd81946b383da644c6eed232b923f7048..cc654e2c77f446194fd2aef5058f6ed2ffc6d748 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -1498,7 +1498,7 @@ static menuitem_t OP_SoundOptionsMenu[] =
 	{IT_STRING | IT_CVAR, NULL, "Default 1-Up sound", &cv_1upsound, 112},
 	{IT_STRING | IT_CVAR, NULL, "Reset Music Upon Dying", &cv_resetmusic, 122},
 
-	{IT_STRING | IT_SUBMENU, NULL, "Advanced Settings...", &OP_SoundAdvancedDef, 142},
+	{IT_STRING | IT_SUBMENU, NULL, "Advanced/MIDI Settings...", &OP_SoundAdvancedDef, 142},
 };
 
 #ifdef HAVE_OPENMPT
@@ -1508,7 +1508,7 @@ static menuitem_t OP_SoundOptionsMenu[] =
 #endif
 
 #ifdef HAVE_MIXERX
-#define MIXERX_MENUOFFSET 80
+#define MIXERX_MENUOFFSET 90
 #else
 #define MIXERX_MENUOFFSET 0
 #endif
@@ -1522,9 +1522,10 @@ static menuitem_t OP_SoundAdvancedMenu[] =
 
 #ifdef HAVE_MIXERX
 	{IT_HEADER, NULL, "MIDI Settings", NULL, OPENMPT_MENUOFFSET},
-	{IT_STRING | IT_CVAR, NULL, "MIDI Player", &cv_midiplayer, OPENMPT_MENUOFFSET+12},
-	{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "FluidSynth Sound Font File", &cv_midisoundfontpath, OPENMPT_MENUOFFSET+22},
-	{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "TiMidity++ Config Folder", &cv_miditimiditypath, OPENMPT_MENUOFFSET+49},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "MIDI Volume", &cv_midimusicvolume, OPENMPT_MENUOFFSET+12},
+	{IT_STRING | IT_CVAR, NULL, "MIDI Player", &cv_midiplayer, OPENMPT_MENUOFFSET+22},
+	{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "FluidSynth Sound Font File", &cv_midisoundfontpath, OPENMPT_MENUOFFSET+32},
+	{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "TiMidity++ Config Folder", &cv_miditimiditypath, OPENMPT_MENUOFFSET+59},
 #endif
 
 	{IT_HEADER, NULL, "Focus settings", NULL, OPENMPT_MENUOFFSET+MIXERX_MENUOFFSET},
diff --git a/src/s_sound.c b/src/s_sound.c
index a6814327c3f0cfda99f192552e0b4ec9c14aaa4f..d0089022a7094c78c7cc2134bb09ca9693d912ad 100644
--- a/src/s_sound.c
+++ b/src/s_sound.c
@@ -75,6 +75,7 @@ static consvar_t precachesound = CVAR_INIT ("precachesound", "Off", CV_SAVE, CV_
 // actual general (maximum) sound & music volume, saved into the config
 consvar_t cv_soundvolume = CVAR_INIT ("soundvolume", "16", CV_SAVE, soundvolume_cons_t, NULL);
 consvar_t cv_digmusicvolume = CVAR_INIT ("digmusicvolume", "16", CV_SAVE, soundvolume_cons_t, NULL);
+consvar_t cv_midimusicvolume = CVAR_INIT ("midimusicvolume", "16", CV_SAVE, soundvolume_cons_t, NULL);
 
 static void Captioning_OnChange(void)
 {
@@ -831,6 +832,8 @@ void S_UpdateSounds(void)
 
 	mobj_t *listenmobj = players[displayplayer].mo;
 	mobj_t *listenmobj2 = NULL;
+	
+	boolean currentmidi = (I_SongType() == MU_MID || I_SongType() == MU_MID_EX);
 
 	memset(&listener, 0, sizeof(listener_t));
 	memset(&listener2, 0, sizeof(listener_t));
@@ -838,8 +841,8 @@ void S_UpdateSounds(void)
 	// Update sound/music volumes, if changed manually at console
 	if (actualsfxvolume != cv_soundvolume.value)
 		S_SetSfxVolume(cv_soundvolume.value);
-	if (actualmusicvolume != cv_digmusicvolume.value)
-		S_SetMusicVolume(cv_digmusicvolume.value);
+	if (actualmusicvolume != currentmidi ? cv_midimusicvolume.value : cv_digmusicvolume.value)
+		S_SetMusicVolume(-1);
 
 	// We're done now, if we're not in a level.
 	if (gamestate != GS_LEVEL)
@@ -2346,13 +2349,19 @@ void S_ResumeAudio(void)
 
 void S_SetMusicVolume(INT32 volume)
 {
+	boolean currentmidi = (I_SongType() == MU_MID || I_SongType() == MU_MID_EX);
+
 	if (volume < 0)
 		volume = cv_digmusicvolume.value;
 
+	if (currentmidi)
+		volume = cv_midimusicvolume.value;
+
 	if (volume < 0 || volume > 31)
-		CONS_Alert(CONS_WARNING, "digmusicvolume should be between 0-31\n");
-	CV_SetValue(&cv_digmusicvolume, volume&31);
-	actualmusicvolume = cv_digmusicvolume.value;   //check for change of var
+		CONS_Alert(CONS_WARNING, "Music volume should be between 0-31\n");
+
+	CV_SetValue(currentmidi ? &cv_midimusicvolume : &cv_digmusicvolume, volume&31);
+	actualmusicvolume = currentmidi ? cv_midimusicvolume.value : cv_digmusicvolume.value; //check for change of var
 
 	I_SetMusicVolume(volume&31);
 }
@@ -2491,7 +2500,7 @@ static void Command_RestartAudio_f(void)
 // These must be called or no sound and music until manually set.
 
 	I_SetSfxVolume(cv_soundvolume.value);
-	S_SetMusicVolume(cv_digmusicvolume.value);
+	S_SetMusicVolume(-1);
 	if (Playing()) // Gotta make sure the player is in a level
 		P_RestoreMusic(&players[consoleplayer]);
 }
diff --git a/src/s_sound.h b/src/s_sound.h
index 276a4b5ce4025ed805307ae7d3f60e99a1260255..fd9fbc0dba48189e9a01eaabc5cacb5b6fa720af 100644
--- a/src/s_sound.h
+++ b/src/s_sound.h
@@ -29,7 +29,7 @@ extern openmpt_module *openmpt_mhandle;
 #define PICKUP_SOUND 0x8000
 
 extern consvar_t stereoreverse;
-extern consvar_t cv_soundvolume, cv_closedcaptioning, cv_digmusicvolume;
+extern consvar_t cv_soundvolume, cv_closedcaptioning, cv_digmusicvolume, cv_midimusicvolume;
 extern consvar_t cv_numChannels;
 
 extern consvar_t cv_resetmusic;