[Scummvm-cvs-logs] SF.net SVN: scummvm:[33834] scummvm/branches/gsoc2008-tfmx
marwanhilmi at users.sourceforge.net
marwanhilmi at users.sourceforge.net
Wed Aug 13 19:49:33 CEST 2008
Revision: 33834
http://scummvm.svn.sourceforge.net/scummvm/?rev=33834&view=rev
Author: marwanhilmi
Date: 2008-08-13 17:49:31 +0000 (Wed, 13 Aug 2008)
Log Message:
-----------
Added support for more macros. Some more changes to timing/update system.
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-13 17:46:00 UTC (rev 33833)
+++ scummvm/branches/gsoc2008-tfmx/base/main.cpp 2008-08-13 17:49:31 UTC (rev 33834)
@@ -296,11 +296,14 @@
Audio::Tfmx _aTfmx;
_aTfmx.load();
_aTfmx.loadSamples();
- //_aTfmx.playSong(0);
- //_aTfmx.testMacro(9);
+ _aTfmx.playSong(0);
+
+ //if (_aTfmx.loadSong(0)) {
+ // _aTfmx.testMacro(12);
+ //}
system.getMixer()->playInputStream( Audio::Mixer::kMusicSoundType, &_handle, &_aTfmx, -1, 255, 0, false);
- system.delayMillis( 99 );
+ 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-13 17:46:00 UTC (rev 33833)
+++ scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.cpp 2008-08-13 17:49:31 UTC (rev 33834)
@@ -181,10 +181,11 @@
_tracks[track].activeMacro.macroWait = 0;
_tracks[track].activeMacro.noteNumber = 0;
_tracks[track].activeMacro.notePeriod = 0;
- _tracks[track].activeMacro.noteVolume = 0;
+ _tracks[track].activeMacro.noteVelocity = 0;
_tracks[track].activeMacro.noteChannel = 0;
_tracks[track].activeMacro.noteType = 0;
_tracks[track].activeMacro.noteWait = 0;
+ _tracks[track].activeMacro.fineTune = 0;
}
//INITIALIZE CHANNELS
@@ -204,7 +205,7 @@
setInterruptFreq( (int)( getRate() / (1 / _tempo * 24)));
}
- //setInterruptFreq( (int)( getRate() / 10) );
+ setInterruptFreq( (int)( getRate() / 10) );
return true;
}
void Tfmx::updateTrackstep() {
@@ -380,10 +381,10 @@
loadMacro( trackNumber, (_tracks[trackNumber].macroNumber) );
_tracks[trackNumber].macroOn = true; //set to false again when macro terminates
_tracks[trackNumber].activeMacro.noteNumber = byte1;
- _tracks[trackNumber].activeMacro.noteVolume = (byte3 & 0xF0) >> 4;
+ _tracks[trackNumber].activeMacro.noteVelocity = (byte3 & 0xF0) >> 4;
_tracks[trackNumber].activeMacro.noteChannel = (byte3 & 0x0F);
- _tracks[trackNumber].activeMacro.noteWait = byte4;
- _tracks[trackNumber].activeMacro.notePeriod = periods[_tracks[trackNumber].activeMacro.noteNumber & 0x3F];
+ // _tracks[trackNumber].activePattern.patternWait += byte4;
+ _tracks[trackNumber].activeMacro.notePeriod = periods[(_tracks[trackNumber].activeMacro.noteNumber + _tracks[trackNumber].activePattern.patternTranspose) & 0x3F];
}
else {
@@ -431,29 +432,26 @@
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 myChannel = _tracks[trackNumber].activeMacro.noteChannel;
-
+ uint8 currentChannel = _tracks[trackNumber].activeMacro.noteChannel;
+ uint16 currentPeriod = _tracks[trackNumber].activeMacro.notePeriod;
+ uint16 tunedPeriod = 0;
+
switch (byte1) {
case 0x00: //DMAoff reset + CLEARS EFFECTS
- _channels[myChannel].sampleOn = false;
- _channels[myChannel].sampleOffset = 0;
- _channels[myChannel].sampleLength = 0;
- break;
+ _channels[currentChannel].sampleOn = false;
+ _channels[currentChannel].sampleOffset = 0;
+ _channels[currentChannel].sampleLength = 0;
case 0x01:
- _channels[myChannel].sampleOn = true;
- /*
- setChannelPeriod(myChannel,_channels[myChannel].period);
- setChannelVolume(myChannel,_channels[myChannel].volume);
- setChannelData(myChannel, _sampleData + _channels[myChannel].sampleOffset, 0, _channels[myChannel].sampleLength, 0);
- */
+ _channels[currentChannel].sampleOn = true;
//_tracks[trackNumber].activeMacro.macroWait = 1;
break;
case 0x02: //set sample offset
- _channels[myChannel].sampleOffset = *(_tracks[trackNumber].activeMacro.data) & 0x00FFFFFF;
+ _channels[currentChannel].sampleOffset = *(_tracks[trackNumber].activeMacro.data) & 0x00FFFFFF;
break;
case 0x03: //set sample length
- _channels[myChannel].sampleLength = ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF ) * 2;
+ _channels[currentChannel].sampleLength = ( *(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF ) * 2;
break;
case 0x04: //wait
if ( (*(_tracks[trackNumber].activeMacro.data) & 0x0000FFFF) == 0 ) {
@@ -464,46 +462,64 @@
}
break;
case 0x07:
- _channels[myChannel].sampleOn = false;
+ _channels[currentChannel].sampleOn = false;
_tracks[trackNumber].macroOn = false;
break;
case 0x13: //DMA OFF BUT DOESNT CLEAR EFFECTS
- _channels[myChannel].sampleOn = false;
+ _channels[currentChannel].sampleOn = false;
break;
case 0x0D: //add volume to channel;.
- /*if (byte3 != 0xFE) {
- uint8 channelNumber = _tracks[trackNumber].pattern.note.channelNumber;
- _channels[channelNumber].volume = (_tracks[trackNumber].pattern.note.volume * 3) + byte4;
-
- if (_channels[channelNumber].volume > 0x40) {
- _channels[channelNumber].volume = 0x40;
+ if (byte3 != 0xFE) {
+ _channels[currentChannel].volume = (_tracks[trackNumber].activeMacro.noteVelocity * 3) + byte4;
+
+ if (_channels[currentChannel].volume > 0x40) {
+ _channels[currentChannel].volume = 0x40;
}
- break;
}
- */
break;
case 0x0E: //set volume
- /*if (byte3 != 0xFE) {
- uint8 channelNumber = _tracks[trackNumber].pattern.note.channelNumber;
- _channels[channelNumber].volume = byte4;
- break;
+ if (byte3 != 0xFE) {
+ _channels[currentChannel].volume = byte4;
}
- */
break;
+ case 0x19: //set one shot ? cut off?
+ _tracks[trackNumber].activeMacro.notePeriod = 0;
+ _channels[currentChannel].sampleOffset = 0;
+ _channels[currentChannel].sampleLength = 1;
+ break;
+ case 0x18: //sampleloop
+ _channels[currentChannel].sampleOffset += ( *(_tracks[trackNumber].activeMacro.data) & 0x00FFFFFF );
+ _channels[currentChannel].sampleLength -= ( *(_tracks[trackNumber].activeMacro.data) & 0x00FFFFFF );
+ break;
+ case 0x8: //add note
+ tunedPeriod = (periods[(byte2 + currentPeriod) & (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 0x9: //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;
default:
break;
}//end switch
- _channels[myChannel].period = _tracks[trackNumber].activeMacro.notePeriod;
- _channels[myChannel].volume = _tracks[trackNumber].activeMacro.noteVolume;
- _channels[myChannel].volume = 0x40;
-
+ _channels[currentChannel].period = _tracks[trackNumber].activeMacro.notePeriod;
+ //_channels[currentChannel].volume = _tracks[trackNumber].activeMacro.noteVolume;
+
_tracks[trackNumber].activeMacro.data++;
_tracks[trackNumber].activeMacro.macroCount++;
if (_tracks[trackNumber].activeMacro.macroCount == _tracks[trackNumber].activeMacro.macroLength) {
_tracks[trackNumber].macroOn = false;
- //_channels[myChannel].sampleOn = false;
+ //_channels[currentChannel].sampleOn = false;
}
}
void Tfmx::testMacro(uint8 macroNumber) {
@@ -511,10 +527,11 @@
loadMacro(0, macroNumber);
_tracks[0].macroOn = true; //set to false again when macro terminates
_tracks[0].activeMacro.noteNumber = 0x1E; //middle C
- _tracks[0].activeMacro.noteVolume = 0x0F;
+ _tracks[0].activeMacro.noteVelocity = 0x40;
_tracks[0].activeMacro.noteChannel = 0;
_tracks[0].activeMacro.noteWait = 0;
_tracks[0].activeMacro.notePeriod = periods[0x1E & 0x3F];
+ startPaula();
}
void Tfmx::interrupt(void) {
if (!_macroTest) { //Would be the normal case unless macro testing is on.
@@ -545,7 +562,7 @@
if (_tracks[track].patternOn) {
_trackAdvance = false;
break;
- }
+ }
else {
_trackAdvance = true;
}
@@ -555,8 +572,8 @@
else { //MACRO TEST IS ON
while (_tracks[0].activeMacro.macroWait == 0 && (_tracks[0].macroOn == true) ) {
- doMacro(0);
- }//END WHILE
+ doMacro(0);
+ }
setChannelPeriod(0,_channels[0].period);
setChannelVolume(0,_channels[0].volume);
if (_channels[0].sampleOn) {
Modified: scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.h
===================================================================
--- scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.h 2008-08-13 17:46:00 UTC (rev 33833)
+++ scummvm/branches/gsoc2008-tfmx/sound/mods/tfmx.h 2008-08-13 17:49:31 UTC (rev 33834)
@@ -50,7 +50,7 @@
//DEBUGGING FUNCTION:: Temporary function to test individual macros for playback
void testMacro(uint8 macroNumber);
-
+ bool loadSong(uint8 songNumber); //temporarly public
protected:
//DEBUGGING::
bool _macroTest;
@@ -116,11 +116,12 @@
uint16 macroWait; //internal wait
//external note stuff here
uint8 noteNumber;
- uint8 notePeriod;
- uint8 noteVolume;
+ uint16 notePeriod;
+ uint8 noteVelocity;
uint8 noteChannel;
uint8 noteType;
uint8 noteWait; //external wait
+ float fineTune;
};
//Track structure
@@ -150,7 +151,7 @@
//PAULA Interrupt override
virtual void interrupt(void);
- bool loadSong(uint8 songNumber);
+ //bool loadSong(uint8 songNumber);
void updateTrackstep();
void loadPattern(uint8 trackNumber, uint8 patternNumber);
void updatePattern(uint8 trackNumber);
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