OPL4: fix a couple issues with samples

issue #2217
This commit is contained in:
tildearrow 2025-03-21 17:38:28 -05:00
parent 4546df5636
commit 8dcb2d02ad
2 changed files with 16 additions and 5 deletions

View file

@ -3271,7 +3271,6 @@ void DivPlatformOPL::renderSamples(int sysID) {
int length; int length;
switch (s->depth) { switch (s->depth) {
default:
case DIV_SAMPLE_DEPTH_8BIT: case DIV_SAMPLE_DEPTH_8BIT:
length=MIN(65535,s->getLoopEndPosition(DIV_SAMPLE_DEPTH_8BIT)); length=MIN(65535,s->getLoopEndPosition(DIV_SAMPLE_DEPTH_8BIT));
break; break;
@ -3281,6 +3280,9 @@ void DivPlatformOPL::renderSamples(int sysID) {
case DIV_SAMPLE_DEPTH_16BIT: case DIV_SAMPLE_DEPTH_16BIT:
length=MIN(131070,s->getLoopEndPosition(DIV_SAMPLE_DEPTH_16BIT)); length=MIN(131070,s->getLoopEndPosition(DIV_SAMPLE_DEPTH_16BIT));
break; break;
default:
length=MIN(65535,s->getLoopEndPosition(DIV_SAMPLE_DEPTH_8BIT));
break;
} }
unsigned char* src=(unsigned char*)s->getCurBuf(); unsigned char* src=(unsigned char*)s->getCurBuf();
int actualLength=MIN((int)(getSampleMemCapacity(0)-memPos),length); int actualLength=MIN((int)(getSampleMemCapacity(0)-memPos),length);
@ -3313,10 +3315,9 @@ void DivPlatformOPL::renderSamples(int sysID) {
DivSample* s=parent->song.sample[i]; DivSample* s=parent->song.sample[i];
unsigned int insAddr=(i*12)+((ramSize<=0x200000)?0x200000:0); unsigned int insAddr=(i*12)+((ramSize<=0x200000)?0x200000:0);
unsigned char bitDepth; unsigned char bitDepth;
int endPos=CLAMP(s->loopEnd,1,0x10000); int endPos=CLAMP(s->isLoopable()?s->loopEnd:s->samples,1,0x10000);
int loop=s->isLoopable()?CLAMP(s->loopStart,0,endPos-1):(endPos-1); int loop=s->isLoopable()?CLAMP(s->loopStart,0,endPos-2):(endPos-2);
switch (s->depth) { switch (s->depth) {
default:
case DIV_SAMPLE_DEPTH_8BIT: case DIV_SAMPLE_DEPTH_8BIT:
bitDepth=0; bitDepth=0;
break; break;
@ -3326,6 +3327,9 @@ void DivPlatformOPL::renderSamples(int sysID) {
case DIV_SAMPLE_DEPTH_16BIT: case DIV_SAMPLE_DEPTH_16BIT:
bitDepth=2; bitDepth=2;
break; break;
default:
bitDepth=0;
break;
} }
pcmMem[insAddr]=(bitDepth<<6)|((sampleOffPCM[i]>>16)&0x3f); pcmMem[insAddr]=(bitDepth<<6)|((sampleOffPCM[i]>>16)&0x3f);
pcmMem[1+insAddr]=(sampleOffPCM[i]>>8)&0xff; pcmMem[1+insAddr]=(sampleOffPCM[i]>>8)&0xff;
@ -3334,7 +3338,7 @@ void DivPlatformOPL::renderSamples(int sysID) {
pcmMem[4+insAddr]=(loop)&0xff; pcmMem[4+insAddr]=(loop)&0xff;
pcmMem[5+insAddr]=((~(endPos-1))>>8)&0xff; pcmMem[5+insAddr]=((~(endPos-1))>>8)&0xff;
pcmMem[6+insAddr]=(~(endPos-1))&0xff; pcmMem[6+insAddr]=(~(endPos-1))&0xff;
// TODO: how to fill in rest of instrument table? // on MultiPCM this consists of instrument params, but on OPL4 this is not used
pcmMem[7+insAddr]=0; // LFO, VIB pcmMem[7+insAddr]=0; // LFO, VIB
pcmMem[8+insAddr]=(0xf << 4) | (0xf << 0); // AR, D1R pcmMem[8+insAddr]=(0xf << 4) | (0xf << 0); // AR, D1R
pcmMem[9+insAddr]=0; // DL, D2R pcmMem[9+insAddr]=0; // DL, D2R

View file

@ -2603,30 +2603,37 @@ bool FurnaceGUI::drawSysConf(int chan, int sysPos, DivSystem type, DivConfig& fl
if (ImGui::RadioButton(_("4MB"),ramSize==0)) { if (ImGui::RadioButton(_("4MB"),ramSize==0)) {
ramSize=0; ramSize=0;
altered=true; altered=true;
mustRender=true;
} }
if (ImGui::RadioButton(_("2MB"),ramSize==1)) { if (ImGui::RadioButton(_("2MB"),ramSize==1)) {
ramSize=1; ramSize=1;
altered=true; altered=true;
mustRender=true;
} }
if (ImGui::RadioButton(_("1MB"),ramSize==2)) { if (ImGui::RadioButton(_("1MB"),ramSize==2)) {
ramSize=2; ramSize=2;
altered=true; altered=true;
mustRender=true;
} }
if (ImGui::RadioButton(_("640KB"),ramSize==3)) { if (ImGui::RadioButton(_("640KB"),ramSize==3)) {
ramSize=3; ramSize=3;
altered=true; altered=true;
mustRender=true;
} }
if (ImGui::RadioButton(_("512KB"),ramSize==4)) { if (ImGui::RadioButton(_("512KB"),ramSize==4)) {
ramSize=4; ramSize=4;
altered=true; altered=true;
mustRender=true;
} }
if (ImGui::RadioButton(_("256KB"),ramSize==5)) { if (ImGui::RadioButton(_("256KB"),ramSize==5)) {
ramSize=5; ramSize=5;
altered=true; altered=true;
mustRender=true;
} }
if (ImGui::RadioButton(_("128KB"),ramSize==6)) { if (ImGui::RadioButton(_("128KB"),ramSize==6)) {
ramSize=6; ramSize=6;
altered=true; altered=true;
mustRender=true;
} }
ImGui::Unindent(); ImGui::Unindent();