aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--saga/music.cpp183
-rw-r--r--saga/music.h3
2 files changed, 169 insertions, 17 deletions
diff --git a/saga/music.cpp b/saga/music.cpp
index eb0b35d99a..3a04b0358a 100644
--- a/saga/music.cpp
+++ b/saga/music.cpp
@@ -31,6 +31,7 @@
#include "sound/mididrv.h"
#include "sound/midiparser.h"
#include "common/config-manager.h"
+#include "common/file.h"
namespace Saga {
@@ -105,7 +106,7 @@ void MusicPlayer::send(uint32 b) {
_channelVolume[channel] = volume;
volume = volume * _masterVolume / 255;
b = (b & 0xFF00FFFF) | (volume << 16);
- } else if ((b & 0xF0) == 0xC0 && !_nativeMT32) {
+ } else if ((b & 0xF0) == 0xC0 && !_isGM && !_nativeMT32) {
b = (b & 0xFFFF00FF) | mt32_to_gm[(b >> 8) & 0xFF] << 8;
}
else if ((b & 0xFFF0) == 0x007BB0) {
@@ -159,30 +160,178 @@ Music::~Music() {
}
int Music::play(ulong music_rn, uint flags) {
- R_RSCFILE_CONTEXT *rsc_ctxt = NULL;
+ R_RSCFILE_CONTEXT *rsc_ctxt = NULL;
+ const char *midi_file = NULL;
- uchar *resource_data;
- size_t resource_size;
+ uchar *resource_data;
+ size_t resource_size;
if (!_musicInitialized) {
return R_FAILURE;
}
- if (!_enabled) {
- return R_SUCCESS;
- }
+ if (!_enabled) {
+ return R_SUCCESS;
+ }
+
+ // The Wyrmkeep release of Inherit The Earth uses external MIDI files
+
+ // FIXME: This mapping is incomplete
+
+ switch (music_rn) {
+#if 0
+ case XXX:
+ midi_file = "bcexpl";
+ break;
+ case XXX:
+ midi_file = "birdchrp";
+ break;
+ case XXX:
+ midi_file = "boargtnt";
+ break;
+ case XXX:
+ midi_file = "boarking";
+ break;
+ case XXX:
+ midi_file = "brutalmt";
+ break;
+ case XXX:
+ midi_file = "catfest";
+ break;
+#endif
+ case 9:
+ midi_file = "cave";
+ break;
+#if 0
+ case XXX:
+ midi_file = "damexplm";
+ break;
+ case XXX:
+ midi_file = "darkclaw";
+ break;
+ case XXX:
+ midi_file = "elkfanfare";
+ break;
+ case XXX:
+ midi_file = "elkhall";
+ break;
+ case XXX:
+ midi_file = "explorea";
+ break;
+ case XXX:
+ midi_file = "exploreb";
+ // Unfortunately, our MIDI parser won't handle the above file
+ midi_file = NULL;
+ break;
+ case XXX:
+ midi_file = "explorec";
+ // Unfortunately, our MIDI parser won't handle the above file
+ midi_file = NULL;
+ break;
+ case XXX:
+ midi_file = "fvillage";
+ break;
+ case XXX:
+ midi_file = "humruinm";
+ // Unfortunately, our MIDI parser won't handle the above file
+ midi_file = NULL;
+ break;
+#endif
+ case 10:
+ midi_file = "intro";
+ // Unfortunately, our MIDI parser won't handle the above file
+ midi_file = NULL;
+ break;
+#if 0
+ case XXX:
+ midi_file = "kitten";
+ break;
+ case XXX:
+ midi_file = "mouse";
+ break;
+ case XXX:
+ midi_file = "nitstrlm";
+ // Unfortunately, our MIDI parser won't handle the above file
+ midi_file = NULL;
+ break;
+ case XXX:
+ midi_file = "orbtempl";
+ // Unfortunately, our MIDI parser won't handle the above file
+ midi_file = NULL;
+ break;
+ case XXX:
+ midi_file = "reset";
+ // Unfortunately, our MIDI parser won't handle the above file,
+ // but I'm not sure we need it anyway
+ midi_file = NULL;
+ break;
+ case XXX:
+ midi_file = "shiala";
+ break;
+ case XXX:
+ midi_file = "spooky";
+ // Unfortunately, our MIDI parser won't handle the above file
+ midi_file = NULL;
+ break;
+ case XXX:
+ midi_file = "sunstatm";
+ // Unfortunately, our MIDI parser won't handle the above file
+ midi_file = NULL;
+ break;
+ case XXX:
+ midi_file = "sweet";
+ // Unfortunately, our MIDI parser won't handle the above file
+ midi_file = NULL;
+ break;
+ case XXX:
+ midi_file = "tychom";
+ // Unlike the other unhandled files, ScummVM won't crash on
+ // this one. But it won't play anything either.
+ midi_file = NULL;
+ break;
+#endif
+ default:
+ midi_file = NULL;
+ break;
+ }
+
+ File f_midi;
+ MidiParser *parser;
- /* Load XMI resource data */
- GAME_GetFileContext(&rsc_ctxt, R_GAME_RESOURCEFILE, 0);
+ if (midi_file) {
+ char file_name[20];
+
+ sprintf(file_name, "music/%s.mid", midi_file);
+ if (!f_midi.open(file_name))
+ midi_file = NULL;
+ }
+
+ // FIXME: Is resource_data ever freed?
+
+ if (midi_file) {
+ debug(0, "Using external MIDI file: %s.mid", midi_file);
+ resource_size = f_midi.size();
+ resource_data = (uchar *) malloc(resource_size);
+ f_midi.read(resource_data, resource_size);
+ f_midi.close();
+
+ _player->setGM(true);
+ parser = MidiParser::createParser_SMF();
+ } else {
+ /* Load XMI resource data */
+ GAME_GetFileContext(&rsc_ctxt, R_GAME_RESOURCEFILE, 0);
- if (RSC_LoadResource(rsc_ctxt, music_rn, &resource_data,
- &resource_size) != R_SUCCESS ) {
- R_printf(R_STDERR, "SYSMUSIC_Play(): Resource load failed: %ld",
- music_rn);
- return R_FAILURE;
- }
-
- MidiParser *parser = MidiParser::createParser_XMIDI();
+ if (RSC_LoadResource(rsc_ctxt, music_rn, &resource_data,
+ &resource_size) != R_SUCCESS ) {
+ R_printf(R_STDERR, "SYSMUSIC_Play(): Resource load failed: %ld",
+ music_rn);
+ return R_FAILURE;
+ }
+
+ _player->setGM(false);
+ parser = MidiParser::createParser_XMIDI();
+ }
+
if (!parser->loadMusic(resource_data, resource_size)) {
warning("Error reading track!");
delete parser;
diff --git a/saga/music.h b/saga/music.h
index 7fafc10a34..3b2065a858 100644
--- a/saga/music.h
+++ b/saga/music.h
@@ -54,6 +54,8 @@ public:
void playMusic();
void stopMusic();
void setLoop(bool loop) { _looping = loop; }
+
+ void setGM(bool isGM) { _isGM = isGM; }
//MidiDriver interface implementation
int open();
@@ -79,6 +81,7 @@ protected:
MidiDriver *_driver;
byte _channelVolume[16];
bool _nativeMT32;
+ bool _isGM;
bool _isPlaying;
bool _looping;