[Scummvm-cvs-logs] CVS: scummvm/simon midi.cpp,1.24,1.25 midi.h,1.11,1.12 simon.cpp,1.183,1.184

Jamieson Christian jamieson630 at users.sourceforge.net
Sun May 18 22:00:19 CEST 2003


Update of /cvsroot/scummvm/scummvm/simon
In directory sc8-pr-cvs1:/tmp/cvs-serv7919/scummvm/simon

Modified Files:
	midi.cpp midi.h simon.cpp 
Log Message:
Fixed Simon 1 music regression.
SMF parser now supports malformed Simon pitch bend events.
Implemented SMF parser jump method.


Index: midi.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/simon/midi.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -d -r1.24 -r1.25
--- midi.cpp	18 May 2003 23:55:29 -0000	1.24
+++ midi.cpp	19 May 2003 04:59:53 -0000	1.25
@@ -71,11 +71,14 @@
 void MidiPlayer::send (uint32 b) {
 	byte volume;
 
-	// Only thing we care about is volume control changes.
 	if ((b & 0xFFF0) == 0x07B0) {
+		// Adjust volume changes by master volume.
 		volume = (byte) ((b >> 16) & 0xFF) * _masterVolume / 255;
 		_volumeTable [b & 0xF] = volume;
 		b = (b & 0xFF00FFFF) | (volume << 16);
+	} else if ((b & 0xF0) == 0xE0) {
+		// Skip pitch bends completely. They're screwed up in Simon games.
+		return;
 	}
 
 	_driver->send (b);
@@ -116,6 +119,7 @@
 		}
 
 		MidiParser *parser = MidiParser::createParser_SMF();
+		parser->property (MidiParser::mpMalformedPitchBends, 1);
 		parser->setMidiDriver (this);
 		parser->setTimerRate (_driver->getBaseTempo());
 		if (!parser->loadMusic (_songs[track], _song_sizes[track])) {
@@ -206,7 +210,14 @@
 	}
 }
 
-void MidiPlayer::playSMF (File *in) {
+static int simon1_gmf_size[] = {
+	8900, 12166, 2848, 3442, 4034, 4508, 7064, 9730, 6014, 4742, 3138,
+	6570, 5384, 8909, 6457, 16321, 2742, 8968, 4804, 8442, 7717,
+	9444, 5800, 1381, 5660, 6684, 2456, 4744, 2455, 1177, 1232,
+	17256, 5103, 8794, 4884, 16
+};
+
+void MidiPlayer::playSMF (File *in, int song) {
 	_system->lock_mutex (_mutex);
 	clearConstructs();
 	uint32 size = in->size() - in->pos();
@@ -215,7 +226,15 @@
 	_data = (byte *) calloc (size, 1);
 	in->read (_data, size);
 
+	// For GMF files, we're going to have to use
+	// hardcoded size tables.
+	if (!memcmp (_data, "GMF\x1", 4) && size == 64000) {
+		size = simon1_gmf_size [song];
+		_data[size++] = 0x00; // Trailing 0 makes this match the standalone GMF files
+	}
+
 	MidiParser *parser = MidiParser::createParser_SMF();
+	parser->property (MidiParser::mpMalformedPitchBends, 1);
 	parser->setMidiDriver (this);
 	parser->setTimerRate (_driver->getBaseTempo());
 	if (!parser->loadMusic (_data, size)) {

Index: midi.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/simon/midi.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- midi.h	19 May 2003 00:24:11 -0000	1.11
+++ midi.h	19 May 2003 04:59:53 -0000	1.12
@@ -54,7 +54,7 @@
 	MidiPlayer (OSystem *system);
 	virtual ~MidiPlayer();
 
-	void playSMF (File *in);
+	void playSMF (File *in, int song);
 	void playMultipleSMF (File *in);
 	void playXMIDI (File *in);
 	void jump (uint16 track, uint16 tick);

Index: simon.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/simon/simon.cpp,v
retrieving revision 1.183
retrieving revision 1.184
diff -u -d -r1.183 -r1.184
--- simon.cpp	19 May 2003 03:29:39 -0000	1.183
+++ simon.cpp	19 May 2003 04:59:53 -0000	1.184
@@ -862,10 +862,7 @@
 
 	// midi.shutdown();
 	_mus_file->seek(_mus_offsets[a], SEEK_SET);
-	// midi.read_all_songs_old(_mus_file, a, _mus_offsets[a+1] - _mus_offsets[a]);
-	// midi.initialize();
-	// midi.play();
-	midi.playSMF (_mus_file);
+	midi.playSMF (_mus_file, a);
 }
 
 Subroutine *SimonState::getSubroutineByID(uint subroutine_id) {
@@ -5072,7 +5069,7 @@
 				midi.playMultipleSMF (_game_file);
 			} else if (_game & GF_TALKIE) {	
 				_game_file->seek(_game_offsets_ptr[gss->MUSIC_INDEX_BASE + music], SEEK_SET);
-				midi.playSMF (_game_file);
+				midi.playSMF (_game_file, music);
 			} else {
 				char buf[50];
 				File *f = new File();
@@ -5082,7 +5079,7 @@
 					warning("Can't load music from '%s'", buf);
 					return;
 				}
-				midi.playSMF (f);
+				midi.playSMF (f, music);
 				delete f;
 			}
 		}





More information about the Scummvm-git-logs mailing list