From 7d53480025b1c314327a523ddb261fb20fe96157 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Tue, 1 Aug 2006 13:42:33 +0000 Subject: Kyra 2 has two types of XMIDI files: XMI and C55. It seems C55 are for the General MIDI instrument set, so use them unless we're in MT-32 mode. This makes the music sound a bit closer (at least to me) to what DOSbox plays. svn-id: r23653 --- engines/kyra/kyra.cpp | 5 ++++- engines/kyra/sound.cpp | 8 ++++---- engines/kyra/sound.h | 2 ++ 3 files changed, 10 insertions(+), 5 deletions(-) (limited to 'engines') diff --git a/engines/kyra/kyra.cpp b/engines/kyra/kyra.cpp index b650aa61c5..bee1368be6 100644 --- a/engines/kyra/kyra.cpp +++ b/engines/kyra/kyra.cpp @@ -160,10 +160,13 @@ int KyraEngine::init() { _sound = soundMidiPc; assert(_sound); soundMidiPc->hasNativeMT32(native_mt32); + + // C55 appears to be XMIDI for General MIDI instruments + soundMidiPc->setUseC55(_game == GI_KYRA2 && !native_mt32); // Unlike some SCUMM games, it's not that the MIDI sounds are // missing. It's just that at least at the time of writing they - // decidedly inferior to the Adlib ones. + // are decidedly inferior to the Adlib ones. if (midiDriver != MD_ADLIB && ConfMan.getBool("multi_midi")) { SoundAdlibPC *adlib = new SoundAdlibPC(_mixer, this); diff --git a/engines/kyra/sound.cpp b/engines/kyra/sound.cpp index a97f85c579..988a3f8d81 100644 --- a/engines/kyra/sound.cpp +++ b/engines/kyra/sound.cpp @@ -99,7 +99,7 @@ SoundMidiPC::SoundMidiPC(MidiDriver *driver, Audio::Mixer *mixer, KyraEngine *en _eventFromMusic = false; _fadeMusicOut = _sfxIsPlaying = false; _fadeStartTime = 0; - _isPlaying = _nativeMT32 = false; + _isPlaying = _nativeMT32 = _useC55 = false; _soundEffect = _parser = 0; _soundEffectSource = _parserSource = 0; @@ -193,7 +193,7 @@ void SoundMidiPC::send(uint32 b) { _channelVolume[channel] = volume; volume = volume * _volume / 255; b = (b & 0xFF00FFFF) | (volume << 16); - } else if ((b & 0xF0) == 0xC0 && !_nativeMT32) { + } else if ((b & 0xF0) == 0xC0 && !_nativeMT32 && !_useC55) { b = (b & 0xFFFF00FF) | MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8; } else if ((b & 0xFFF0) == 0x007BB0) { //Only respond to All Notes Off if this channel @@ -231,7 +231,7 @@ void SoundMidiPC::metaEvent(byte type, byte *data, uint16 length) { void SoundMidiPC::loadMusicFile(const char *file) { char filename[25]; - sprintf(filename, "%s.XMI", file); + sprintf(filename, "%s.%s", file, _useC55 ? "C55" : "XMI"); uint32 size; uint8 *data = (_engine->resource())->fileData(filename, &size); @@ -269,7 +269,7 @@ void SoundMidiPC::playMusic(uint8 *data, uint32 size) { void SoundMidiPC::loadSoundEffectFile(const char *file) { char filename[25]; - sprintf(filename, "%s.XMI", file); + sprintf(filename, "%s.%s", file, _useC55 ? "C55" : "XMI"); uint32 size; uint8 *data = (_engine->resource())->fileData(filename, &size); diff --git a/engines/kyra/sound.h b/engines/kyra/sound.h index 0d932ae772..a812f76667 100644 --- a/engines/kyra/sound.h +++ b/engines/kyra/sound.h @@ -173,6 +173,7 @@ public: MidiChannel *getPercussionChannel() { return 0; } void setPassThrough(bool b) { _passThrough = b; } + void setUseC55(bool b) { _useC55 = b; } void hasNativeMT32(bool nativeMT32) { _nativeMT32 = nativeMT32; } bool isMT32() { return _nativeMT32; } @@ -192,6 +193,7 @@ private: uint8 _channelVolume[16]; MidiDriver *_driver; bool _nativeMT32; + bool _useC55; bool _passThrough; uint8 _volume; bool _isPlaying; -- cgit v1.2.3