--- scumm\imuse.cpp.old	2003-10-07 14:00:54.000000000 +0000
+++ scumm\imuse.cpp	2003-10-14 16:06:38.000000000 +0000
@@ -1173,6 +1173,54 @@
 	if (result)
 		error("IMuse initialization - %s", MidiDriver::getErrorName(result));
 
+//TODO: this if does not what it suggest. This even break other games!
+      if ((_midi_native) && (!_native_mt32)) {
+		// Special setup for General Synthesizer
+		byte buffer[11];
+		
+		// General MIDI reset.
+		// This also ensures compatibility on GS devices. We do this even
+		// before GS reset in case there is just a plain GM device.
+		midi->sysEx((byte*)"\x7E\x7F\x09\x01", 4);
+		g_system->delay_msecs (200);
+
+//TODO: use this block only for SCUMM version < 6! (write a proper if state!)
+		{
+			// There are different GS SysEx manufacturer id's.
+			// That's why the GS data has to be sent twice with different id's.
+
+			// Roland GS SysEx
+			memcpy(&buffer[0], "\x41\x10\x42\x12\x40", 5);
+		
+			// GS Reset
+			memcpy(&buffer[5], "\x00\x7F\x00\x41", 4);
+			midi->sysEx(buffer, 8);
+			g_system->delay_msecs (200);
+
+			// Setup reverb as used with MT-32
+			memcpy(&buffer[5], "\x01\x30\x00\x0f", 4);
+			midi->sysEx(buffer, 8);
+
+			// Dream/Terratec GS SysEx
+			memcpy(&buffer[0], "\x00\x20\x00\x00\x00\x12\x40", 7);
+		
+			// GS Reset
+			memcpy(&buffer[7], "\x00\x7F\x00\x41", 4);
+			midi->sysEx(buffer, 11);
+			g_system->delay_msecs (200);
+
+			// Setup reverb as used with MT-32
+			memcpy(&buffer[7], "\x01\x30\x00\x0f", 4);
+			midi->sysEx(buffer, 11);
+
+			// Enable percussion reverb (GM compilant)
+			midi->getPercussionChannel()->controlChange(91, 64);
+		}
+
+		// Set GM master volume
+		midi->sysEx((byte*)"\x7F\x7F\x04\x01\x00\x7F", 6);
+	}
+
 	// Connect to the driver's timer
 	midi->setTimerCallback(midi, &IMuseInternal::midiTimerCallback);
 }
@@ -1210,7 +1258,7 @@
 	midi->sysEx(buffer, 31);
 	g_system->delay_msecs (250);
 
-	// Setup rythm part
+	// Assign some reverb free copies to notes 24-34 on the rythm part
 	memcpy(&buffer[4], "\x03\x01\x10\x40\x64\x07\x00\x4a\x64\x06\x00\x41\x64\x07\x00\x4b\x64\x08\x00\x45\x64\x06\x00\x44\x64\x0b\x00\x51\x64\x05\x00\x43\x64\x08\x00\x50\x64\x07\x00\x42\x64\x03\x00\x4c\x64\x07\x00\x44", 48);
 	midi->sysEx(buffer, 52);
 	g_system->delay_msecs (250);
@@ -1537,6 +1585,11 @@
 }
 
 void Part::noteOn(byte note, byte velocity) {
+	static const byte rythm_map[35] = {
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+	  0,  0,  0,  0,  0,  0,  0,  0, 36, 37, 38, 39, 40, 41, 66, 47,
+	 65, 48, 56}; // This emulates the setup LEC used with the MT-32
+
 	if (!_on)
 		return;
 
@@ -1557,8 +1610,14 @@
 		mc = _player->getMidiDriver()->getPercussionChannel();
 		if (!mc)
 			return;
-		mc->volume(_vol_eff);
-//		mc->programChange(_bank);
+		static byte prev_vol_eff = -1;
+		if (_vol_eff != prev_vol_eff){
+			mc->volume(_vol_eff);
+			prev_vol_eff = _vol_eff;
+		}
+//		mc->programChange(_bank); // This line really should be removed! Setting a bank on a rythm part insn't even GM/GS compilant!
+		if ((note < 35) && (!_player->_se->isNativeMT32()))
+			note = rythm_map[note];
 		mc->noteOn(note, velocity);
 	}
 }
