[Scummvm-cvs-logs] SF.net SVN: scummvm:[34007] scummvm/branches/gsoc2008-tfmx

marwanhilmi at users.sourceforge.net marwanhilmi at users.sourceforge.net
Mon Aug 18 22:15:44 CEST 2008


Revision: 34007
          http://scummvm.svn.sourceforge.net/scummvm/?rev=34007&view=rev
Author:   marwanhilmi
Date:     2008-08-18 20:15:40 +0000 (Mon, 18 Aug 2008)

Log Message:
-----------
Some bugfixes and cleanup. Another bugfix with the key-up coming.

Modified Paths:
--------------
    scummvm/branches/gsoc2008-tfmx/base/main.cpp
    scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.cpp
    scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.h

Modified: scummvm/branches/gsoc2008-tfmx/base/main.cpp
===================================================================
--- scummvm/branches/gsoc2008-tfmx/base/main.cpp	2008-08-18 20:04:15 UTC (rev 34006)
+++ scummvm/branches/gsoc2008-tfmx/base/main.cpp	2008-08-18 20:15:40 UTC (rev 34007)
@@ -297,19 +297,10 @@
 	_aTfmx.load();
 	_aTfmx.loadSamples();
 	_aTfmx.playSong(0);
-	
-	/*
-	if (_aTfmx.loadSong(0)) {
-		_aTfmx.testPattern(0x04);
-	}
-	//*/
-		
-	/*
-	if (_aTfmx.loadSong(0)) {
-		_aTfmx.testMacro(0x3);
-	}
-	//*/
 
+	//_aTfmx.testPattern(0x08);
+	//	_aTfmx.testMacro(0x0D);
+
 	system.getMixer()->playInputStream( Audio::Mixer::kMusicSoundType, &_handle, &_aTfmx, -1, 255, 0, false);
 	system.delayMillis( 999999 );
 	//Tfmx test end.

Modified: scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.cpp
===================================================================
--- scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.cpp	2008-08-18 20:04:15 UTC (rev 34006)
+++ scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.cpp	2008-08-18 20:15:40 UTC (rev 34007)
@@ -28,52 +28,25 @@
 
 namespace Audio {
 
-const uint16 Tfmx::periods[] =
-	{0x06AE,0x064E,0x05F4,0x059E,0x054D,0x0501,
-	 0x04B9,0x0475,0x0435,0x03F9,0x03C0,0x038C,0x0358,0x032A,0x02FC,0x02D0,0x02A8,0x0282,
-	 0x025E,0x023B,0x021B,0x01FD,0x01E0,0x01C6,0x001AC,0x0194,0x017D,0x0168,0x0154,0x0140,
-	 0x012F,0x011E,0x010E,0x00FE,0x00F0,0x00E3,0x00D6,0x00CA,0x00BF,0x00B4,0x00AA,0x00A0,
-	 0x0097,0x008F,0x0087,0x007F,0x0078,0x0071,0x00D6,0x00CA,0x00BF,0x00B4,0x00AA,0x00A0,
-	 0x0097,0x008F,0x0087,0x007F,0x0078,0x0071,0x00D6,0x00CA,0x00BF,0x00B4};
+const uint16 Tfmx::periods[] = {
+0x06AE,0x064E,0x05F4,0x059E,0x054D,0x0501,0x04B9,0x0475,0x0435,0x03F9,0x03C0,
+0x038C,0x0358,0x032A,0x02FC,0x02D0,0x02A8,0x0282,0x025E,0x023B,0x021B,0x01FD,
+0x01E0,0x01C6,0x01AC,0x0194,0x017D,0x0168,0x0154,0x0140,0x012F,0x011E,0x010E,
+0x00FE,0x00F0,0x00E3,0x00D6,0x00CA,0x00BF,0x00B4,0x00AA,0x00A0,0x0097,0x008F,
+0x0087,0x007F,0x0078,0x0071,0x00D6,0x00CA,0x00BF,0x00B4,0x00AA,0x00A0,0x0097,
+0x008F,0x0087,0x007F,0x0078,0x0071,0x00D6,0x00CA,0x00BF,0x00B4};
 
 Tfmx::Tfmx(bool stereo, int rate, int interruptFreq)
 	: Paula(stereo, rate, interruptFreq) {
-		_data = 0;
-		_trackData = 0;
-		_sampleData = 0;
+	_data = 0;
+	_trackData = 0;
+	_sampleData = 0;
 } 
 Tfmx::~Tfmx() {
-		delete[] _data;
-		delete[] _trackData;
-		delete[] _sampleData;
+	delete[] _data;
+	delete[] _trackData;
+	delete[] _sampleData;
 }
-void Tfmx::playSong(uint8 songNumber){
-	if (loadSong(songNumber)) {
-		startPaula();
-		warning("PAULA STARTED.");
-		warning("Playing Song # %d.",songNumber);
-	}
-}
-void Tfmx::stop() {
-	warning("PAULA STOPPED.");
-	stopPaula();
-}
-void Tfmx::loadSamples() {
-	//FIXME:: temporary loader - just creates seekablereadstream from c:\mk.smpl
-	Common::SeekableReadStream *stream = NULL;
-	Common::File myfile;
-	myfile.addDefaultDirectory("C:");
-	myfile.open("mk.smpl");
-	stream = myfile.readStream(myfile.size());
-	myfile.close();
-	//FIXME:: end temporary loader. normally the seekablereadstream will be function parameter
-
-	_sampleSize = stream->size();
-	_sampleData = new int8[_sampleSize];
-	stream->seek(0);
-	stream->read(_sampleData, _sampleSize);
-}
-
 void Tfmx::load() {
 	//FIXME:: temporary loader - just creates seekablereadstream from c:\mk.mdat
 	Common::SeekableReadStream *stream = NULL;
@@ -104,21 +77,24 @@
 		_songs[i].tempoValue = dataStream.readUint16BE();
 	}
 	
-	//read table positions specified at $01D0 in file (packed module)
+	//Packed module:: Read table positions specified at $01D0
 	dataStream.skip(16);
 	_trackTableOffset = dataStream.readUint32BE();
 	_patternTableOffset = dataStream.readUint32BE();
 	_macroTableOffset = dataStream.readUint32BE();
-	
-	//unpacked module specification
-	if (!_trackTableOffset) 
-		_trackTableOffset = 2048;    //$800 position
-	if (!_patternTableOffset)
-		_patternTableOffset = 1024; //$400 position
-	if (!_macroTableOffset)
-		_macroTableOffset = 1536;   //$600 position
 
-	//skip to positon of pointer tables
+	//Unpacked module:: $800 position, $400 position, $600 position
+	if (!_trackTableOffset) {
+		_trackTableOffset = 2048; 
+	}
+	if (!_patternTableOffset) {
+		_patternTableOffset = 1024; 
+	}
+	if (!_macroTableOffset) {
+		_macroTableOffset = 1536;   
+	}
+
+	//Skip to position of pointer tables and load in table.
 	dataStream.seek(_patternTableOffset, SEEK_SET);
 	for (int i = 0; i < 128; i++) {
 		_patternPointers[i] = dataStream.readUint32BE();
@@ -128,7 +104,29 @@
 		_macroPointers[i] = dataStream.readUint32BE();
 	}
 }
