SoundUnit: actually finish it

This commit is contained in:
tildearrow 2022-08-06 18:23:11 -05:00
parent e0c5029769
commit 6934a499c1
4 changed files with 90 additions and 16 deletions

View File

@ -238,44 +238,65 @@ void SoundUnit::NextSample(short* l, short* r) {
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])>>2;
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])>>2;
IL1=minval(32767,maxval(-32767,tnsL))>>8;
IL2=minval(32767,maxval(-32767,tnsR))>>8;
// write input lines to sample memory // write input lines to sample memory
if (ILSIZE&64) { if (ILSIZE&64) {
if (++ilBufPeriod>=((1+(FIL1>>4))<<2)) { if (++ilBufPeriod>=((1+(FIL1>>4))<<2)) {
ilBufPeriod=0; ilBufPeriod=0;
unsigned short ilLowerBound=pcmSize-((1+(ILSIZE&63))<<7); unsigned short ilLowerBound=pcmSize-((1+(ILSIZE&63))<<7);
short next;
if (ilBufPos<ilLowerBound) ilBufPos=ilLowerBound; if (ilBufPos<ilLowerBound) ilBufPos=ilLowerBound;
switch (ILCTRL&3) { switch (ILCTRL&3) {
case 0: case 0:
ilFeedback0=ilFeedback1=pcm[ilBufPos]; ilFeedback0=ilFeedback1=pcm[ilBufPos];
pcm[ilBufPos]=IL0+((pcm[ilBufPos]*(FIL1&15))>>4); next=((signed char)IL0)+((pcm[ilBufPos]*(FIL1&15))>>4);
if (next<-128) next=-128;
if (next>127) next=127;
pcm[ilBufPos]=next;
if (++ilBufPos>=pcmSize) ilBufPos=ilLowerBound; if (++ilBufPos>=pcmSize) ilBufPos=ilLowerBound;
break; break;
case 1: case 1:
ilFeedback0=ilFeedback1=pcm[ilBufPos]; ilFeedback0=ilFeedback1=pcm[ilBufPos];
pcm[ilBufPos]=IL1+((pcm[ilBufPos]*(FIL1&15))>>4); next=((signed char)IL1)+((pcm[ilBufPos]*(FIL1&15))>>4);
if (next<-128) next=-128;
if (next>127) next=127;
pcm[ilBufPos]=next;
if (++ilBufPos>=pcmSize) ilBufPos=ilLowerBound; if (++ilBufPos>=pcmSize) ilBufPos=ilLowerBound;
break; break;
case 2: case 2:
ilFeedback0=ilFeedback1=pcm[ilBufPos]; ilFeedback0=ilFeedback1=pcm[ilBufPos];
pcm[ilBufPos]=IL2+((pcm[ilBufPos]*(FIL1&15))>>4); next=((signed char)IL2)+((pcm[ilBufPos]*(FIL1&15))>>4);
if (next<-128) next=-128;
if (next>127) next=127;
pcm[ilBufPos]=next;
if (++ilBufPos>=pcmSize) ilBufPos=ilLowerBound; if (++ilBufPos>=pcmSize) ilBufPos=ilLowerBound;
break; break;
case 3: case 3:
ilFeedback0=pcm[ilBufPos]; ilFeedback0=pcm[ilBufPos];
pcm[ilBufPos]=IL1+((pcm[ilBufPos]*(FIL1&15))>>4); next=((signed char)IL1)+((pcm[ilBufPos]*(FIL1&15))>>4);
if (next<-128) next=-128;
if (next>127) next=127;
pcm[ilBufPos]=next;
if (++ilBufPos>=pcmSize) ilBufPos=ilLowerBound; if (++ilBufPos>=pcmSize) ilBufPos=ilLowerBound;
ilFeedback1=pcm[ilBufPos]; ilFeedback1=pcm[ilBufPos];
pcm[ilBufPos]=IL2+((pcm[ilBufPos]*(FIL1&15))>>4); next=((signed char)IL2)+((pcm[ilBufPos]*(FIL1&15))>>4);
if (next<-128) next=-128;
if (next>127) next=127;
pcm[ilBufPos]=next;
if (++ilBufPos>=pcmSize) ilBufPos=ilLowerBound; if (++ilBufPos>=pcmSize) ilBufPos=ilLowerBound;
break; break;
} }
} }
if (ILSIZE&128) { if (ILCTRL&4) {
tnsL+=ilFeedback1*(signed char)FILVOL; if (ILSIZE&128) {
tnsR+=ilFeedback0*(signed char)FILVOL; tnsL+=ilFeedback1*(signed char)FILVOL;
} else { tnsR+=ilFeedback0*(signed char)FILVOL;
tnsL+=ilFeedback0*(signed char)FILVOL; } else {
tnsR+=ilFeedback1*(signed char)FILVOL; tnsL+=ilFeedback0*(signed char)FILVOL;
tnsR+=ilFeedback1*(signed char)FILVOL;
}
} }
} }

View File

