[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