+void Tfmx::loadSamples() {
+	//FIXME:: temporary loader - just creates seekablereadstream from c:\mk.smpl
+	Common::SeekableReadStream *stream = NULL;
+	Common::File myfile;
+	myfile.addDefaultDirectory("C:");
+	myfile.open("mk.smpl");
+	stream = myfile.readStream(myfile.size());
+	myfile.close();
+	//FIXME:: end temporary loader. normally the seekablereadstream will be function parameter
 
+	_sampleSize = stream->size();
+	_sampleData = new int8[_sampleSize];
+	stream->seek(0);
+	stream->read(_sampleData, _sampleSize);
+}
+void Tfmx::playSong(uint8 songNumber){
+	if (loadSong(songNumber)) {
+		startPaula();
+	}
+}
+void Tfmx::stop() {
+	stopPaula();
+}
 bool Tfmx::loadSong(uint8 songNumber) {
 	if(songNumber >= 32) {
 		error("Invalid Song Number.");
@@ -165,7 +163,7 @@
 		_tracks[track].trackOn = true;
 		_tracks[track].patternOn = false;
 		_tracks[track].macroOn = false;
-		_tracks[track].patternNumber = 0xFF; //obviously impossible pattern number
+		_tracks[track].patternNumber = 0xFF; 
 
 		//initialize Pattern objects
 		_tracks[track].activePattern.data = 0;
@@ -190,6 +188,7 @@
 		_tracks[track].activeMacro.keyWaitOn = false;
 		_tracks[track].activeMacro.keyCount = 0;
 		_tracks[track].activeMacro.keyWait = 0;
+		_tracks[track].activeMacro.positionLoaded = 0xFFFFFFFF;
 	}
 
 	//INITIALIZE CHANNELS
@@ -221,9 +220,50 @@
 	setInterruptFreq( (int)( getRate() / (1 / _tempo * 24)));
 	}
 
-	setInterruptFreq( (int)( getRate() / 80) );
 	return true;
 }
+void Tfmx::loadPattern(uint8 trackNumber, uint8 patternNumber) {
+	uint32 startPosition;
+	uint32 endPosition;
+	int32 numCommands;		
+	startPosition = _patternPointers[patternNumber];
+	endPosition = _patternPointers[patternNumber + 1];
+	numCommands = (endPosition - startPosition) / 4;
+	_tracks[trackNumber].activePattern.patternCount = 0;
+	_tracks[trackNumber].activePattern.patternLength = numCommands;
+
+	Common::MemoryReadStream dataStream(_data, _dataSize);
+	Common::SeekableSubReadStream patternSubStream(&dataStream, startPosition, endPosition);
+
+	_tracks[trackNumber].activePattern.data = new uint32[numCommands];
+	for (int i = 0; i < numCommands; i++) {
+		_tracks[trackNumber].activePattern.data[i] = patternSubStream.readUint32BE();
+	}
+}
+void Tfmx::loadMacro(uint8 trackNumber, uint8 macroNumber){
+	uint32 startPosition;
+	uint32 endPosition;
+	int32 numCommands;		
+	startPosition = _macroPointers[macroNumber]; 
+	endPosition = _macroPointers[macroNumber + 1];
+	numCommands = (endPosition - startPosition) / 4; 
+
+	_tracks[trackNumber].activeMacro.macroCount = 0;
+	_tracks[trackNumber].activeMacro.macroLength = numCommands;
+	_tracks[trackNumber].activeMacro.noteType = 0;
+	_tracks[trackNumber].activeMacro.noteFineTune = 0;
+	_tracks[trackNumber].activeMacro.macroWait = 0;
+	_tracks[trackNumber].activeMacro.positionLoaded = _tracks[trackNumber].activePattern.patternCount;
+	_tracks[trackNumber].activeMacro.keyWaitOn = false;
+
+	Common::MemoryReadStream dataStream(_data, _dataSize);
+	Common::SeekableSubReadStream macroSubStream(&dataStream, startPosition, endPosition);
+
+	_tracks[trackNumber].activeMacro.data = new uint32[numCommands];
+	for (int i = 0; i < numCommands; i++) {
+		_tracks[trackNumber].activeMacro.data[i] = macroSubStream.readUint32BE();
+	}
+}
 void Tfmx::updateTrackstep() {
 	//If _trackEnd, stop Paula and terminate update.
 	if (_trackEnd) {
@@ -238,15 +278,15 @@
 			_trackCount++;
 	}
 
-	//check if you reached the last trackstep block
+	//Check if you reached the last trackstep block.
 	if (_trackCount >= _trackLength) {
 		_trackEnd = true;
 	}
 
-	//proccess trackstep commands
-	if (_tracks[0].data == 61438) { //you have a line of trackstep commands
+	//Proccess trackstep commands
+	if (_tracks[0].data == 61438) { 
 		switch (_tracks[1].data) {
-		case 0: // EFFE0000 Stops player.
+		case 0: // EFFE0000: Stops player.
 			stop();
 			break;
 		case 1: //EFFE0001: NOT USED IN MI.
@@ -254,31 +294,31 @@
 			//uint16 selectionPosition = tracks[2]; 
 			//uint16 selectionLoops = tracks[3];    
 			break;
-		case 2: //EFFE002: SAFE TO IGNORE FOR NOW
+		case 2: //EFFE002: NOT USED IN MI.
 			//MI uses this command but it seems broken - it sets both parameters to 0 only. 
-			//Might be safe to ignore for now and just use tempo set in header.
+			//TODO: will accept tempoDivisor & tempoBPM as parameters
 			//uint16 tempoDivisor = tracks[2];    
 			//uint16 tempoBPM = tracks[3];        
-			//setTempo(); //TODO: will accept tempoDivisor & tempoBPM as parameters
+			//setTempo(); 
 			break;
 		case 3: //EFFE0003: NOT USED IN MI. 
-			//Purpose not clear. Flagged as multimode/7 channel setting in other players.
 			break;
-		case 4: //EFFE0004 Volume slide
+		case 4: //EFFE0004: NOT USED IN MI.
+			//TODO: will accept volumeDivisor & volumeTarget as parameters
 			//uint16 volumeDivisor = tracks[2];    
 			//uint16 volumeTarget = tracks[3];     
-			//volumeSlide(); //TODO: will accept volumeDivisor & volumeTarget as parameters
+			//volumeSlide(); 
 			break;
-		default: //Non-existant command
-			//TODO: error
+		default: 
+			error("Invalid Trackstep command.");
 			break;
-		} // end switch 
-	} // end if track[].data = command
+		} 
+	}
 
