--- scumm\imuse.cpp.old	2003-10-17 19:38:18.000000000 +0000
+++ scumm\imuse.cpp	2003-10-21 21:10:42.000000000 +0000
@@ -1084,9 +1084,18 @@
 
 	case IMuse::PROP_NATIVE_MT32:
 		_native_mt32 = (value > 0);
-		Instrument::nativeMT32(value > 0);
-		if (value > 0 && _midi_native)
-			initMT32(_midi_native);
+		Instrument::nativeMT32(_native_mt32);
+		if (_midi_native ) {
+			// FIXME: Why is _midi_native even set in ZAK256?
+			// The g_scumm->version check is only here to prevent SDL
+			// from crashing because of this.
+			if (g_scumm->_version > 3) {
+				if (_native_mt32)
+					initMT32(_midi_native);
+				else
+					initGM(_midi_native);
+			}
+		}
 		break;
 
 	case IMuse::PROP_MULTI_MIDI:
@@ -1204,12 +1213,59 @@
 	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);
 }
 
+void IMuseInternal::initGM(MidiDriver *midi) {
+	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);
+
+	if (g_scumm->_version < 6) {
+		// 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);
+}
+
 void IMuseInternal::init_queue() {
 	_queue_adding = false;
 	_queue_pos = 0;
@@ -1547,6 +1603,11 @@
 	if (!_on)
 		return;
 
+	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
+
 	MidiChannel *mc = _mc;
 
 	// DEBUG
@@ -1564,8 +1625,13 @@
 		mc = _player->getMidiDriver()->getPercussionChannel();
 		if (!mc)
 			return;
-		mc->volume(_vol_eff);
-//		mc->programChange(_bank);
+		static byte prev_vol_eff = 128;
+		if (_vol_eff != prev_vol_eff){
+			mc->volume(_vol_eff);
+			prev_vol_eff = _vol_eff;
+		}
+		if ((note < 35) && (!_player->_se->isNativeMT32()))
+			note = rythm_map[note];
 		mc->noteOn(note, velocity);
 	}
 }
--- scumm\imuse_internal.h.old	2003-10-21 17:50:30.000000000 +0000
+++ scumm\imuse_internal.h	2003-10-21 17:57:10.000000000 +0000
@@ -398,6 +398,7 @@
 	void handle_marker(uint id, byte data);
 	int get_channel_volume(uint a);
 	void initMidiDriver(MidiDriver *midi);
+	void initGM(MidiDriver *midi);
 	void initMT32(MidiDriver *midi);
 	void init_players();
 	void init_parts();
