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

marwanhilmi at users.sourceforge.net marwanhilmi at users.sourceforge.net
Fri Aug 15 21:15:49 CEST 2008


Revision: 33912
          http://scummvm.svn.sourceforge.net/scummvm/?rev=33912&view=rev
Author:   marwanhilmi
Date:     2008-08-15 19:15:48 +0000 (Fri, 15 Aug 2008)

Log Message:
-----------
Added doEffects command with support for envelope and vibrato effects and macros.
Added function to test patterns for individual playback. 
Adding key-up macro for looping of certain notes.
Don't mind all the printfs!

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-15 19:10:37 UTC (rev 33911)
+++ scummvm/branches/gsoc2008-tfmx/base/main.cpp	2008-08-15 19:15:48 UTC (rev 33912)
@@ -298,10 +298,19 @@
 	_aTfmx.loadSamples();
 	_aTfmx.playSong(0);
 	
+	/*
+	if (_aTfmx.loadSong(0)) {
+		_aTfmx.testPattern(0x0C);
+	}
+	//*/
+		
 	//if (_aTfmx.loadSong(0)) {
-	//	_aTfmx.testMacro(23);
+	//	_aTfmx.testMacro(0x17);
 	//}
+	
+	
 
+
 	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-15 19:10:37 UTC (rev 33911)
+++ scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.cpp	2008-08-15 19:15:48 UTC (rev 33912)
@@ -62,7 +62,7 @@
 	//FIXME:: temporary loader - just creates seekablereadstream from c:\mk.smpl
 	Common::SeekableReadStream *stream = NULL;
 	Common::File myfile;
-	myfile.addDefaultDirectory("~/tfmx");
+	myfile.addDefaultDirectory("C:");
 	myfile.open("mk.smpl");
 	stream = myfile.readStream(myfile.size());
 	myfile.close();
@@ -78,7 +78,7 @@
 	//FIXME:: temporary loader - just creates seekablereadstream from c:\mk.mdat
 	Common::SeekableReadStream *stream = NULL;
 	Common::File myfile;
-	myfile.addDefaultDirectory("~/tfmx");
+	myfile.addDefaultDirectory("C:");
 	myfile.open("mk.mdat");
 	stream = myfile.readStream(myfile.size());
 	myfile.close();
@@ -153,12 +153,13 @@
 		_trackData[i] = trackSubStream.readUint16BE();
 	}
 
+	_trackAdvance = true;
+	_trackEnd = false;
+	_macroTest = false;
+	_patternTest = false;
+
 	//INITIALIZE TRACKS
 	for (int track = 0; track < 8; track++) { 
-		_trackAdvance = true;
-		_trackEnd = false;
-		_macroTest = false;
-
 		//initialize Track objects
 		_tracks[track].data = 0;
 		_tracks[track].trackOn = true;
@@ -186,6 +187,9 @@
 		_tracks[track].activeMacro.noteType = 0;
 		_tracks[track].activeMacro.noteWait = 0;
 		_tracks[track].activeMacro.fineTune = 0;
+		_tracks[track].activeMacro.keyUp = false;
+		_tracks[track].activeMacro.keyCount = 0;
+		_tracks[track].activeMacro.keyWait = 0;
 	}
 
 	//INITIALIZE CHANNELS
@@ -194,7 +198,18 @@
 		_channels[channel].volume = 0;
 		_channels[channel].sampleOffset = 0;
 		_channels[channel].sampleLength = 0;
-	    _channels[channel].sampleOn = 0;
+	    _channels[channel].sampleOn = false;
+		_channels[channel].updateOn = false;
+		_channels[channel].envelopeOn = false;
+		_channels[channel].envelopeTarget = 0;
+		_channels[channel].envelopeRate = 0;
+		_channels[channel].envelopeCount = 0;
+		_channels[channel].envelopeSpeed = 0;
+		_channels[channel].vibratoOn = false;
+		_channels[channel].vibratoDirection = false;
+		_channels[channel].vibratoRate = 0;
+		_channels[channel].vibratoSpeed = 0;
+		_channels[channel].vibratoCount = 0;
 	}
 
 	//SET INTERRUPT FREQUENCY
@@ -205,7 +220,7 @@
 	setInterruptFreq( (int)( getRate() / (1 / _tempo * 24)));
 	}
 
