SoundUnit: emulation changes

no longer uses int for the filter stages, instead using short
this makes a 1982 design cheaper and more viable
This commit is contained in:
tildearrow 2024-09-09 19:28:16 -05:00
parent a18dea53e3
commit 4f5c6cbbb5
2 changed files with 12 additions and 11 deletions

View file

@ -146,7 +146,8 @@ void SoundUnit::NextSample(short* l, short* r) {
} }
} }
} }
fns[i]=ns[i]*chan[i].vol*((chan[i].flags0&8)?4:2); fns[i]=ns[i]*chan[i].vol;
if (!(chan[i].flags0&8)) fns[i]>>=1;
if ((chan[i].flags0&0xe0)!=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);
@ -259,12 +260,12 @@ void SoundUnit::NextSample(short* l, short* r) {
// mix // mix
if (dsOut) { if (dsOut) {
tnsL=nsL[dsChannel]<<1; tnsL=nsL[dsChannel]<<3;
tnsR=nsR[dsChannel]<<1; tnsR=nsR[dsChannel]<<3;
dsChannel=(dsChannel+1)&7; dsChannel=(dsChannel+1)&7;
} else { } else {
tnsL=(nsL[0]+nsL[1]+nsL[2]+nsL[3]+nsL[4]+nsL[5]+nsL[6]+nsL[7])>>2; tnsL=(nsL[0]+nsL[1]+nsL[2]+nsL[3]+nsL[4]+nsL[5]+nsL[6]+nsL[7]);
tnsR=(nsR[0]+nsR[1]+nsR[2]+nsR[3]+nsR[4]+nsR[5]+nsR[6]+nsR[7])>>2; tnsR=(nsR[0]+nsR[1]+nsR[2]+nsR[3]+nsR[4]+nsR[5]+nsR[6]+nsR[7]);
IL1=minval(32767,maxval(-32767,tnsL))>>8; IL1=minval(32767,maxval(-32767,tnsL))>>8;
IL2=minval(32767,maxval(-32767,tnsR))>>8; IL2=minval(32767,maxval(-32767,tnsR))>>8;

View file

@ -33,12 +33,12 @@ class SoundUnit {
int rcycle[8]; int rcycle[8];
unsigned int lfsr[8]; unsigned int lfsr[8];
signed char ns[8]; signed char ns[8];
int fns[8]; short fns[8];
int nsL[8]; short nsL[8];
int nsR[8]; short nsR[8];
int nslow[8]; short nslow[8];
int nshigh[8]; short nshigh[8];
int nsband[8]; short nsband[8];
int tnsL, tnsR; int tnsL, tnsR;
unsigned char ilBufPeriod; unsigned char ilBufPeriod;
unsigned short ilBufPos; unsigned short ilBufPos;