[Scummvm-cvs-logs] SF.net SVN: scummvm:[44185] scummvm/trunk/engines/scumm/imuse

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Fri Sep 18 17:54:13 CEST 2009


Revision: 44185
          http://scummvm.svn.sourceforge.net/scummvm/?rev=44185&view=rev
Author:   lordhoto
Date:     2009-09-18 15:54:12 +0000 (Fri, 18 Sep 2009)

Log Message:
-----------
Implement proper reverb setting in native MT-32 mode (as desribed in bug report #1088045 "MI2: Minor problems in native MT-32 mode").

Modified Paths:
--------------
    scummvm/trunk/engines/scumm/imuse/imuse_internal.h
    scummvm/trunk/engines/scumm/imuse/imuse_part.cpp

Modified: scummvm/trunk/engines/scumm/imuse/imuse_internal.h
===================================================================
--- scummvm/trunk/engines/scumm/imuse/imuse_internal.h	2009-09-18 15:12:27 UTC (rev 44184)
+++ scummvm/trunk/engines/scumm/imuse/imuse_internal.h	2009-09-18 15:54:12 UTC (rev 44185)
@@ -370,6 +370,7 @@
 
 private:
 	void setPanPosition(uint8 value);
+	void setEffectLevel(uint8 value);
 };
 
 

Modified: scummvm/trunk/engines/scumm/imuse/imuse_part.cpp
===================================================================
--- scummvm/trunk/engines/scumm/imuse/imuse_part.cpp	2009-09-18 15:12:27 UTC (rev 44184)
+++ scummvm/trunk/engines/scumm/imuse/imuse_part.cpp	2009-09-18 15:54:12 UTC (rev 44185)
@@ -165,8 +165,7 @@
 
 void Part::effectLevel(byte value) {
 	_effect_level = value;
-	if (_mc)
-		_mc->effectLevel(value);
+	setEffectLevel(value);
 }
 
 void Part::fix_after_load() {
@@ -286,7 +285,7 @@
 	_detune_eff = player->getDetune();
 	_pitchbend_factor = 2;
 	_pitchbend = 0;
-	_effect_level = 64;
+	_effect_level = player->_se->isNativeMT32() ? 127 : 64;
 	_instrument.clear();
 	_unassigned_instrument = true;
 	_chorus = 0;
@@ -323,15 +322,21 @@
 void Part::sendAll() {
 	if (!clearToTransmit())
 		return;
+
 	_mc->pitchBendFactor(_pitchbend_factor);
 	sendPitchBend();
 	_mc->volume(_vol_eff);
 	_mc->sustain(_pedal);
 	_mc->modulationWheel(_modwheel);
 	setPanPosition(_pan_eff + 0x40);
-	_mc->effectLevel(_effect_level);
+
 	if (_instrument.isValid())
 		_instrument.send(_mc);
+
+	// We need to send the effect level after setting up the instrument
+	// otherwise the reverb setting for MT-32 will be overwritten.
+	setEffectLevel(_effect_level);
+
 	_mc->chorusLevel(_chorus);
 	_mc->priority(_pri_eff);
 }
@@ -380,4 +385,32 @@
 	_mc->panPosition(value);
 }
 
+void Part::setEffectLevel(uint8 value) {
+	if (!_mc)
+		return;
+
+	// As described in bug report #1088045 "MI2: Minor problems in native MT-32 mode"
+	// for the MT-32 one has to use a sysEx event to change the effect level (rather
+	// the reverb setting).
+	if (_player->_se->isNativeMT32()) {
+		if (value != 127 && value != 0) {
+			warning("Trying to use unsupported effect level value %d in native MT-32 mode. Please report this!", value);
+
+			if (value > 64)
+				value = 127;
+			else
+				value = 0;
+		}
+
+		byte message[9];
+		memcpy(message, "\x41\x00\x16\x12\x00\x00\x06\x00\x00", 9);
+		message[1] = _mc->getNumber();
+		message[7] = (value == 127) ? 1 : 0;
+		message[8] = 128 - (6 + message[7]);
+		_player->getMidiDriver()->sysEx(message, 9);
+	} else {
+		_mc->effectLevel(value);
+	}
+}
+
 } // End of namespace Scumm


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list