-	setInterruptFreq( (int)( getRate() / 10) );
+	setInterruptFreq( (int)( getRate() / 80) );
 	return true;
 }
 void Tfmx::updateTrackstep() {
@@ -296,7 +311,7 @@
 }
 void Tfmx::updatePattern(uint8 trackNumber) {
 	if (_tracks[trackNumber].activePattern.patternWait != 0) {
-		//debugN(1, "patternwait %02x", _tracks[trackNumber].activePattern.patternWait);
+		//printf("PATTERN WAIT:: %02x \n", _tracks[trackNumber].activePattern.patternWait);
 		_tracks[trackNumber].activePattern.patternWait--;
 		return;
 	}
@@ -307,7 +322,7 @@
 	uint8 byte4 = ( *(_tracks[trackNumber].activePattern.data) & 0x000000FF );
 	uint16 bytes34 = ( *(_tracks[trackNumber].activePattern.data) & 0x0000FFFF );
 
-	debugN(1, "%02x:%02x:%02x:%02x",byte1,byte2,byte3,byte4);
+//	printf("PATTERN COMMAND:: %02x \n", byte1);
 
 	if (byte1 >= 0xF0) {
 		switch (byte1) {
@@ -379,7 +394,7 @@
 	} 
 	
 	else { 
-	//	if (!_tracks[trackNumber].macroOn) {
+		if (!_tracks[trackNumber].macroOn) {
 			_tracks[trackNumber].macroNumber = byte2;
 			loadMacro( trackNumber, (_tracks[trackNumber].macroNumber) );
 			if (byte1 < 0x80) {
@@ -398,46 +413,33 @@
 			_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];
-
-		if (_tracks[trackNumber].activeMacro.noteType == 2) {
-			_tracks[trackNumber].activePattern.patternWait += _tracks[trackNumber].activeMacro.noteWait;
 		}
-	//	}
-	}//END ELSE
 
-	//	else {
-//		printf("macroon %d\n", _tracks[trackNumber].macroOn);
-/*		if (_tracks[trackNumber].macroOn) {
+		else {
 			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--;
-		}*/
-//		printf("macrowait %d", _tracks[trackNumber].activeMacro.macroWait);
+		}
+	}//END ELSE
 
 	//ADVANCE PATTERN COUNT, INCREASE COUNT
 	//IF MACRO IS ON, WAIT TO ADVANCE
-//	if (!_tracks[trackNumber].macroOn) {
+	if (!_tracks[trackNumber].macroOn) {
 		_tracks[trackNumber].activePattern.data++;
 		_tracks[trackNumber].activePattern.patternCount++;
-//	}
+		if (_tracks[trackNumber].activeMacro.noteType == 2) {
+			_tracks[trackNumber].activePattern.patternWait += _tracks[trackNumber].activeMacro.noteWait;
+		}
+	}
 	//IF THE END IS REACHED, TURN PATTERN OFF
 	if (_tracks[trackNumber].activePattern.patternCount == _tracks[trackNumber].activePattern.patternLength) {
 		_tracks[trackNumber].patternOn = false;
 	}
 }
-void Tfmx::runMacro(uint8 trackNumber) {
-		if (_tracks[trackNumber].macroOn) {
-			while (_tracks[trackNumber].activeMacro.macroWait == 0 && (_tracks[trackNumber].macroOn == true) ) {
-				doMacro(trackNumber);
-			}
-		}
-		if (_tracks[trackNumber].activeMacro.macroWait != 0) {
-		_tracks[trackNumber].activeMacro.macroWait--;
-		}
-}
 void Tfmx::loadMacro(uint8 trackNumber, uint8 macroNumber){
 	uint32 startPosition;
 	uint32 endPosition;
@@ -459,8 +461,8 @@
 		_tracks[trackNumber].activeMacro.data[i] = macroSubStream.readUint32BE();
 	}
 
