[Scummvm-cvs-logs] CVS: scummvm/scumm imuse.cpp,1.84,1.85 resource.cpp,1.22,1.23

Jamieson Christian jamieson630 at users.sourceforge.net
Thu Nov 21 11:06:11 CET 2002


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv3827/scummvm/scumm

Modified Files:
	imuse.cpp resource.cpp 
Log Message:
Revamped Adlib functionality.
IMuseAdlib is defunct.
New MidiDriver_ADLIB device.
Simon 1/2 now supports Adlib.

Index: imuse.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse.cpp,v
retrieving revision 1.84
retrieving revision 1.85
diff -u -d -r1.84 -r1.85
--- imuse.cpp	18 Nov 2002 20:05:25 -0000	1.84
+++ imuse.cpp	21 Nov 2002 19:05:35 -0000	1.85
@@ -355,7 +355,8 @@
 		pcProgram = 64,
 		pcChorus = 128,
 		pcPitchBendFactor = 256,
-		pcAll = 511,
+		pcPriority = 512,
+		pcAll = 1023,
 	};
 
 	virtual void on_timer() = 0;
@@ -665,6 +666,8 @@
 	MidiDriver *_md;
 	MidiChannelGM _midi_channels[16];
 
+	Instrument _glob_instr[32]; // Adlib custom instruments
+
 	byte _midi_program_last[16];
 	int16 _midi_pitchbend_last[16];
 	byte _midi_pitchbend_factor_last[16];
@@ -691,6 +694,8 @@
 	void midiSilence(byte chan);
 	void midiInit();
 
+	static void timer_callback (void *);
+
 public:
 	IMuseGM(MidiDriver *midi);
 	void uninit();
@@ -700,8 +705,8 @@
 	int part_update_active(Part *part, uint16 *active);
 
 	void on_timer() {}
-	void set_instrument(uint slot, byte *instr) {}
-	void part_set_instrument(Part *part, Instrument * instr) {}
+	void set_instrument(uint slot, byte *instr);
+	void part_set_instrument(Part *part, Instrument * instr);
 	void part_set_param(Part *part, byte param, int value) {}
 	void part_key_on(Part *part, byte note, byte velocity);
 	void part_key_off(Part *part, byte note);
@@ -710,7 +715,7 @@
 
 	static int midi_driver_thread(void *param);
 
-	uint32 get_base_tempo() { return 0x4A0000; }
+	uint32 get_base_tempo() { return _md->getBaseTempo(); } // 0x4A0000; }
 	byte get_hardware_type() { return 5; }
 };
 
@@ -2199,7 +2204,6 @@
 
 	case 0xC:										/* program change */
 		value = *s++;
-		debug (2, "Player::parse_midi - Setting channel %2d to program %d", chan, value); // Jamieson630: Helps to build the GM-to-FM mapping
 		part = get_part(chan);
 		if (part)
 			part->set_program(value);
@@ -2212,7 +2216,6 @@
 	case 0xE:										/* pitch bend */
 		part = get_part(chan);
 		if (part)
-			// part->set_pitchbend(((s[1] - 0x40) << 7) | s[0]);
 			part->set_pitchbend(((s[1] << 7) | s[0]) - 0x2000);
 		s += 2;
 		break;
