[Scummvm-cvs-logs] SF.net SVN: scummvm: [26305] scummvm/trunk/engines/kyra/sound_towns.cpp

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Mon Mar 26 14:25:13 CEST 2007


Revision: 26305
          http://scummvm.svn.sourceforge.net/scummvm/?rev=26305&view=rev
Author:   lordhoto
Date:     2007-03-26 05:25:12 -0700 (Mon, 26 Mar 2007)

Log Message:
-----------
Commit of patch #1688065 ("KYRA: fm towns music").

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/sound_towns.cpp

Modified: scummvm/trunk/engines/kyra/sound_towns.cpp
===================================================================
--- scummvm/trunk/engines/kyra/sound_towns.cpp	2007-03-25 20:23:14 UTC (rev 26304)
+++ scummvm/trunk/engines/kyra/sound_towns.cpp	2007-03-26 12:25:12 UTC (rev 26305)
@@ -144,7 +144,8 @@
 	MidiParser_EuD();
 
 	bool loadMusic (byte *data, uint32 unused = 0);
-	void setTempo(int32 tempo);
+	int32 calculateTempo(int16 val);
+
 protected:
 	void parseNextEvent (EventInfo &info);
 	void resetTracking();
@@ -155,9 +156,11 @@
 	byte * _adjVelo;
 	int8 * _adjNote;
 
+	byte _tempo[3];
+
 	uint8 _firstBaseTickStep;
 	uint8 _nextBaseTickStep;
-	uint8 _initialTempo;
+	uint32 _initialTempo;
 	uint32 _baseTick;
 };
 
@@ -744,7 +747,8 @@
 }
 
 MidiParser_EuD::MidiParser_EuD() : MidiParser(),
-	_firstBaseTickStep(0x33), _nextBaseTickStep(0x33), _initialTempo(0x5a) {
+	_firstBaseTickStep(0x33), _nextBaseTickStep(0x33) {
+		_initialTempo = calculateTempo(0x5a);
 }
 
 void MidiParser_EuD::parseNextEvent(EventInfo &info) {
@@ -764,7 +768,7 @@
 				info.delta = (tick < last) ? 0 : (tick - last);
 
 				info.event = 0x90 | _channel[chan];
-				info.length = pos[7] | (pos[8] << 4);
+				info.length = pos[7] | (pos[8] << 4) | (pos[9] << 8) | (pos[10] << 12);
 
 				int8 note = (int8) pos[4];
 				if (_adjNote[chan]) {
@@ -811,9 +815,16 @@
 			_nextBaseTickStep = pos[1];
 			pos += 6;
 		} else if (cmd == 0xF8) {
-			int16 tempo = pos[4] | (pos[5] << 7);
-			setTempo(tempo);
+			int32 tempo = calculateTempo(pos[4] | (pos[5] << 7));
+			info.event = 0xff;
+			info.length = 3;
+			info.ext.type = 0x51;
+			_tempo[0] = (tempo >> 16) & 0xff;
+			_tempo[1] = (tempo >> 8) & 0xff;
+			_tempo[2] = tempo & 0xff;
+			info.ext.data = (byte*) _tempo;
 			pos += 6;
+			break;
 		} else if (cmd == 0xFD || cmd == 0xFE) {
 			// End of track.
 			if (_autoLoop)
@@ -848,7 +859,7 @@
 	_adjNote = (int8*) data + 0x3D4;
 
 	_firstBaseTickStep = data[0x804];
-	_initialTempo = (data[0x805] > 0xfc) ? 0x5a : data[0x805];
+	_initialTempo = calculateTempo((data[0x805] > 0xfc) ? 0x5a : data[0x805]);
 
 	_num_tracks = 1;
 	_ppqn = 120;
@@ -860,11 +871,8 @@
 	return true;
 }
 
-void MidiParser_EuD::setTempo(int32 tempo) {
-	if (!tempo) {
-		MidiParser::setTempo(0);
-		return;
-	}
+int32 MidiParser_EuD::calculateTempo(int16 val) {
+	int32 tempo = val;
 
 	if (tempo < 0)
 		tempo = 0;
@@ -876,7 +884,7 @@
 		tempo <<= 1;
 	tempo <<= 8;
 
-	MidiParser::setTempo(tempo);
+	return tempo;
 }
 
 void MidiParser_EuD::resetTracking() {


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