-	debug(3, "MACRO NUMBER:: %02x \n", macroNumber);
-	debug(3, "MACRO LENGTH:: %02x \n", numCommands);
+	printf("MACRO NUMBER:: %02x \n", macroNumber);
+	printf("MACRO LENGTH:: %02x \n", numCommands);
 }
 void Tfmx::doMacro(uint8 trackNumber) {
 	uint8 byte1 = ( *(_tracks[trackNumber].activeMacro.data) ) >> 24;
@@ -471,33 +473,33 @@
 	uint8 currentChannel = _tracks[trackNumber].activeMacro.noteChannel;
 	uint16 tunedPeriod = 0;
 	
-//	debug(2,"COUNT:: %02x ::::", _tracks[trackNumber].activeMacro.macroCount);
-	debug(2,"channel[%d]: %02x:%02x:%02x:%02x \n", trackNumber, byte1,byte2,byte3,byte4);
+	printf("MACRO COUNT:: %02x ::::", _tracks[trackNumber].activeMacro.macroCount);
+	printf("MACRO COMMAND:: %02x \n", byte1);
 
 	switch (byte1) {
 	case 0x00: //DMAoff reset + CLEARS EFFECTS
-		debug(2, "DMAoff + reset");
-		_channels[currentChannel].sampleOn = 0;
+		_channels[currentChannel].sampleOn = false;
+		//_channels[currentChannel].updateOn = true;
 		_channels[currentChannel].sampleOffset = 0;
 		_channels[currentChannel].sampleLength = 0;
-		_tracks[trackNumber].activeMacro.macroWait = 1;
+		_channels[currentChannel].envelopeOn = false;
+		_channels[currentChannel].vibratoOn = false;
 		break;
 	case 0x01:
-		debug(2, "DMAon");
-		_channels[currentChannel].sampleOn = 1;
+		_channels[currentChannel].sampleOn = true;
+		_channels[currentChannel].updateOn = true;
 		//_tracks[trackNumber].activeMacro.macroWait = 1;
 		break;
 	case 0x02: //set sample offset
-		debug(2, "Setbegin");
 		_channels[currentChannel].sampleOffset = *(_tracks[trackNumber].activeMacro.data) & 0x00FFFFFF;
+		_channels[currentChannel].updateOn = true;
 		break;
 	case 0x03: //set sample length
-		debug(2, "Setlen");
 		//_channels[currentChannel].sampleLength = ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF ) * 2;
 		_channels[currentChannel].sampleLength = ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF );
+		_channels[currentChannel].updateOn = true;
 		break;
 	case 0x04: //wait
-		debug(2, "wait");
 		if ( (*(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF) == 0 ) {
 			_tracks[trackNumber].activeMacro.macroWait = 1;
 		}
@@ -506,11 +508,11 @@
 		}
 		break;
 	case 0x07:
-		//_channels[currentChannel].sampleOn = 0; 
+		_channels[currentChannel].sampleOn = false; 
 		_tracks[trackNumber].macroOn = false;
 		break;
 	case 0x13: //DMA OFF BUT DOESNT CLEAR EFFECTS
-		_channels[currentChannel].sampleOn = 0;
+		_channels[currentChannel].sampleOn = false;
 		break;
 	case 0x0D: //add volume to channel;.
 		if (byte3 != 0xFE) {
@@ -526,23 +528,20 @@
 			_channels[currentChannel].volume = byte2;
 		}
 		break;
-	case 0x0F:
-		debug(2,"Envelope not implemented");
-		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;
 		break;
 	case 0x18: //sampleloop
 		//_channels[currentChannel].sampleOffset += ( *(_tracks[trackNumber].activeMacro.data) & 0x00FFFFFF );
 		//_channels[currentChannel].sampleLength -= ( *(_tracks[trackNumber].activeMacro.data) & 0x00FFFFFF );
 		_channels[currentChannel].sampleOffset += ( ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF ) & 0xFFFE );
 		_channels[currentChannel].sampleLength -= ( ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF ) >> 1);
-		_channels[currentChannel].sampleOn = 1;
+		//_channels[currentChannel].updateOn = true;
 		break;
 	case 0x08: //add note
-		debug(2, "addnote");
 		tunedPeriod = (periods[(byte2 + _tracks[trackNumber].activeMacro.noteNumber) & (0x3F)]);
 		_tracks[trackNumber].activeMacro.fineTune = sbyte3 / 0x100;
 		_tracks[trackNumber].activeMacro.fineTune += (_tracks[trackNumber].activeMacro.noteFineTune / 0x100);
@@ -562,6 +561,31 @@
 		_tracks[trackNumber].activeMacro.notePeriod = ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF );
 		_tracks[trackNumber].activeMacro.macroWait = 1;
 		break;