-	else { //each tracks[].data is 16 bits; first 8 bits is pattern number, second 8 bits is transpose number
+	else { 
 		for (int track = 0; track < 8; track++) {
 			
-			if (_tracks[track].data == 0xFF00) {    //kill track command
+			if (_tracks[track].data == 0xFF00) {    
 				_tracks[track].trackOn = false; 
 			}
 				
@@ -289,226 +329,153 @@
 				loadPattern( track, (_tracks[track].data >> 8) );
 			}
 		}
-	}//end else
-}
-void Tfmx::loadPattern(uint8 trackNumber, uint8 patternNumber) {
-	uint32 startPosition;
-	uint32 endPosition;
-	int32 numCommands;		
-	startPosition = _patternPointers[patternNumber]; //+ _tracks[trackNumber].pattern.offset;
-	endPosition = _patternPointers[patternNumber + 1];
-	numCommands = (endPosition - startPosition) / 4;
-	//_tracks[trackNumber].activePattern.offset = 0;
-	_tracks[trackNumber].activePattern.patternCount = 0;
-	_tracks[trackNumber].activePattern.patternLength = numCommands;
-
-	Common::MemoryReadStream dataStream(_data, _dataSize);
-	Common::SeekableSubReadStream patternSubStream(&dataStream, startPosition, endPosition);
-
-	_tracks[trackNumber].activePattern.data = new uint32[numCommands];
-	for (int i = 0; i < numCommands; i++) {
-		_tracks[trackNumber].activePattern.data[i] = patternSubStream.readUint32BE();
 	}
 }
 void Tfmx::updatePattern(uint8 trackNumber) {
 	if (_tracks[trackNumber].activePattern.patternWait != 0) {
-		//printf("PATTERN WAIT:: %02x \n", _tracks[trackNumber].activePattern.patternWait);
 		_tracks[trackNumber].activePattern.patternWait--;
 		return;
 	}
 
-	uint8 byte1 = ( *(_tracks[trackNumber].activePattern.data) & 0xFF000000 ) >> 24;
-	uint8 byte2 = ( *(_tracks[trackNumber].activePattern.data) & 0x00FF0000 ) >> 16;
-	uint8 byte3 = ( *(_tracks[trackNumber].activePattern.data) & 0x0000FF00 ) >> 8;
-	uint8 byte4 = ( *(_tracks[trackNumber].activePattern.data) & 0x000000FF );
-	uint16 bytes34 = ( *(_tracks[trackNumber].activePattern.data) & 0x0000FFFF );
+	uint8 byte1 = (*(_tracks[trackNumber].activePattern.data) & 0xFF000000) >> 24;
+	uint8 byte2 = (*(_tracks[trackNumber].activePattern.data) & 0x00FF0000) >> 16;
+	uint8 byte3 = (*(_tracks[trackNumber].activePattern.data) & 0x0000FF00) >> 8;
+	uint8 byte4 = (*(_tracks[trackNumber].activePattern.data) & 0x000000FF);
+	uint16 bytes34 = (*(_tracks[trackNumber].activePattern.data) & 0x0000FFFF);
 
-//	printf("PATTERN COMMAND:: %02x \n", byte1);
-
 	if (byte1 >= 0xF0) {
 		switch (byte1) {
-		case 0xF0: //end pattern + advance track
-			//end pattern? also needs to know the track this is playing on
+		case 0xF0: //End pattern + advance trackstep.
 			if (!_tracks[trackNumber].activeMacro.keyWaitOn) {
-				_tracks[trackNumber].patternOn = false; 
+					_tracks[trackNumber].patternOn = false; 
 			}
-			//_trackAdvance = true;
 			break;
-		case 0xF1: //repeat block/loop
-			break;
-		case 0xF2: //pattern jump
-			//offset of byte34
-			/*
-			_tracks[trackNumber].pattern.saveNumber1 = byte2;
-			_tracks[trackNumber].pattern.offset = bytes34;
-			_tracks[trackNumber].pattern.jumpFlag = true;
-			_tracks[trackNumber].pattern.newFlag = true;
-			*/
-			break;
-		case 0xF3:
-			//waits byte2 + 1 jiffies
+		case 0xF3: //Wait.
 			_tracks[trackNumber].activePattern.patternWait = byte2;
 			break;
-		case 0xF4: //kills track until new pointer is loaded
-			//need to know track this pattern is on, then needs to stop reading proceeding cmds
+		case 0xF4: //Kills track until new pointer is loaded.
 			if (!_tracks[trackNumber].activeMacro.keyWaitOn) {
 				_tracks[trackNumber].patternOn = false; 
 				_tracks[trackNumber].trackOn = false;
 			}
 			break;
-		case 0xF5: //Key up
+		case 0xF5: //Key up.
 			_channels[(byte3 & 0x0F) & 0x03].keyUp = true;
 			break;
-		case 0xF6: //Vibrato
+		case 0xFE: //Disable track.
+			_tracks[trackNumber].patternOn = false; 
+			_tracks[trackNumber].trackOn = false;
 			break;
-		case 0xF7: //Envelope
+		//TODO:: The cases below aren't used in Monkey Island. Support for them will be added gradually as needed.
+		case 0xF1: //Repeat block/loop.
 			break;
-		case 0xF8: //same as 0xF2 except it saves current pattern address for return
-			/*
-			_tracks[trackNumber].pattern.saveNumber1 = byte2;
-			_tracks[trackNumber].pattern.saveNumber2 = _tracks[trackNumber].pattern.number;
-			_tracks[trackNumber].pattern.offset = (_tracks[trackNumber].pattern.count) * 32;
-			_tracks[trackNumber].pattern.jumpFlag = true;
-			_tracks[trackNumber].pattern.newFlag = true;
-			*/
+		case 0xF2: //Pattern jump.
+			break;			
+		case 0xF6: //Vibrato.
 			break;
-		case 0xF9: //return to saved address ; ie reload oldPattern
-			/*
-			_tracks[trackNumber].pattern.returnFlag = true;
-			_tracks[trackNumber].pattern.newFlag = true;		
-			*/
+		case 0xF7: //Envelope.
 			break;
-		case 0xFA: //master volume slide
+		case 0xF8: //Pattern jump.
 			break;
-		case 0xFB: 
+		case 0xF9: //Return to saved address.
 			break;
-		case 0xFC: //Portamento
+		case 0xFA: //Master volume slide.
 			break;
-		case 0xFD: //Channel lock
-			//locks the channel specified in byte2 for bytes34 ticks
+		case 0xFB: //Play pattern (on another track).
 			break;
-		case 0xFE: //disable track, same as F4 apparently
-			_tracks[trackNumber].patternOn = false; 
-			_tracks[trackNumber].trackOn = false;
+		case 0xFC: //Portamento.
 			break;
-		case 0xFF: //Do nothing - advance pattern pointer
+		case 0xFD: //Channel lock.
 			break;
+		case 0xFF: //Do nothing. Advance pattern pointer.
+			break;
 		default:
-			//invalid cmd
+			warning("Invalid Pattern command. %02x", byte1);
 			break;
-		} // end switch
+		}
 	} 
 	
 	else { 
-		if (!_tracks[trackNumber].macroOn) {
-			_tracks[trackNumber].macroNumber = byte2;
-			loadMacro( trackNumber, (_tracks[trackNumber].macroNumber) );
-			if (byte1 < 0x80) {
-				_tracks[trackNumber].activeMacro.noteType = 1; 		//byte4 = finetune
-				_tracks[trackNumber].activeMacro.noteFineTune = byte4;
+		if ((!_tracks[trackNumber].macroOn) || (_tracks[trackNumber].activeMacro.keyWaitOn)) {
+			if (_tracks[trackNumber].activeMacro.positionLoaded != _tracks[trackNumber].activePattern.patternCount) {
+				_tracks[trackNumber].macroNumber = byte2;
+				loadMacro(trackNumber, (_tracks[trackNumber].macroNumber));
+				if (byte1 < 0x80) {
+					_tracks[trackNumber].activeMacro.noteType = 1; 		//byte4 = finetune
+					_tracks[trackNumber].activeMacro.noteFineTune = byte4;
+				}
+				else if (byte1 < 0xC0) {
+					_tracks[trackNumber].activeMacro.noteType = 2;      //byte4 = wait
+					_tracks[trackNumber].activeMacro.noteWait = byte4;
+				}
+				else {
+					_tracks[trackNumber].activeMacro.noteType = 3;      //byte4 = portamento rate
+				}
+				_tracks[trackNumber].macroOn = true; 
+				_tracks[trackNumber].activeMacro.noteNumber = byte1;
+				_tracks[trackNumber].activeMacro.noteVelocity = (byte3 & 0xF0) >> 4;
+				_tracks[trackNumber].activeMacro.noteChannel = (byte3 & 0x0F);
+				_tracks[trackNumber].activeMacro.notePeriod = periods[(_tracks[trackNumber].activeMacro.noteNumber + _tracks[trackNumber].activePattern.patternTranspose) & 0x3F];
 			}
-			else if (byte1 < 0xC0) {
-				_tracks[trackNumber].activeMacro.noteType = 2;      //byte4 = wait
-				_tracks[trackNumber].activeMacro.noteWait = byte4;
-			}
-			else {
-				_tracks[trackNumber].activeMacro.noteType = 3;      //byte4 = portamento rate
-			}
-			_tracks[trackNumber].macroOn = true; //set to false again when macro terminates
-			_tracks[trackNumber].activeMacro.noteNumber = byte1;
-			_tracks[trackNumber].activeMacro.noteVelocity = (byte3 & 0xF0) >> 4;
-			_tracks[trackNumber].activeMacro.noteChannel = (byte3 & 0x0F);
-			_tracks[trackNumber].activeMacro.notePeriod = periods[(_tracks[trackNumber].activeMacro.noteNumber + _tracks[trackNumber].activePattern.patternTranspose) & 0x3F];
 		}
-
-		else {
-			while (_tracks[trackNumber].activeMacro.macroWait == 0 && (_tracks[trackNumber].macroOn == true) ) {
+		else if (_tracks[trackNumber].macroOn) {
+			while (_tracks[trackNumber].activeMacro.macroWait == 0 && (_tracks[trackNumber].macroOn == true)) {
 				doMacro(trackNumber);
 			}
 		}
 		if (_tracks[trackNumber].activeMacro.macroWait != 0) {
-		printf("MACRO WAIT:: %02x \n", _tracks[trackNumber].activeMacro.macroWait);
-		_tracks[trackNumber].activeMacro.macroWait--;
+			_tracks[trackNumber].activeMacro.macroWait--;
 		}
-	}//END ELSE
+	}
 
-	//ADVANCE PATTERN COUNT, INCREASE COUNT
-	//IF MACRO IS ON, WAIT TO ADVANCE
-	if ( (!_tracks[trackNumber].macroOn) || (_tracks[trackNumber].activeMacro.keyWaitOn) ) {
-		_tracks[trackNumber].activePattern.data++;
-		_tracks[trackNumber].activePattern.patternCount++;
+	//Advance pattern. If macro is on, wait to advance.
+	if ((!_tracks[trackNumber].macroOn) || (_tracks[trackNumber].activeMacro.keyWaitOn)) {
+		if (_tracks[trackNumber].activePattern.patternCount < _tracks[trackNumber].activePattern.patternLength) {
+			_tracks[trackNumber].activePattern.data++;
+			_tracks[trackNumber].activePattern.patternCount++;
+		}
 		if (_tracks[trackNumber].activeMacro.noteType == 2 && (!_tracks[trackNumber].activeMacro.keyWaitOn) ) {
 			_tracks[trackNumber].activePattern.patternWait += _tracks[trackNumber].activeMacro.noteWait;
 		}
 	}
-	//IF THE END IS REACHED, TURN PATTERN OFF
+	//If the end of the pattern is reached, turn the pattern off.
 	if (_tracks[trackNumber].activePattern.patternCount == _tracks[trackNumber].activePattern.patternLength) {
 		if (!_tracks[trackNumber].activeMacro.keyWaitOn) {
-		_tracks[trackNumber].patternOn = false;
+			_tracks[trackNumber].patternOn = false;
+			_tracks[trackNumber].activeMacro.positionLoaded = 0xFFFFFFFF;
 		}
 	}
 }
-void Tfmx::loadMacro(uint8 trackNumber, uint8 macroNumber){
-	uint32 startPosition;
-	uint32 endPosition;
-	int32 numCommands;		
-	startPosition = _macroPointers[macroNumber]; //TODO:: Need to add offset for jump commands
-	endPosition = _macroPointers[macroNumber + 1];
-	numCommands = (endPosition - startPosition) / 4; 
-
-	_tracks[trackNumber].activeMacro.macroCount = 0;
-	_tracks[trackNumber].activeMacro.macroLength = numCommands;
-	_tracks[trackNumber].activeMacro.noteType = 0;
-	_tracks[trackNumber].activeMacro.noteFineTune = 0;
-	
-	Common::MemoryReadStream dataStream(_data, _dataSize);
-	Common::SeekableSubReadStream macroSubStream(&dataStream, startPosition, endPosition);
-
-	_tracks[trackNumber].activeMacro.data = new uint32[numCommands];
-	for (int i = 0; i < numCommands; i++) {
-		_tracks[trackNumber].activeMacro.data[i] = macroSubStream.readUint32BE();
-	}
-
-	printf("MACRO NUMBER:: %02x \n", macroNumber);
-	printf("MACRO LENGTH:: %02x \n", numCommands);
-}
 void Tfmx::doMacro(uint8 trackNumber) {
-	uint8 byte1 = ( *(_tracks[trackNumber].activeMacro.data) ) >> 24;
-	uint8 byte2 = ( *(_tracks[trackNumber].activeMacro.data) & 0x00FF0000 ) >> 16;
-	uint8 byte3 = ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FF00 ) >> 8;
-	int8 sbyte3 = ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FF00 ) >> 8;
-	uint8 byte4 = ( *(_tracks[trackNumber].activeMacro.data) & 0x000000FF );
+	uint8 byte1 = (*(_tracks[trackNumber].activeMacro.data)) >> 24;
+	uint8 byte2 = (*(_tracks[trackNumber].activeMacro.data) & 0x00FF0000) >> 16;
+	uint8 byte3 = (*(_tracks[trackNumber].activeMacro.data) & 0x0000FF00) >> 8;
+	int8 sbyte3 = (*(_tracks[trackNumber].activeMacro.data) & 0x0000FF00) >> 8;
+	uint8 byte4 = (*(_tracks[trackNumber].activeMacro.data) & 0x000000FF);
 	uint8 currentChannel = _tracks[trackNumber].activeMacro.noteChannel;
 	uint16 tunedPeriod = 0;
-	
-	printf("MACRO COUNT:: %02x ::::", _tracks[trackNumber].activeMacro.macroCount);
-	printf("MACRO COMMAND:: %02x \n", byte1);
 
 	switch (byte1) {
-	case 0x00: //DMAoff reset + CLEARS EFFECTS
+	case 0x00: //DMAoff reset + CLEARS EFFECTS.
 		_channels[currentChannel].sampleOn = false;
-		//_channels[currentChannel].updateOn = true;
 		_channels[currentChannel].sampleOffset = 0;
 		_channels[currentChannel].sampleLength = 0;
 		_channels[currentChannel].envelopeOn = false;
 		_channels[currentChannel].vibratoOn = false;
-		//_tracks[trackNumber].activeMacro.macroWait = 1;
 		break;
-	case 0x01:
+	case 0x01: //DMA on.
 		_channels[currentChannel].sampleOn = true;
 		_channels[currentChannel].updateOn = true;
-		//_tracks[trackNumber].activeMacro.macroWait = 1;
 		break;
-	case 0x02: //set sample offset
+	case 0x02: //Sample offset.
 		_channels[currentChannel].sampleOffset = *(_tracks[trackNumber].activeMacro.data) & 0x00FFFFFF;
 		_channels[currentChannel].updateOn = true;
 		break;
-	case 0x03: //set sample length
-		//_channels[currentChannel].sampleLength = ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF ) * 2;
+	case 0x03: //Sample length.
 		_channels[currentChannel].sampleLength = ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF );
 		_channels[currentChannel].updateOn = true;
 		break;
-	case 0x04: //wait
+	case 0x04: //Wait.
 		if ( (*(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF) == 0 ) {
 			_tracks[trackNumber].activeMacro.macroWait = 1;
 		}
@@ -516,14 +483,32 @@
 			_tracks[trackNumber].activeMacro.macroWait = ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF );
 		}
 		break;
-	case 0x07:
+	case 0x07: //End of macro.
 		_channels[currentChannel].sampleOn = false; 
 		_tracks[trackNumber].macroOn = false;
 		break;
-	case 0x13: //DMA OFF BUT DOESNT CLEAR EFFECTS
+	case 0x08: //Add note.
+		tunedPeriod = (periods[(byte2 + _tracks[trackNumber].activeMacro.noteNumber) & (0x3F)]);
+		_tracks[trackNumber].activeMacro.fineTune = sbyte3 / 0x100;
+		_tracks[trackNumber].activeMacro.fineTune += (_tracks[trackNumber].activeMacro.noteFineTune / 0x100);
+		_tracks[trackNumber].activeMacro.fineTune += 1;
+		_tracks[trackNumber].activeMacro.notePeriod = (int)(tunedPeriod * _tracks[trackNumber].activeMacro.fineTune);
+		_tracks[trackNumber].activeMacro.macroWait = 1;
+		break;
+	case 0x09: //Set note.
+		tunedPeriod = (periods[(byte2) & (0x3F)]);
+		_tracks[trackNumber].activeMacro.fineTune = sbyte3 / 0x100;
+		_tracks[trackNumber].activeMacro.fineTune += (_tracks[trackNumber].activeMacro.noteFineTune / 0x100);
+		_tracks[trackNumber].activeMacro.fineTune += 1;
+		_tracks[trackNumber].activeMacro.notePeriod = (int)(tunedPeriod * _tracks[trackNumber].activeMacro.fineTune);
+		_tracks[trackNumber].activeMacro.macroWait = 1;
+		break;
+	case 0x13: //DMA off. Save effects.
 		_channels[currentChannel].sampleOn = false;
+		_channels[currentChannel].sampleOffset = 0;
+		_channels[currentChannel].sampleLength = 0;
 		break;
-	case 0x0D: //add volume to channel;.
+	case 0x0D: //Add volume.
 		if (byte3 != 0xFE) {
 			_channels[currentChannel].volume = (_tracks[trackNumber].activeMacro.noteVelocity * 3) + byte4;
 			
@@ -532,59 +517,41 @@
 			}
 		}
 		break;