@ -529,6 +529,16 @@ void DivPlatformSoundUnit::reset() {
lfoMode=0; lfoMode=0;
lfoSpeed=255; lfoSpeed=255;
delay=500; delay=500;
// set initial IL status
ilCtrl=initIlCtrl;
ilSize=initIlSize;
fil1=initFil1;
echoVol=initEchoVol;
rWrite(0x9c,echoVol);
rWrite(0x9d,ilCtrl);
rWrite(0xbc,ilSize);
rWrite(0xbd,fil1);
} }
bool DivPlatformSoundUnit::isStereo() { bool DivPlatformSoundUnit::isStereo() {
@ -555,6 +565,10 @@ void DivPlatformSoundUnit::setFlags(unsigned int flags) {
for (int i=0; i<8; i++) { for (int i=0; i<8; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->rate=rate;
} }
initIlCtrl=3|(flags&4);
initIlSize=((flags>>8)&63)|((flags&4)?0x40:0)|((flags&8)?0x80:0);
initFil1=flags>>16;
initEchoVol=flags>>24;
sampleMemSize=flags&16; sampleMemSize=flags&16;
@ -575,7 +589,7 @@ const void* DivPlatformSoundUnit::getSampleMem(int index) {
} }
size_t DivPlatformSoundUnit::getSampleMemCapacity(int index) { size_t DivPlatformSoundUnit::getSampleMemCapacity(int index) {
return (index==0)?(sampleMemSize?65536:8192):0; return (index==0)?((sampleMemSize?65536:8192)-((initIlSize&64)?((1+(initIlSize&63))<<7):0)):0;
} }
size_t DivPlatformSoundUnit::getSampleMemUsage(int index) { size_t DivPlatformSoundUnit::getSampleMemUsage(int index) {

View File

@ -97,6 +97,9 @@ class DivPlatformSoundUnit: public DivDispatch {
std::queue<QueuedWrite> writes; std::queue<QueuedWrite> writes;
unsigned char lastPan; unsigned char lastPan;
bool sampleMemSize; bool sampleMemSize;
unsigned char ilCtrl, ilSize, fil1;
unsigned char initIlCtrl, initIlSize, initFil1;
signed char echoVol, initEchoVol;
int cycles, curChan, delay; int cycles, curChan, delay;
short tempL; short tempL;

View File

@ -129,11 +129,11 @@ void FurnaceGUI::drawSysConf(int chan, DivSystem type, unsigned int& flags, bool
} }
case DIV_SYSTEM_SOUND_UNIT: { case DIV_SYSTEM_SOUND_UNIT: {
ImGui::Text("CPU rate:"); ImGui::Text("CPU rate:");
if (ImGui::RadioButton("6.18MHz (NTSC)",(flags&15)==0)) { if (ImGui::RadioButton("6.18MHz (NTSC)",(flags&3)==0)) {
copyOfFlags=(flags&(~15))|0; copyOfFlags=(flags&(~3))|0;
} }
if (ImGui::RadioButton("5.95MHz (PAL)",(flags&15)==1)) { if (ImGui::RadioButton("5.95MHz (PAL)",(flags&3)==1)) {
copyOfFlags=(flags&(~15))|1; copyOfFlags=(flags&(~3))|1;
} }
ImGui::Text("Chip revision (sample memory):"); ImGui::Text("Chip revision (sample memory):");
if (ImGui::RadioButton("A/B/E (8K)",(flags&16)==0)) { if (ImGui::RadioButton("A/B/E (8K)",(flags&16)==0)) {
@ -142,6 +142,42 @@ void FurnaceGUI::drawSysConf(int chan, DivSystem type, unsigned int& flags, bool
if (ImGui::RadioButton("D/F (64K)",(flags&16)==16)) { if (ImGui::RadioButton("D/F (64K)",(flags&16)==16)) {
copyOfFlags=(flags&(~16))|16; copyOfFlags=(flags&(~16))|16;
} }
bool echo=flags&4;
if (ImGui::Checkbox("Enable echo",&echo)) {
copyOfFlags=(flags&(~4))|(echo<<2);
}
bool flipEcho=flags&8;
if (ImGui::Checkbox("Swap echo channels",&flipEcho)) {
copyOfFlags=(flags&(~8))|(flipEcho<<3);
}
ImGui::Text("Echo delay:");
int echoBufSize=(flags&0x3f00)>>8;
if (CWSliderInt("##EchoBufSize",&echoBufSize,0,63)) {
if (echoBufSize<0) echoBufSize=0;
if (echoBufSize>63) echoBufSize=63;
copyOfFlags=(flags&~0x3f00)|(echoBufSize<<8);
} rightClickable
ImGui::Text("Echo resolution:");
int echoResolution=(flags&0xf00000)>>20;
if (CWSliderInt("##EchoResolution",&echoResolution,0,15)) {
if (echoResolution<0) echoResolution=0;
if (echoResolution>15) echoResolution=15;
copyOfFlags=(flags&(~0xf00000))|(echoResolution<<20);
} rightClickable
ImGui::Text("Echo feedback:");
int echoFeedback=(flags&0xf0000)>>16;
if (CWSliderInt("##EchoFeedback",&echoFeedback,0,15)) {
if (echoFeedback<0) echoFeedback=0;
if (echoFeedback>15) echoFeedback=15;
copyOfFlags=(flags&(~0xf0000))|(echoFeedback<<16);
} rightClickable
ImGui::Text("Echo volume:");
int echoVolume=(signed char)((flags&0xff000000)>>24);
if (CWSliderInt("##EchoVolume",&echoVolume,-128,127)) {
if (echoVolume<-128) echoVolume=-128;
if (echoVolume>127) echoVolume=127;
copyOfFlags=(flags&(~0xff000000))|(((unsigned char)echoVolume)<<24);
} rightClickable
break; break;
} }
case DIV_SYSTEM_GB: { case DIV_SYSTEM_GB: {