//------------------------------------------------// level with pre-calcs\r
case 8:\r
{\r
- const unsigned long lval=val;unsigned long lx;\r
+ const unsigned long lval=val;\r
//---------------------------------------------//\r
s_chan[ch].ADSRX.AttackModeExp=(lval&0x8000)?1:0; \r
s_chan[ch].ADSRX.AttackRate=(lval>>8) & 0x007f;\r
s_chan[ch].ADSRX.DecayRate=(lval>>4) & 0x000f;\r
s_chan[ch].ADSRX.SustainLevel=lval & 0x000f;\r
//---------------------------------------------//\r
+#if 0\r
if(!iDebugMode) break;\r
//---------------------------------------------// stuff below is only for debug mode\r
\r
}\r
s_chan[ch].ADSR.DecayTime = // so calc how long does it take to run from 100% to the wanted sus level\r
(lx*(1024-s_chan[ch].ADSR.SustainLevel))/1024;\r
+#endif\r
}\r
break;\r
//------------------------------------------------// adsr times with pre-calcs\r
case 10:\r
{\r
- const unsigned long lval=val;unsigned long lx;\r
+ const unsigned long lval=val;\r
\r
//----------------------------------------------//\r
s_chan[ch].ADSRX.SustainModeExp = (lval&0x8000)?1:0;\r
s_chan[ch].ADSRX.ReleaseModeExp = (lval&0x0020)?1:0;\r
s_chan[ch].ADSRX.ReleaseRate = lval & 0x001f;\r
//----------------------------------------------//\r
+#if 0\r
if(!iDebugMode) break;\r
//----------------------------------------------// stuff below is only for debug mode\r
\r
if(lval & 0x4000) // add/dec flag\r
s_chan[ch].ADSR.SustainModeDec=-1;\r
else s_chan[ch].ADSR.SustainModeDec=1;\r
+#endif\r
}\r
break;\r
//------------------------------------------------// adsr volume... mmm have to investigate this\r
case 12: // get adsr vol\r
{\r
const int ch=(r>>4)-0xc0;\r
- if(s_chan[ch].bNew) return 1; // we are started, but not processed? return 1\r
- if(s_chan[ch].ADSRX.lVolume && // same here... we haven't decoded one sample yet, so no envelope yet. return 1 as well\r
- !s_chan[ch].ADSRX.EnvelopeVol) \r
+ if(dwNewChannel&(1<<ch)) return 1; // we are started, but not processed? return 1\r
+ if((dwChannelOn&(1<<ch)) && // same here... we haven't decoded one sample yet, so no envelope yet. return 1 as well\r
+ !s_chan[ch].ADSRX.EnvelopeVol)\r
return 1;\r
return (unsigned short)(s_chan[ch].ADSRX.EnvelopeVol>>16);\r
}\r
if((val&1) && s_chan[ch].pStart) // mmm... start has to be set before key on !?!\r
{\r
s_chan[ch].bIgnoreLoop=0;\r
- s_chan[ch].bNew=1;\r
\r
// do this here, not in StartSound\r
// - fixes fussy timing issues\r
s_chan[ch].bStop=0;\r
- s_chan[ch].bOn=1;\r
s_chan[ch].pCurr=s_chan[ch].pStart;\r
\r
dwNewChannel|=(1<<ch); // bitfield for faster testing\r
+ dwChannelOn|=1<<ch;\r
}\r
}\r
}\r
\r
// Jungle Book - Rhythm 'n Groove\r
// - turns off buzzing sound (loop hangs)\r
- s_chan[ch].bNew=0;\r
dwNewChannel &= ~(1<<ch);\r
} \r
}\r
\r
for(ch=start;ch<end;ch++,val>>=1) // loop channels\r
{\r
- if(val&1) // -> noise on/off\r
- {\r
- s_chan[ch].bNoise=1;\r
- }\r
- else \r
- {\r
- s_chan[ch].bNoise=0;\r
- }\r
+ s_chan[ch].bNoise=val&1; // -> noise on/off\r
}\r
}\r
\r
\r
void SetVolumeL(unsigned char ch,short vol) // LEFT VOLUME\r
{\r
- s_chan[ch].iLeftVolRaw=vol;\r
-\r
if(vol&0x8000) // sweep?\r
{\r
short sInc=1; // -> sweep up?\r
\r
void SetVolumeR(unsigned char ch,short vol) // RIGHT VOLUME\r
{\r
- s_chan[ch].iRightVolRaw=vol;\r
-\r
if(vol&0x8000) // comments... see above :)\r
{\r
short sInc=1;\r
\r
for(ch=start;ch<end;ch++,val>>=1) // loop channels\r
{\r
- if(val&1) // -> reverb on/off\r
- {\r
- s_chan[ch].bReverb=1;\r
- }\r
- else \r
- {\r
- s_chan[ch].bReverb=0;\r
- }\r
+ s_chan[ch].bReverb=val&1; // -> reverb on/off\r
}\r
}\r