-	case 0x0E: //set volume
+	case 0x0E: //Set volume.
 		if (byte3 != 0xFE) {
 			_channels[currentChannel].volume = byte2;
 		}
 		break;
-	case 0x19: //set one shot ? cut off?
-		_tracks[trackNumber].activeMacro.notePeriod = 0;
-		_channels[currentChannel].sampleOffset = 0;
-		_channels[currentChannel].sampleLength = 0;
-		_channels[currentChannel].updateOn = true;
+	case 0x17: //set period
+		_tracks[trackNumber].activeMacro.notePeriod = ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF );
+		_tracks[trackNumber].activeMacro.macroWait = 1;
 		break;
-	case 0x18: //sampleloop
+	case 0x18: //Set sample position for looping.
 		//_channels[currentChannel].sampleOffset += ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF );
 		//_channels[currentChannel].sampleLength -= ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF );
-		_channels[currentChannel].sampleOffset += ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFE );
-	    _channels[currentChannel].sampleLength -= ( ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF ) >> 1);
-		//_channels[currentChannel].updateOn = true;
+		_channels[currentChannel].sampleOffset += (*(_tracks[trackNumber].activeMacro.data) & 0x0000FFFE);
+	    _channels[currentChannel].sampleLength -= (*(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF) >> 1;
 		break;
-	case 0x08: //add note
-		tunedPeriod = (periods[(byte2 + _tracks[trackNumber].activeMacro.noteNumber) & (0x3F)]);
-		_tracks[trackNumber].activeMacro.fineTune = sbyte3 / 0x100;
-		_tracks[trackNumber].activeMacro.fineTune += (_tracks[trackNumber].activeMacro.noteFineTune / 0x100);
-		_tracks[trackNumber].activeMacro.fineTune += 1;
-		_tracks[trackNumber].activeMacro.notePeriod = (int)(tunedPeriod * _tracks[trackNumber].activeMacro.fineTune);
-		_tracks[trackNumber].activeMacro.macroWait = 1;
+	case 0x19: //Set one shot sample.
+		_channels[currentChannel].sampleOffset = 0;
+		_channels[currentChannel].sampleLength = 0;
+		_channels[currentChannel].updateOn = true;
 		break;
-	case 0x09: //set note
-		tunedPeriod = (periods[(byte2) & (0x3F)]);
-		_tracks[trackNumber].activeMacro.fineTune = sbyte3 / 0x100;
-		_tracks[trackNumber].activeMacro.fineTune += (_tracks[trackNumber].activeMacro.noteFineTune / 0x100);
-		_tracks[trackNumber].activeMacro.fineTune += 1;
-		_tracks[trackNumber].activeMacro.notePeriod = (int)(tunedPeriod * _tracks[trackNumber].activeMacro.fineTune);
-		_tracks[trackNumber].activeMacro.macroWait = 1;
-		break;
-	case 0x17: //set period
-		_tracks[trackNumber].activeMacro.notePeriod = ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF );
-		_tracks[trackNumber].activeMacro.macroWait = 1;
-		break;
-	case 0x0F://envelope
+	case 0x0F: //Envelope.
 		_channels[currentChannel].envelopeOn = true;
 		_channels[currentChannel].envelopeTarget = byte4;
 		_channels[currentChannel].envelopeRate = byte2;
 		_channels[currentChannel].envelopeSpeed = byte3; 
 		_channels[currentChannel].envelopeCount = 0;
 		break;