+	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
+		_channels[currentChannel].vibratoOn = true;
+		_channels[currentChannel].vibratoRate = byte4;
+		_channels[currentChannel].vibratoSpeed = byte2 * 2;
+		_channels[currentChannel].vibratoCount = 0;
+		break;
+	case 0x14://wait for key-up
+		//_tracks[trackNumber].activeMacro.keyWait = byte4;
+		//_tracks[trackNumber].activeMacro.keyCount++;
+		/*
+		if (!_tracks[trackNumber].activeMacro.keyUp) {
+			_tracks[trackNumber].activeMacro.data--;
+			_tracks[trackNumber].activeMacro.macroCount--;
+			_channels[currentChannel].updateOn = true;
+			_tracks[trackNumber].activeMacro.macroWait = 1;
+		}
+		*/
+		break;
 	default:
 		break;
 	}//end switch
@@ -576,7 +600,7 @@
 
 	if (_tracks[trackNumber].activeMacro.macroCount == _tracks[trackNumber].activeMacro.macroLength) {
 		_tracks[trackNumber].macroOn = false;
-		_channels[currentChannel].sampleOn = 0;
+		//_channels[currentChannel].sampleOn = false;
 	}
 }
 void Tfmx::testMacro(uint8 macroNumber) {
@@ -587,7 +611,7 @@
 	_tracks[0].activeMacro.noteVelocity = 0x0F;
 	_tracks[0].activeMacro.noteChannel = 0;
 	_tracks[0].activeMacro.noteWait = 0; 
-	_tracks[0].activeMacro.notePeriod = periods[0x1E];
+	_tracks[0].activeMacro.notePeriod = periods[(_tracks[0].activeMacro.noteNumber & 0x3F)];
 	startPaula();
 }
 void Tfmx::interrupt(void) {
@@ -595,7 +619,7 @@
 	count++;
 	//printf("INTERRUPT COUNT:: %02x \n", count);
 	
-	if (!_macroTest) { //Would be the normal case unless macro testing is on.
+	if (!_macroTest && !_patternTest) { //Would be the normal case unless macro testing is on.
 
 		if (_trackAdvance) {
 			updateTrackstep();
@@ -604,28 +628,25 @@
 		//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++) {
-			debugN(1, "\n%d(%02x j): ",track,count);
 			if (_tracks[track].patternOn && _tracks[track].trackOn) {
 					updatePattern(track);
 			}
-			runMacro(track);
 		}
 
-		for (int i = 0; i < 4; i++)
-		{
+		for (int i = 1; i < 4; i++) {
+			doEffects(i);
 			setChannelPeriod(i,_channels[i].period);
 			setChannelVolume(i,_channels[i].volume);
-			if (_channels[i].sampleOn == 1) {
-				_channels[i].sampleOn = 2;
-				debugN(2,"SAMPLE ON channel %d ",i);
-				debugN(2,"SAMPLE OFFSET:: %02x ", _channels[i].sampleOffset);
-				debugN(2,"SAMPLE LENGTH:: %02x ", _channels[i].sampleLength);
-				debugN(2,"SAMPLE VOLUME:: %02x ", _channels[i].volume);
-				debug(2,"SAMPLE PERIOD:: %02x ", _channels[i].period);
-				setChannelData(i, _sampleData + _channels[i].sampleOffset, 0, _channels[i].sampleLength, 0);
-			} else if (_channels[i].sampleOn == 0) {
-			// kill the channel here
-			}
+			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
@@ -641,27 +662,119 @@
 
 	}//IF MACRO TEST = FALSE
 
-	else { //MACRO TEST IS ON
+	else if (_macroTest) { //MACRO TEST IS ON
 		while (_tracks[0].activeMacro.macroWait == 0 && (_tracks[0].macroOn == true) ) {
 				doMacro(0);
 		}
+		doEffects(0);
 		setChannelPeriod(0,_channels[0].period);
 		setChannelVolume(0,_channels[0].volume);
-		if (_channels[0].sampleOn == true) {
-			printf("SAMPLE ON \n");
-			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);
-			setChannelData(0, _sampleData + _channels[0].sampleOffset, 0, _channels[0].sampleLength, 0);
-			//setChannelData(0, _sampleData + _channels[0].sampleOffset, _sampleData + _channels[0].sampleOffset, _channels[0].sampleLength, _channels[0].sampleLength);
-		}	
+				if ( (_channels[0].sampleOn) && (_channels[0].updateOn) ) {
+				printf("SAMPLE ON:: Channel #0 \n");
+				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);
+				setChannelData(0, _sampleData + _channels[0].sampleOffset, _sampleData + _channels[0].sampleOffset, _channels[0].sampleLength, _channels[0].sampleLength);
+				_channels[0].updateOn = false;
+		}		
 
 		if (_tracks[0].activeMacro.macroWait != 0) {
 		_tracks[0].activeMacro.macroWait--;
 		}
 	}
+
+	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);
+				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) {
+		//Tick at the begining or the end?
+		//_channels[channelNumber].envelopeCount++;
+		if(_channels[channelNumber].envelopeCount == _channels[channelNumber].envelopeSpeed) {
+			
+			//Subtract Volume, target volume is lower
+			if (_channels[channelNumber].volume > _channels[channelNumber].envelopeTarget) {
+				_channels[channelNumber].volume -= _channels[channelNumber].envelopeRate;
+				//Fix if you pass target volume
+				if (_channels[channelNumber].volume < _channels[channelNumber].envelopeTarget) {
+					_channels[channelNumber].volume = _channels[channelNumber].envelopeTarget;
+				}
+			}
+			//Add Volume, target volume is higher
+			if (_channels[channelNumber].volume < _channels[channelNumber].envelopeTarget) {
+				_channels[channelNumber].volume += _channels[channelNumber].envelopeRate;
+				//Fix if you pass target volume
+				if (_channels[channelNumber].volume > _channels[channelNumber].envelopeTarget) {
+					_channels[channelNumber].volume = _channels[channelNumber].envelopeTarget;
+				}
+			}
+			//Reset count.
+			_channels[channelNumber].envelopeCount = 0;
+		}
+		//Tick at the begining or the end?
+		_channels[channelNumber].envelopeCount++;
+
+		if (_channels[channelNumber].volume == _channels[channelNumber].envelopeTarget) {
+			_channels[channelNumber].envelopeOn = false;
+		}
+	}
+	//Vibrato Effect
+	if (_channels[channelNumber].vibratoOn) {
+		
+		if (_channels[channelNumber].vibratoCount == _channels[channelNumber].vibratoSpeed) {
+			//vibrato up
+			if (_channels[channelNumber].vibratoDirection) { //true = up
+			_channels[channelNumber].period += _channels[channelNumber].vibratoRate;
+			}
+			//vibrato down
+			if (!_channels[channelNumber].vibratoDirection) { //false = down
+			_channels[channelNumber].period += _channels[channelNumber].vibratoRate;
+			}
+			//reset count
+			_channels[channelNumber].vibratoCount = 0;
+		}
+		_channels[channelNumber].vibratoCount++;
+	}
+	//Period Effects
+}
+
 void Tfmx::setTempo() {
 	//Safe to ignore for now
 }

