[Scummvm-cvs-logs] SF.net SVN: scummvm:[46081] scummvm/trunk/engines/scumm

Kirben at users.sourceforge.net Kirben at users.sourceforge.net
Sun Nov 22 12:58:15 CET 2009


Revision: 46081
          http://scummvm.svn.sourceforge.net/scummvm/?rev=46081&view=rev
Author:   Kirben
Date:     2009-11-22 11:58:14 +0000 (Sun, 22 Nov 2009)

Log Message:
-----------
Add patch #2876221 - FBEAR: Fix for MIDI piano notes (DOS version), with minor change.

Modified Paths:
--------------
    scummvm/trunk/engines/scumm/he/sound_he.cpp
    scummvm/trunk/engines/scumm/imuse/imuse.cpp
    scummvm/trunk/engines/scumm/imuse/imuse.h
    scummvm/trunk/engines/scumm/imuse/imuse_internal.h
    scummvm/trunk/engines/scumm/imuse/imuse_player.cpp

Modified: scummvm/trunk/engines/scumm/he/sound_he.cpp
===================================================================
--- scummvm/trunk/engines/scumm/he/sound_he.cpp	2009-11-22 11:43:12 UTC (rev 46080)
+++ scummvm/trunk/engines/scumm/he/sound_he.cpp	2009-11-22 11:58:14 UTC (rev 46081)
@@ -748,9 +748,12 @@
 	}
 	else if (READ_BE_UINT32(ptr) == MKID_BE('MIDI')) {
 		if (_vm->_imuse) {
+			// This is used in the DOS version of Fatty Bear's
+			// Birthday Surprise to change the note on the piano
+			// when not using a digitized instrument.
 			_vm->_imuse->stopSound(_currentMusic);
 			_currentMusic = soundID;
-			_vm->_imuse->startSound(soundID);
+			_vm->_imuse->startSoundWithNoteOffset(soundID, heOffset);
 		}
 	}
 }

Modified: scummvm/trunk/engines/scumm/imuse/imuse.cpp
===================================================================
--- scummvm/trunk/engines/scumm/imuse/imuse.cpp	2009-11-22 11:43:12 UTC (rev 46080)
+++ scummvm/trunk/engines/scumm/imuse/imuse.cpp	2009-11-22 11:58:14 UTC (rev 46081)
@@ -491,8 +491,11 @@
 	_sysex = handler;
 }
 
+void IMuseInternal::startSoundWithNoteOffset(int sound, int offset) {
+	Common::StackLock lock(_mutex, "IMuseInternal::startSound()");
+	startSound_internal(sound, offset);
+}
 
-
 ////////////////////////////////////////
 //
 // MusicEngine interface methods
@@ -559,7 +562,7 @@
 //
 ////////////////////////////////////////
 
-bool IMuseInternal::startSound_internal(int sound) {
+bool IMuseInternal::startSound_internal(int sound, int offset) {
 	// Do not start a sound if it is already set to start on an ImTrigger
 	// event. This fixes carnival music problems where a sound has been set
 	// to trigger at the right time, but then is started up immediately
@@ -632,6 +635,7 @@
 		ImClearTrigger(81, 1);
 
 	player->clear();
+	player->setOffsetNote(offset);
 	return player->startSound(sound, driver, _direct_passthrough);
 }
 

Modified: scummvm/trunk/engines/scumm/imuse/imuse.h
===================================================================
--- scummvm/trunk/engines/scumm/imuse/imuse.h	2009-11-22 11:43:12 UTC (rev 46080)
+++ scummvm/trunk/engines/scumm/imuse/imuse.h	2009-11-22 11:58:14 UTC (rev 46081)
@@ -74,6 +74,8 @@
 	virtual void addSysexHandler (byte mfgID, sysexfunc handler) = 0;
 
 public:
+	virtual void startSoundWithNoteOffset(int sound, int offset) = 0;
+
 	// MusicEngine base class methods.
 	// Not actually redefined here because none are implemented.
 

Modified: scummvm/trunk/engines/scumm/imuse/imuse_internal.h
===================================================================
--- scummvm/trunk/engines/scumm/imuse/imuse_internal.h	2009-11-22 11:43:12 UTC (rev 46080)
+++ scummvm/trunk/engines/scumm/imuse/imuse_internal.h	2009-11-22 11:58:14 UTC (rev 46081)
@@ -185,6 +185,7 @@
 	int8 _pan;
 	int8 _transpose;
 	int8 _detune;
+	int _note_offset;
 	byte _vol_eff;
 
 	uint _track_index;
@@ -270,6 +271,7 @@
 	void saveLoadWithSerializer(Serializer *ser);
 	int setHook(byte cls, byte value, byte chan) { return _hook.set(cls, value, chan); }
 	void setDetune(int detune);
+	void setOffsetNote(int offset);
 	bool setLoop(uint count, uint tobeat, uint totick, uint frombeat, uint fromtick);
 	void setPan(int pan);
 	void setPriority(int pri);
@@ -507,7 +509,7 @@
 
 protected:
 	// Internal mutex-free versions of the IMuse and MusicEngine methods.
-	bool startSound_internal(int sound);
+	bool startSound_internal(int sound, int offset = 0);
 	int stopSound_internal(int sound);
 	int stopAllSounds_internal();
 	int getSoundStatus_internal(int sound, bool ignoreFadeouts) const;
@@ -525,6 +527,8 @@
 	virtual void addSysexHandler(byte mfgID, sysexfunc handler);
 
 public:
+	void startSoundWithNoteOffset(int sound, int offset);
+
 	// MusicEngine interface
 	void setMusicVolume(int vol);
 	void startSound(int sound);

Modified: scummvm/trunk/engines/scumm/imuse/imuse_player.cpp
===================================================================
--- scummvm/trunk/engines/scumm/imuse/imuse_player.cpp	2009-11-22 11:43:12 UTC (rev 46080)
+++ scummvm/trunk/engines/scumm/imuse/imuse_player.cpp	2009-11-22 11:58:14 UTC (rev 46081)
@@ -72,6 +72,7 @@
 	_pan(0),
 	_transpose(0),
 	_detune(0),
+	_note_offset(0),
 	_vol_eff(0),
 	_track_index(0),
 	_loop_to_beat(0),
@@ -165,6 +166,7 @@
 	_active = false;
 	_midi = NULL;
 	_id = 0;
+	_note_offset = 0;
 }
 
 void Player::hook_clear() {
@@ -252,6 +254,7 @@
 		break;
 
 	case 0x9: // Key On
+		param1 += _note_offset;
 		if (!_scanning) {
 			if (_isMT32 && !_se->isNativeMT32())
 				param2 = (((param2 * 3) >> 2) + 32) & 0x7F;
@@ -666,6 +669,10 @@
 	}
 }
 
+void Player::setOffsetNote(int offset) {
+	_note_offset = offset;
+}
+
 int Player::scan(uint totrack, uint tobeat, uint totick) {
 	if (!_active || !_parser)
 		return -1;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list