-	case 0x0C: //vibrato
+	case 0x0C: //Vibrato.
 		_channels[currentChannel].vibratoOn = true;
 		_channels[currentChannel].vibratoRate = byte4;
 		_channels[currentChannel].vibratoSpeed = byte2 * 2;
 		_channels[currentChannel].vibratoCount = 0;
-		_channels[currentChannel].vibratoDirection = false; //vibrato down first
+		_channels[currentChannel].vibratoDirection = false; 
 		break;
-	case 0x14://wait for key-up
+	case 0x14: //Wait for key-up
 		_tracks[trackNumber].activeMacro.keyWaitOn = true;
 		_tracks[trackNumber].activeMacro.keyWait = byte4;
 		if (_tracks[trackNumber].activeMacro.keyWait == 0) {
@@ -592,24 +559,20 @@
 		}
 		
 		if (_tracks[trackNumber].activeMacro.keyCount == 0) {
-			//printf("KEY UP WAIT TIME:: %02x \n", _tracks[trackNumber].activeMacro.keyWait);
 			_channels[currentChannel].updateOn = true;
 			_channels[currentChannel].keyUp = false;
 		}
 
-		if ( (!_channels[currentChannel].keyUp) && (_tracks[trackNumber].activeMacro.keyCount != _tracks[trackNumber].activeMacro.keyWait) ){
-			//waiting for key up to be set
+		if ((!_channels[currentChannel].keyUp) && (_tracks[trackNumber].activeMacro.keyCount != _tracks[trackNumber].activeMacro.keyWait)){
 			_tracks[trackNumber].activeMacro.data--;
 			_tracks[trackNumber].activeMacro.macroCount--;
 			_tracks[trackNumber].activeMacro.macroWait = 1;
-			//printf("KEY UP WAIT COUNT:: %02x \n", _tracks[trackNumber].activeMacro.keyCount);
 			_tracks[trackNumber].activeMacro.keyCount++;
 			if (_tracks[trackNumber].activeMacro.keyCount == 0x7F) {
 				_tracks[trackNumber].activeMacro.keyCount = 1;
 			}
 		}
-		else if ( (_channels[currentChannel].keyUp) || (_tracks[trackNumber].activeMacro.keyCount == _tracks[trackNumber].activeMacro.keyWait) ) {
-			//key up has been set or key wait time has been reached
+		else if ((_channels[currentChannel].keyUp) || (_tracks[trackNumber].activeMacro.keyCount == _tracks[trackNumber].activeMacro.keyWait)) {
 			_channels[currentChannel].keyUp = false;
 			_tracks[trackNumber].activeMacro.keyWaitOn = false;
 			_tracks[trackNumber].activeMacro.keyWait = 0;
@@ -617,8 +580,9 @@
 		}
 		break;
 	default:
+		error("Invalid Pattern command.");
 		break;
-	}//end switch
+	}
 
 	if (_channels[currentChannel].volume == 0) {
 		_channels[currentChannel].volume = _tracks[trackNumber].activeMacro.noteVelocity;
@@ -630,33 +594,18 @@
 
 	if (_tracks[trackNumber].activeMacro.macroCount == _tracks[trackNumber].activeMacro.macroLength) {
 		_tracks[trackNumber].macroOn = false;
-		//_channels[currentChannel].sampleOn = false;
 	}
 }
