SoundUnit: enough of bitfields
This commit is contained in:
parent
4874f2e7f3
commit
63d0eb46a9
|
@ -869,7 +869,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
|
||||||
sample->depth=DIV_SAMPLE_DEPTH_YMZ_ADPCM;
|
sample->depth=DIV_SAMPLE_DEPTH_YMZ_ADPCM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ds.version>=0x1a) {
|
if (ds.version>=0x1b) {
|
||||||
// what the hell man...
|
// what the hell man...
|
||||||
cutStart=reader.readI();
|
cutStart=reader.readI();
|
||||||
cutEnd=reader.readI();
|
cutEnd=reader.readI();
|
||||||
|
@ -903,7 +903,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) {
|
||||||
reader.read(data,length*2);
|
reader.read(data,length*2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ds.version>0x1a) {
|
if (ds.version>0x1b) {
|
||||||
if (cutStart!=0 || cutEnd!=length) {
|
if (cutStart!=0 || cutEnd!=length) {
|
||||||
// cut data
|
// cut data
|
||||||
short* newData=new short[cutEnd-cutStart];
|
short* newData=new short[cutEnd-cutStart];
|
||||||
|
|
|
@ -39,13 +39,13 @@
|
||||||
void SoundUnit::NextSample(short* l, short* r) {
|
void SoundUnit::NextSample(short* l, short* r) {
|
||||||
// run channels
|
// run channels
|
||||||
for (int i=0; i<8; i++) {
|
for (int i=0; i<8; i++) {
|
||||||
if (chan[i].vol==0 && !chan[i].flags1.swvol) {
|
if (chan[i].vol==0 && !(chan[i].flags1&32)) {
|
||||||
fns[i]=0;
|
fns[i]=0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (chan[i].flags0.pcm) {
|
if (chan[i].flags0&8) {
|
||||||
ns[i]=pcm[chan[i].pcmpos];
|
ns[i]=pcm[chan[i].pcmpos];
|
||||||
} else switch (chan[i].flags0.shape) {
|
} else switch (chan[i].flags0&7) {
|
||||||
case 0:
|
case 0:
|
||||||
ns[i]=(((cycle[i]>>15)&127)>chan[i].duty)*127;
|
ns[i]=(((cycle[i]>>15)&127)>chan[i].duty)*127;
|
||||||
break;
|
break;
|
||||||
|
@ -69,11 +69,13 @@ void SoundUnit::NextSample(short* l, short* r) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chan[i].flags0.ring) {
|
// ring mod
|
||||||
|
if (chan[i].flags0&16) {
|
||||||
ns[i]=(ns[i]*ns[(i+1)&7])>>7;
|
ns[i]=(ns[i]*ns[(i+1)&7])>>7;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chan[i].flags0.pcm) {
|
// PCM
|
||||||
|
if (chan[i].flags0&8) {
|
||||||
if (chan[i].freq>0x8000) {
|
if (chan[i].freq>0x8000) {
|
||||||
pcmdec[i]+=0x8000;
|
pcmdec[i]+=0x8000;
|
||||||
} else {
|
} else {
|
||||||
|
@ -84,18 +86,18 @@ void SoundUnit::NextSample(short* l, short* r) {
|
||||||
if (chan[i].pcmpos<chan[i].pcmbnd) {
|
if (chan[i].pcmpos<chan[i].pcmbnd) {
|
||||||
chan[i].pcmpos++;
|
chan[i].pcmpos++;
|
||||||
if (chan[i].pcmpos==chan[i].pcmbnd) {
|
if (chan[i].pcmpos==chan[i].pcmbnd) {
|
||||||
if (chan[i].flags1.pcmloop) {
|
if (chan[i].flags1&4) {
|
||||||
chan[i].pcmpos=chan[i].pcmrst;
|
chan[i].pcmpos=chan[i].pcmrst;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
chan[i].pcmpos&=(pcmSize-1);
|
chan[i].pcmpos&=(pcmSize-1);
|
||||||
} else if (chan[i].flags1.pcmloop) {
|
} else if (chan[i].flags1&4) {
|
||||||
chan[i].pcmpos=chan[i].pcmrst;
|
chan[i].pcmpos=chan[i].pcmrst;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ocycle[i]=cycle[i];
|
ocycle[i]=cycle[i];
|
||||||
if (chan[i].flags0.shape==5) {
|
if ((chan[i].flags0&7)==5) {
|
||||||
switch ((chan[i].duty>>4)&3) {
|
switch ((chan[i].duty>>4)&3) {
|
||||||
case 0:
|
case 0:
|
||||||
cycle[i]+=chan[i].freq*1-(chan[i].freq>>3);
|
cycle[i]+=chan[i].freq*1-(chan[i].freq>>3);
|
||||||
|
@ -114,7 +116,7 @@ void SoundUnit::NextSample(short* l, short* r) {
|
||||||
cycle[i]+=chan[i].freq;
|
cycle[i]+=chan[i].freq;
|
||||||
}
|
}
|
||||||
if ((cycle[i]&0xf80000)!=(ocycle[i]&0xf80000)) {
|
if ((cycle[i]&0xf80000)!=(ocycle[i]&0xf80000)) {
|
||||||
if (chan[i].flags0.shape==4) {
|
if ((chan[i].flags0&7)==4) {
|
||||||
lfsr[i]=(lfsr[i]>>1|(((lfsr[i]) ^ (lfsr[i] >> 2) ^ (lfsr[i] >> 3) ^ (lfsr[i] >> 5) ) & 1)<<31);
|
lfsr[i]=(lfsr[i]>>1|(((lfsr[i]) ^ (lfsr[i] >> 2) ^ (lfsr[i] >> 3) ^ (lfsr[i] >> 5) ) & 1)<<31);
|
||||||
} else {
|
} else {
|
||||||
switch ((chan[i].duty>>4)&3) {
|
switch ((chan[i].duty>>4)&3) {
|
||||||
|
@ -136,7 +138,7 @@ void SoundUnit::NextSample(short* l, short* r) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (chan[i].flags1.restim) {
|
if (chan[i].flags1&8) {
|
||||||
if (--rcycle[i]<=0) {
|
if (--rcycle[i]<=0) {
|
||||||
cycle[i]=0;
|
cycle[i]=0;
|
||||||
rcycle[i]=chan[i].restimer;
|
rcycle[i]=chan[i].restimer;
|
||||||
|
@ -144,18 +146,18 @@ void SoundUnit::NextSample(short* l, short* r) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fns[i]=ns[i]*chan[i].vol*(chan[i].flags0.pcm?4:2);
|
fns[i]=ns[i]*chan[i].vol*((chan[i].flags0&8)?4:2);
|
||||||
if (chan[i].flags0.fmode!=0) {
|
if ((chan[i].flags0&0xe0)!=0) {
|
||||||
int ff=chan[i].cutoff;
|
int ff=chan[i].cutoff;
|
||||||
nslow[i]=nslow[i]+(((ff)*nsband[i])>>16);
|
nslow[i]=nslow[i]+(((ff)*nsband[i])>>16);
|
||||||
nshigh[i]=fns[i]-nslow[i]-(((256-chan[i].reson)*nsband[i])>>8);
|
nshigh[i]=fns[i]-nslow[i]-(((256-chan[i].reson)*nsband[i])>>8);
|
||||||
nsband[i]=(((ff)*nshigh[i])>>16)+nsband[i];
|
nsband[i]=(((ff)*nshigh[i])>>16)+nsband[i];
|
||||||
fns[i]=(((chan[i].flags0.fmode&1)?(nslow[i]):(0))+((chan[i].flags0.fmode&2)?(nshigh[i]):(0))+((chan[i].flags0.fmode&4)?(nsband[i]):(0)));
|
fns[i]=(((chan[i].flags0&32)?(nslow[i]):(0))+((chan[i].flags0&64)?(nshigh[i]):(0))+((chan[i].flags0&128)?(nsband[i]):(0)));
|
||||||
}
|
}
|
||||||
nsL[i]=(fns[i]*SCpantabL[(unsigned char)chan[i].pan])>>8;
|
nsL[i]=(fns[i]*SCpantabL[(unsigned char)chan[i].pan])>>8;
|
||||||
nsR[i]=(fns[i]*SCpantabR[(unsigned char)chan[i].pan])>>8;
|
nsR[i]=(fns[i]*SCpantabR[(unsigned char)chan[i].pan])>>8;
|
||||||
oldfreq[i]=chan[i].freq;
|
oldfreq[i]=chan[i].freq;
|
||||||
if (chan[i].flags1.swvol) {
|
if (chan[i].flags1&32) {
|
||||||
if (--swvolt[i]<=0) {
|
if (--swvolt[i]<=0) {
|
||||||
swvolt[i]=chan[i].swvol.speed;
|
swvolt[i]=chan[i].swvol.speed;
|
||||||
if (chan[i].swvol.dir) {
|
if (chan[i].swvol.dir) {
|
||||||
|
@ -195,7 +197,7 @@ void SoundUnit::NextSample(short* l, short* r) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (chan[i].flags1.swfreq) {
|
if (chan[i].flags1&16) {
|
||||||
if (--swfreqt[i]<=0) {
|
if (--swfreqt[i]<=0) {
|
||||||
swfreqt[i]=chan[i].swfreq.speed;
|
swfreqt[i]=chan[i].swfreq.speed;
|
||||||
if (chan[i].swfreq.dir) {
|
if (chan[i].swfreq.dir) {
|
||||||
|
@ -219,7 +221,7 @@ void SoundUnit::NextSample(short* l, short* r) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (chan[i].flags1.swcut) {
|
if (chan[i].flags1&64) {
|
||||||
if (--swcutt[i]<=0) {
|
if (--swcutt[i]<=0) {
|
||||||
swcutt[i]=chan[i].swcut.speed;
|
swcutt[i]=chan[i].swcut.speed;
|
||||||
if (chan[i].swcut.dir) {
|
if (chan[i].swcut.dir) {
|
||||||
|
@ -243,11 +245,11 @@ void SoundUnit::NextSample(short* l, short* r) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (chan[i].flags1.resosc) {
|
if (chan[i].flags1&1) {
|
||||||
cycle[i]=0;
|
cycle[i]=0;
|
||||||
rcycle[i]=chan[i].restimer;
|
rcycle[i]=chan[i].restimer;
|
||||||
ocycle[i]=0;
|
ocycle[i]=0;
|
||||||
chan[i].flags1.resosc=0;
|
chan[i].flags1&=~1;
|
||||||
}
|
}
|
||||||
if (muted[i]) {
|
if (muted[i]) {
|
||||||
nsL[i]=0;
|
nsL[i]=0;
|
||||||
|
|
|
@ -62,28 +62,8 @@ class SoundUnit {
|
||||||
unsigned short freq;
|
unsigned short freq;
|
||||||
signed char vol;
|
signed char vol;
|
||||||
signed char pan;
|
signed char pan;
|
||||||
union {
|
unsigned char flags0;
|
||||||
unsigned char val;
|
unsigned char flags1;
|
||||||
struct {
|
|
||||||
unsigned char shape: 3;
|
|
||||||
unsigned char pcm: 1;
|
|
||||||
unsigned char ring: 1;
|
|
||||||
unsigned char fmode: 3;
|
|
||||||
};
|
|
||||||
} flags0;
|
|
||||||
union {
|
|
||||||
unsigned char val;
|
|
||||||
struct {
|
|
||||||
unsigned char resosc: 1;
|
|
||||||
unsigned char resfilt: 1;
|
|
||||||
unsigned char pcmloop: 1;
|
|
||||||
unsigned char restim: 1;
|
|
||||||
unsigned char swfreq: 1;
|
|
||||||
unsigned char swvol: 1;
|
|
||||||
unsigned char swcut: 1;
|
|
||||||
unsigned char padding: 1;
|
|
||||||
};
|
|
||||||
} flags1;
|
|
||||||
unsigned short cutoff;
|
unsigned short cutoff;
|
||||||
unsigned char duty;
|
unsigned char duty;
|
||||||
unsigned char reson;
|
unsigned char reson;
|
||||||
|
|
Loading…
Reference in New Issue