[Scummvm-cvs-logs] scummvm master -> 06addfc4041b3e20fd89dee46227e04f1c66fe52

Kirben kirben at optusnet.com.au
Tue May 26 05:24:44 CEST 2015


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
06addfc404 AGOS: Add updated patch for #647 - Simon 1 DOS Adlib instrument bank


Commit: 06addfc4041b3e20fd89dee46227e04f1c66fe52
    https://github.com/scummvm/scummvm/commit/06addfc4041b3e20fd89dee46227e04f1c66fe52
Author: Kirben (kirben at optusnet.com.au)
Date: 2015-05-26T13:23:20+10:00

Commit Message:
AGOS: Add updated patch for #647 - Simon 1 DOS Adlib instrument bank

Changed paths:
    engines/agos/midi.cpp
    engines/agos/midi.h



diff --git a/engines/agos/midi.cpp b/engines/agos/midi.cpp
index 045fd9d..e5875a8 100644
--- a/engines/agos/midi.cpp
+++ b/engines/agos/midi.cpp
@@ -42,6 +42,8 @@ MidiPlayer::MidiPlayer() {
 	_driver = 0;
 	_map_mt32_to_gm = false;
 
+	_adlibPatches = NULL;
+
 	_enable_sfx = true;
 	_current = 0;
 
@@ -68,6 +70,7 @@ MidiPlayer::~MidiPlayer() {
 	}
 	_driver = NULL;
 	clearConstructs();
+	unloadAdlibPatches();
 }
 
 int MidiPlayer::open(int gameType) {
@@ -85,6 +88,12 @@ int MidiPlayer::open(int gameType) {
 	if (_nativeMT32)
 		_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
 
+	/* Disabled due to not sounding right, and low volume level
+	if (gameType == GType_SIMON1 && MidiDriver::getMusicType(dev) == MT_ADLIB) {
+			loadAdlibPatches();
+	}
+	*/
+
 	_map_mt32_to_gm = (gameType != GType_SIMON2 && !_nativeMT32);
 
 	int ret = _driver->open();
@@ -114,8 +123,10 @@ void MidiPlayer::send(uint32 b) {
 		else if (_current == &_music)
 			volume = volume * _musicVolume / 255;
 		b = (b & 0xFF00FFFF) | (volume << 16);
-	} else if ((b & 0xF0) == 0xC0 && _map_mt32_to_gm) {
-		b = (b & 0xFFFF00FF) | (MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8);
+	} else if ((b & 0xF0) == 0xC0) {
+		if (_map_mt32_to_gm && !_adlibPatches) {
+			b = (b & 0xFFFF00FF) | (MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8);
+		}
 	} else if ((b & 0xFFF0) == 0x007BB0) {
 		// Only respond to an All Notes Off if this channel
 		// has already been allocated.
@@ -144,7 +155,16 @@ void MidiPlayer::send(uint32 b) {
 			else if (_current == &_music)
 				_current->channel[9]->volume(_current->volume[9] * _musicVolume / 255);
 		}
-		_current->channel[channel]->send(b);
+
+		if ((b & 0xF0) == 0xC0 && _adlibPatches) {
+			// NOTE: In the percussion channel, this function is a
+			//       no-op. Any percussion instruments you hear may
+			//       be the stock ones from adlib.cpp.
+			_driver->sysEx_customInstrument(_current->channel[channel]->getNumber(), 'ADL ', _adlibPatches + 30 * ((b >> 8) & 0xFF));
+		} else {
+			_current->channel[channel]->send(b);
+		}
+
 		if ((b & 0xFFF0) == 0x79B0) {
 			// We have received a "Reset All Controllers" message
 			// and passed it on to the MIDI driver. This may or may
@@ -355,6 +375,47 @@ void MidiPlayer::resetVolumeTable() {
 	}
 }
 
+void MidiPlayer::loadAdlibPatches() {
+	Common::File ibk;
+
+	if (!ibk.open("mt_fm.ibk"))
+		return;
+
+	if (ibk.readUint32BE() == 0x49424b1a) {
+		_adlibPatches = new byte[128 * 30];
+		byte *ptr = _adlibPatches;
+
+		memset(_adlibPatches, 0, 128 * 30);
+
+		for (int i = 0; i < 128; i++) {
+			byte instr[16];
+
+			ibk.read(instr, 16);
+
+			ptr[0] = instr[0];   // Modulator Sound Characteristics
+			ptr[1] = instr[2];   // Modulator Scaling/Output Level
+			ptr[2] = ~instr[4];  // Modulator Attack/Decay
+			ptr[3] = ~instr[6];  // Modulator Sustain/Release
+			ptr[4] = instr[8];   // Modulator Wave Select
+			ptr[5] = instr[1];   // Carrier Sound Characteristics
+			ptr[6] = instr[3];   // Carrier Scaling/Output Level
+			ptr[7] = ~instr[5];  // Carrier Attack/Delay
+			ptr[8] = ~instr[7];  // Carrier Sustain/Release
+			ptr[9] = instr[9];   // Carrier Wave Select
+			ptr[10] = instr[10]; // Feedback/Connection
+
+			// The remaining six bytes are reserved for future use
+
+			ptr += 30;
+		}
+	}
+}
+
+void MidiPlayer::unloadAdlibPatches() {
+	delete[] _adlibPatches;
+	_adlibPatches = NULL;
+}
+
 static const 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,
diff --git a/engines/agos/midi.h b/engines/agos/midi.h
index 398e445..7e78bfe 100644
--- a/engines/agos/midi.h
+++ b/engines/agos/midi.h
@@ -77,11 +77,15 @@ protected:
 	byte _queuedTrack;
 	bool _loopQueuedTrack;
 
+	byte *_adlibPatches;
+
 protected:
 	static void onTimer(void *data);
 	void clearConstructs();
 	void clearConstructs(MusicInfo &info);
 	void resetVolumeTable();
+	void loadAdlibPatches();
+	void unloadAdlibPatches();
 
 public:
 	bool _enable_sfx;






More information about the Scummvm-git-logs mailing list