-void Tfmx::testMacro(uint8 macroNumber) {
-	_macroTest = true;
-	loadMacro(0, macroNumber);
-	_tracks[0].macroOn = true; //set to false again when macro terminates
-	_tracks[0].activeMacro.noteNumber = 0x1E;  //middle C
-	_tracks[0].activeMacro.noteVelocity = 0x0F;
-	_tracks[0].activeMacro.noteChannel = 0;
-	_tracks[0].activeMacro.noteWait = 0; 
-	_tracks[0].activeMacro.notePeriod = periods[(_tracks[0].activeMacro.noteNumber & 0x3F)];
-	startPaula();
-}
 void Tfmx::interrupt(void) {
 	static int count = 0;
 	count++;
-	//printf("INTERRUPT COUNT:: %02x \n", count);
 	
-	if (!_macroTest && !_patternTest) { //Would be the normal case unless macro testing is on.
+	if (!_macroTest && !_patternTest) { //Would be the normal case unless testing is on.
 
 		if (_trackAdvance) {
 			updateTrackstep();
 		}
 
-		//CYCLE THROUGH THE 8 TRACKS TO FIND WHICH PATTERNS ARE ON AND THEN UPDATE
-		//WILL SKIP UPDATES FOR A WAIT
 		for (int track = 0; track < 8; track++) {
 			if (_tracks[track].patternOn && _tracks[track].trackOn) {
 					updatePattern(track);
@@ -668,18 +617,18 @@
 			setChannelPeriod(i,_channels[i].period);
 			setChannelVolume(i,_channels[i].volume);
 			if ( (_channels[i].sampleOn) && (_channels[i].updateOn) ) {
+				/*
 				printf("SAMPLE ON:: Channel # %02x \n", i);
 				printf("SAMPLE OFFSET:: %02x \n", _channels[i].sampleOffset);
 				printf("SAMPLE LENGTH:: %02x \n", _channels[i].sampleLength);
 				printf("SAMPLE VOLUME:: %02x \n", _channels[i].volume);
 				printf("SAMPLE PERIOD:: %02x \n", _channels[i].period);
-				//setChannelData(i, _sampleData + _channels[i].sampleOffset, 0, _channels[i].sampleLength, 0);
+				*/
 				setChannelData(i, _sampleData + _channels[i].sampleOffset, _sampleData + _channels[i].sampleOffset, _channels[i].sampleLength, _channels[i].sampleLength);
 				_channels[i].updateOn = false;
 			}	
 		}
 		
-		//CHECK IF PATTERNS ARE ON: IF SO, TRACK ADVANCE IS FALSE
 		for (int track = 0; track < 8; track++) {
 			if (_tracks[track].patternOn) {
 				_trackAdvance = false;
@@ -690,9 +639,9 @@
 			}
 		}
 
-	}//IF MACRO TEST = FALSE
+	}
 
-	else if (_macroTest) { //MACRO TEST IS ON
+	else if (_macroTest) { 
 		while (_tracks[0].activeMacro.macroWait == 0 && (_tracks[0].macroOn == true) ) {
 				doMacro(0);
 		}
@@ -704,9 +653,7 @@
 				printf("SAMPLE OFFSET:: %02x \n", _channels[0].sampleOffset);
 				printf("SAMPLE LENGTH:: %02x \n", _channels[0].sampleLength);
 				printf("SAMPLE VOLUME:: %02x \n", _channels[0].volume);
-				printf("SAMPLE PERIOD:: %02x \n", _channels[0].period);
-				printf("SAMPLE PERIOD NUMBER:: %02x \n", _tracks[0].activeMacro.noteNumber & 0x3F);
-				//setChannelData(0, _sampleData + _channels[0].sampleOffset, 0, _channels[0].sampleLength, 0);
+				printf("SAMPLE PERIOD NUMBER:: %02x \n", _tracks[0].activeMacro.noteNumber);
 				setChannelData(0, _sampleData + _channels[0].sampleOffset, _sampleData + _channels[0].sampleOffset, _channels[0].sampleLength, _channels[0].sampleLength);
 				_channels[0].updateOn = false;
 		}		
@@ -717,41 +664,28 @@
 	}
 
 	else if (_patternTest) {
-		//printf("INTERRUPT COUNT:: %02x \n", count);
 		if (_tracks[0].patternOn && _tracks[0].trackOn) {
 			updatePattern(0);
 		}
 
 		for (int i = 0; i < 4; i++) {
-			//setChannelPeriod(i,periods[(_tracks[0].activeMacro.noteNumber & 0x3F)]);
 			doEffects(i);
+			
 			setChannelPeriod(i,_channels[i].period);
 			setChannelVolume(i,_channels[i].volume);
-			
 			if ( (_channels[i].sampleOn) && (_channels[i].updateOn) ) {
 				printf("SAMPLE ON:: Channel # %02x \n", i);
 				printf("SAMPLE OFFSET:: %02x \n", _channels[i].sampleOffset);
 				printf("SAMPLE LENGTH:: %02x \n", _channels[i].sampleLength);
 				printf("SAMPLE VOLUME:: %02x \n", _channels[i].volume);
 				printf("SAMPLE PERIOD:: %02x \n", _channels[i].period);
-				printf("SAMPLE PERIOD NUMBER:: %02x \n", _tracks[0].activeMacro.noteNumber & 0x3F);
-				//setChannelData(i, _sampleData + _channels[i].sampleOffset, 0, _channels[i].sampleLength, 0);
+				printf("SAMPLE PERIOD NUMBER:: %02x \n", _tracks[0].activeMacro.noteNumber);
 				setChannelData(i, _sampleData + _channels[i].sampleOffset, _sampleData + _channels[i].sampleOffset, _channels[i].sampleLength, _channels[i].sampleLength);
 				_channels[i].updateOn = false;
 			}	
 		}
-
-		//if (!_tracks[0].patternOn) {
-		//	stopPaula();
-		//}
-	}//end pattern test
+	}
 }