@@ -2392,7 +2395,7 @@
 			if (part) {
 				part->set_onoff (p[2] & 0x01);
 				part->set_vol ((p[5] & 0x0F) << 4 | (p[6] & 0x0F));
-				part->_percussion = ((p[9] & 0x08) > 0);
+				part->_percussion = _isGM ? ((p[9] & 0x08) > 0) : false;
 				if (part->_percussion) {
 					if (part->_mc)
 						part->off();
@@ -2431,7 +2434,7 @@
 		
 	case 16:											/* set instrument in part */
 		a = *p++ & 0x0F;
-		if (_se->_hardware_type != *p++)
+		if (_se->_hardware_type != *p++ && false)
 			break;
 		decode_sysex_bytes(p, buf, len - 3);
 		part = get_part(a);
@@ -2441,7 +2444,7 @@
 
 	case 17:											/* set global instrument */
 		p++;
-		if (_se->_hardware_type != *p++)
+		if (_se->_hardware_type != *p++ && false)
 			break;
 		a = *p++;
 		decode_sysex_bytes(p, buf, len - 4);
@@ -3422,6 +3425,7 @@
 void Part::set_pri(int8 pri)
 {
 	_pri_eff = clamp((_pri = pri) + _player->_priority, 0, 255);
+	changed(IMuseDriver::pcPriority);
 }
 
 void Part::set_pan(int8 pan)
@@ -4947,7 +4951,8 @@
 
 	/* Install the on_timer thread */
 	_se = eng;
-	syst->create_thread(midi_driver_thread, this);
+//	syst->create_thread(midi_driver_thread, this);
+	_md->setTimerCallback (NULL, &IMuseGM::timer_callback);
 
 	for (i = 0, mc = _midi_channels; i != ARRAYSIZE(_midi_channels); i++, mc++) {
 		mc->_chan = i;
@@ -4955,6 +4960,10 @@
 	}
 }
 
+void IMuseGM::timer_callback (void *) {
+	g_scumm->_imuse->on_timer();
+}
+
 void IMuseGM::uninit()
 {
 	_md->close();
@@ -5034,6 +5043,21 @@
 	return count;
 }
 
+void IMuseGM::part_set_instrument (Part *part, Instrument *instr)
+{
+	if (!part->_mc)
+		update_pris();
+	if (!part->_mc)
+		return;
+	_md->sysEx_customInstrument (part->_mc->gm()->_chan, 'ADL ', (byte *)instr);
+}
+
+void IMuseGM::set_instrument(uint slot, byte *data)
+{
+	if (slot < 32)
+		memcpy(&_glob_instr[slot], data, sizeof(Instrument));
+}
+
 void IMuseGM::part_changed(Part *part, uint16 what)
 {
 	MidiChannelGM *mc;
@@ -5078,18 +5102,25 @@
 		midiEffectLevel(mc->_chan, part->_effect_level);
 
 	if (what & pcProgram && part->_program < 128) {
-		_midi_program_last [part->_chan] = part->_program;
-		if (part->_bank) {
-			midiControl0(mc->_chan, part->_bank);
-			midiProgram(mc->_chan, part->_program, part->_player->_mt32emulate);
-			midiControl0(mc->_chan, 0);
-		} else {
-			midiProgram(mc->_chan, part->_program, part->_player->_mt32emulate);
+		if (part->_player->_isGM) {
+			_midi_program_last [part->_chan] = part->_program;
+			if (part->_bank) {
+				midiControl0(mc->_chan, part->_bank);
+				midiProgram(mc->_chan, part->_program, part->_player->_mt32emulate);
+				midiControl0(mc->_chan, 0);
+			} else {
+				midiProgram(mc->_chan, part->_program, part->_player->_mt32emulate);
+			}
+		} else if (part->_program < 32) {
+			part_set_instrument(part, &_glob_instr[part->_program]);
 		}
 	}
 
 	if (what & pcChorus)
 		midiChorus(mc->_chan, part->_effect_level);
+
+	if (what & pcPriority)
+		_md->send ((part->_pri_eff << 16) | (18 << 8) | 0xB0 | mc->_chan);
 }
 
 

Index: resource.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/resource.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- resource.cpp	20 Nov 2002 12:54:32 -0000	1.22
+++ resource.cpp	21 Nov 2002 19:05:36 -0000	1.23
@@ -608,20 +608,21 @@
 				pri = 15;
 				break;
 			case MKID('ADL '):
+				pri = 1;
 				if (_use_adlib)
 					pri = 10;
 				break;
 			case MKID('ROL '):
-				if (!_use_adlib)
-					pri = 2;
+//				if (!_use_adlib)
+					pri = 3;
 				break;
 			case MKID('GMD '):
 //				if (!_use_adlib)
-					pri = 3;
+					pri = 4;
 				break;
 			case MKID('MAC '):
 //				if (!_use_adlib)
-					pri = 1;
+					pri = 2;
 				break;
 			case MKID('SPK '):
 				if (!_use_adlib)





More information about the Scummvm-git-logs mailing list