[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