-void Tfmx::testPattern(uint8 patternNumber) {
-	_patternTest = true;
-	loadPattern(0, patternNumber); //load the pattern into track[0]
-	_tracks[0].patternOn = true;
-	startPaula();
-}
 void Tfmx::doEffects(uint8 channelNumber) {
 	//Envelope Effect
 	if (_channels[channelNumber].envelopeOn) {
@@ -804,15 +738,39 @@
 		}
 		_channels[channelNumber].vibratoCount++;
 	}
-	//Period Effects
+
+	//TODO:: Period Effects
 }
 
+void Tfmx::testMacro(uint8 macroNumber) {
+	//Loads the desired macro on Track 0, Channel 0 for testing at Middle C (0x1E)
+	if (loadSong(0)) {
+		_macroTest = true;
+		loadMacro(0, macroNumber);
+		_tracks[0].macroOn = true; 
+		_tracks[0].activeMacro.noteNumber = 0x1E;  
+		_tracks[0].activeMacro.noteVelocity = 0x0F;
+		_tracks[0].activeMacro.noteChannel = 0;
+		_tracks[0].activeMacro.noteWait = 0; 
+		_tracks[0].activeMacro.notePeriod = periods[(_tracks[0].activeMacro.noteNumber & 0x3F)];
+		startPaula();
+	}
+}
+void Tfmx::testPattern(uint8 patternNumber) {
+	//Loads the desired macro on Track 0, Channel 0 for testing
+		if (loadSong(0)) {
+		_patternTest = true;
+		loadPattern(0, patternNumber); 
+		_tracks[0].patternOn = true;
+		startPaula();
+	}
+}
 void Tfmx::setTempo() {
-	//Safe to ignore for now
+//TODO:: Add setTempo trackstep command. Not used in Monkey Island.
 }
 void Tfmx::volumeSlide() {
-	//Safe to ignore for now
+//TODO:: Add master volumeSlide trackstep command. Not used in Monkey Island.
 }
 