Modified: scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.h
===================================================================
--- scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.h	2008-08-15 19:10:37 UTC (rev 33911)
+++ scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.h	2008-08-15 19:15:48 UTC (rev 33912)
@@ -50,10 +50,12 @@
 		
 		//DEBUGGING FUNCTION:: Temporary function to test individual macros 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 *_data;      
@@ -123,6 +125,9 @@
 			uint8 noteWait;  //external wait
 			int8 noteFineTune;
 			float fineTune;
+			bool keyUp;
+			uint8 keyCount;
+			uint8 keyWait;
 		};
 
 		//Track structure
@@ -148,7 +153,20 @@
 			uint32 sampleLength;
 			//int8 *dataRepeat;
 			//uint32 lengthRepeat;
-			int sampleOn;
+			bool sampleOn;
+			bool updateOn;
+			//Envelope Effect
+			bool envelopeOn;
+			int8 envelopeTarget;
+			uint8 envelopeRate;
+			uint8 envelopeSpeed;
+			uint8 envelopeCount;
+			//Vibrato Effect
+			bool vibratoOn;
+			bool vibratoDirection;
+			int8 vibratoRate;
+			uint8 vibratoSpeed;
+			uint8 vibratoCount;
 		}_channels[4];
 
 		//PAULA Interrupt override
@@ -160,6 +178,7 @@
 		void updatePattern(uint8 trackNumber);
 		void loadMacro(uint8 trackNumber, uint8 macroNumber);
 		void doMacro(uint8 trackNumber);
+		void doEffects(uint8 channelNumber);
 		void runMacro(uint8 trackNumber);
 		
 		//Trackstep functions


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