-} // End of namespace Audio
+} //End of namespace Audio
 

Modified: scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.h
===================================================================
--- scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.h	2008-08-18 20:04:15 UTC (rev 34006)
+++ scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.h	2008-08-18 20:15:40 UTC (rev 34007)
@@ -34,7 +34,6 @@
 
 class Tfmx : public Paula {
 public:
-		//TODO:: Ctor + Dtor might need some repair/cleanup
 		Tfmx(bool stereo = false, int rate = 44100, int interruptFreq = 0);
 		~Tfmx();
 	
@@ -43,94 +42,89 @@
 		void load();
 		void loadSamples();
 
-		//After the TFMX file is loaded, you chose which song to playback.
-		//The song will end automatically or when you call stop().
+		//After loading the data file and the sample file, you chose which song to playback.
+		//The playback will terminate automatically or when you call stop().
 		void playSong(uint8 songNumber);
 		void stop();
 		
-		//DEBUGGING FUNCTION:: Temporary function to test individual macros for playback
+		//DEBUGGING FUNCTIONS:: Function to test individual macros/patterns for playback.
 		void testMacro(uint8 macroNumber);
 		void testPattern(uint8 patternNumber);
-		bool loadSong(uint8 songNumber); //temporarly public
+		
 protected:
 		//DEBUGGING::
 		bool _macroTest;
 		bool _patternTest;
 	
-		//uint8 stream for whole MDAT file
+		//UINT8 Stream for data file.
 		uint8 *_data;      
 		uint32 _dataSize; 
 
-		//uint8 stream for whole SMPL file
+		//UINT8 Stream for sample file.
 		int8 *_sampleData;
 		uint32 _sampleSize;
 
-		//addresses of tables in MDAT file
+		//Addresses of tables in the data file.
 		uint32 _trackTableOffset;
 		uint32 _patternTableOffset;
 		uint32 _macroTableOffset;
 
-		//addresses of patterns and macros from MDAT file
+		//Pointers to the patterns and macros in the data file.
 		uint32 _patternPointers[128];
 		uint32 _macroPointers[128];  
 
-		//uint16 stream for current song trackstep
+		//Current song trackstep steam and flags.
 		uint16 *_trackData;
 		uint32 _trackCount;
 		uint32 _trackLength;
+		uint16 _tempo; 
 		bool _trackAdvance;
 		bool _trackEnd;
-		uint16 _tempo; //current value for tempo
 		
-		//note table
+		//UINT16 Period Table
 		static const uint16 periods[]; 
 
-		//Song structure
+		//Addresses of maximum 32 possible song stored in data file.
 		struct Song {
 			uint16 startPosition;
 			uint16 endPosition;
 			uint16 tempoValue;
 		}_songs[32];
 		
-		//Pattern structure
-		struct Pattern {
-			uint32 *data;
-			uint32 patternCount;
-			uint32 patternLength;
-			uint8 patternWait;
-			uint8 patternTranspose;
-			bool newPattern;
-		//	bool patternEnd;
-		//	uint16 offset;
-		//	uint8 saveNumber1;
-		//	uint8 saveNumber2;
-		//	bool jumpFlag;
-		//	bool returnFlag;
-		//	bool loopFlag;
-		//	uint16 loopCount;
-		};
-
-		//Macro structure
+		//Macro structure, one active macro.
 		struct Macro {
 			uint32 *data;
 			uint32 macroCount;
 			uint32 macroLength;
-			uint16 macroWait; //internal wait
-			//external note stuff here
+			uint16 macroWait; //Internal wait specified by the macro.
 			uint8 noteNumber;
 			uint16 notePeriod;
 			uint8 noteVelocity;
 			uint8 noteChannel;
 			uint8 noteType;
-			uint8 noteWait;  //external wait
+			uint8 noteWait; //External wait specified by the pattern. 
 			int8 noteFineTune;
 			float fineTune;
+			//The members below are used for key-up looping.
 			bool keyWaitOn;
 			int8 keyCount;
 			int8 keyWait;
+			uint32 positionLoaded; //Pattern count where the macro was loaded.
 		};
 
-		//Track structure
+		//Pattern structure, one active pattern.
+		struct Pattern {
+			uint32 *data;
+			uint32 patternCount;
+			uint32 patternLength;
+			uint8 patternWait;
+			uint8 patternTranspose;
+			bool newPattern;
+		//TODO:: Add members for pattern jumping/go to commands (not currently used in Monkey Island).
+		//TODO:: Add members for pattern effects (not currently used in Monkey Island).
+		};
+
+		//Track structure, 8 tracks.
 		struct Track {
 			uint16 data;
 			bool trackOn;
@@ -140,19 +134,15 @@
 			uint8 macroNumber;
 			Pattern activePattern;
 			Macro activeMacro;
-		//	uint16 volume;
-		//	bool loopFlag;
-		//	uint16 loopCount;
+		//TODO:: Add members for other trackstep commands (not currently used in Monkey Island).
 		}_tracks[8];
-		
-		//Channel structure
+
+		//Channel structure, 4 channels used
 		struct Channel {
 			uint16 period;
 			int8 volume;
 			uint32 sampleOffset;
 			uint32 sampleLength;
-			//int8 *dataRepeat;
-			//uint32 lengthRepeat;
 			bool sampleOn;
 			bool updateOn;
 			bool keyUp;
@@ -170,19 +160,21 @@
 			uint8 vibratoCount;
 		}_channels[4];
 
-		//PAULA Interrupt override
+		//PAULA Interrupt override.
 		virtual void interrupt(void);
-
-		//bool loadSong(uint8 songNumber);
-		void updateTrackstep();
+        
+		//Loading functions.
+		bool loadSong(uint8 songNumber); 
 		void loadPattern(uint8 trackNumber, uint8 patternNumber);
-		void updatePattern(uint8 trackNumber);
 		void loadMacro(uint8 trackNumber, uint8 macroNumber);
+		
+		//Update cycle functions.
+		void updateTrackstep();
+		void updatePattern(uint8 trackNumber);
 		void doMacro(uint8 trackNumber);
 		void doEffects(uint8 channelNumber);
-		void runMacro(uint8 trackNumber);
 		
-		//Trackstep functions
+		//Trackstep commands.
 		void setTempo();
 		void volumeSlide();
 


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