diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index 2757ac27..7eb148ea 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -179,6 +179,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { ds.brokenPortaArp=false; ds.snNoLowPeriods=true; ds.ignorePCEDACVolume=true; + ds.newY8950PCMFreq=false; ds.delayBehavior=0; ds.jumpTreatment=2; @@ -1102,6 +1103,7 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { ds.autoSystem=false; } ds.ignorePCEDACVolume=true; + ds.newY8950PCMFreq=false; ds.isDMF=false; reader.readS(); // reserved diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index d3437240..148ce279 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -28,6 +28,8 @@ #define KVSL(x,y) ((chan[x].state.op[orderedOpsL1[ops==4][y]].kvs==2 && isOutputL[ops==4][chan[x].state.alg][y]) || chan[x].state.op[orderedOpsL1[ops==4][y]].kvs==1) +#define OPLPCMDiv (parent->song.newY8950PCMFreq?((oplType==3)?288:72):144) + #define CHIP_FREQBASE chipFreqBase // N = invalid @@ -274,7 +276,7 @@ double DivPlatformOPL::NOTE_ADPCMB(int note) { if (adpcmChan<0) return 0; if (chan[adpcmChan].sample>=0 && chan[adpcmChan].samplesong.sampleLen) { double off=65535.0*(double)(parent->getSample(chan[adpcmChan].sample)->centerRate)/8363.0; - return parent->calcBaseFreq((double)chipClock/((oplType==3)?288:72),off,note,false); + return parent->calcBaseFreq((double)chipClock/OPLPCMDiv,off,note,false); } return 0; } @@ -504,7 +506,7 @@ void DivPlatformOPL::tick(bool sysTick) { if (chan[adpcmChan].freqChanged || chan[adpcmChan].keyOn || chan[adpcmChan].keyOff) { if (chan[adpcmChan].sample>=0 && chan[adpcmChan].samplesong.sampleLen) { double off=65535.0*(double)(parent->getSample(chan[adpcmChan].sample)->centerRate)/8363.0; - chan[adpcmChan].freq=parent->calcFreq(chan[adpcmChan].baseFreq,chan[adpcmChan].pitch,false,4,chan[adpcmChan].pitch2,(double)chipClock/((oplType==3)?288:72),off); + chan[adpcmChan].freq=parent->calcFreq(chan[adpcmChan].baseFreq,chan[adpcmChan].pitch,false,4,chan[adpcmChan].pitch2,(double)chipClock/OPLPCMDiv,off); } else { chan[adpcmChan].freq=0; } diff --git a/src/engine/song.h b/src/engine/song.h index 28a31c75..9f5ca154 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -512,6 +512,7 @@ struct DivSong { bool brokenPortaArp; bool snNoLowPeriods; bool ignorePCEDACVolume; + bool newY8950PCMFreq; bool autoSystem; std::vector ins; @@ -618,6 +619,7 @@ struct DivSong { brokenPortaArp(false), snNoLowPeriods(false), ignorePCEDACVolume(true), + newY8950PCMFreq(false), autoSystem(true) { for (int i=0; i<32; i++) { system[i]=DIV_SYSTEM_NULL; diff --git a/src/gui/compatFlags.cpp b/src/gui/compatFlags.cpp index c3627efa..80e9b0f5 100644 --- a/src/gui/compatFlags.cpp +++ b/src/gui/compatFlags.cpp @@ -147,6 +147,10 @@ void FurnaceGUI::drawCompatFlags() { if (ImGui::IsItemHovered()) { ImGui::SetTooltip("when enabled, PC Engine DAC Volume is ignored."); } + ImGui::Checkbox("New Y8950 Frequency calculation",&e->song.newY8950PCMFreq); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("when enabled, use corrected Y8950 frequency calculation"); + } ImGui::Text("Pitch linearity:"); if (ImGui::RadioButton("None",e->song.linearPitch==0)) { diff --git a/src/gui/debug.cpp b/src/gui/debug.cpp index 602b7fb0..652150ab 100644 --- a/src/gui/debug.cpp +++ b/src/gui/debug.cpp @@ -90,8 +90,8 @@ #define OPNB_CHIP_DEBUG \ FM_OPN_CHIP_DEBUG; \ - ImGui::Text("- adpcmAMemLen: %.8x",ch->adpcmAMemLen); \ - ImGui::Text("- adpcmBMemLen: %.8x",ch->adpcmBMemLen); \ + ImGui::Text("- adpcmAMemLen: %lld",ch->adpcmAMemLen); \ + ImGui::Text("- adpcmBMemLen: %lld",ch->adpcmBMemLen); \ ImGui::Text("- sampleBank: %d",ch->sampleBank); \ ImGui::Text("- writeADPCMAOff: %d",ch->writeADPCMAOff); \ ImGui::Text("- writeADPCMAOn: %d",ch->writeADPCMAOn); \ @@ -335,7 +335,7 @@ void putDispatchChip(void* data, int type) { DivPlatformYM2608* ch=(DivPlatformYM2608*)data; ImGui::Text("> YM2608"); FM_OPN_CHIP_DEBUG; - ImGui::Text("- adpcmBMemLen: %.8x",ch->adpcmBMemLen); + ImGui::Text("- adpcmBMemLen: %lld",ch->adpcmBMemLen); ImGui::Text("- sampleBank: %d",ch->sampleBank); ImGui::Text("- writeRSSOff: %d",ch->writeRSSOff); ImGui::Text("- writeRSSOn: %d",ch->writeRSSOn); @@ -397,7 +397,7 @@ void putDispatchChip(void* data, int type) { ImGui::Text(" - Pos: %d",ch->dacPos); ImGui::Text(" - AntiClick: %d",ch->dacAntiClick); ImGui::Text(" - Sample: %d",ch->dacSample); - ImGui::Text("- dpcmMemLen: %.8x",ch->dpcmMemLen); + ImGui::Text("- dpcmMemLen: %lld",ch->dpcmMemLen); ImGui::Text("- dpcmBank: %d",ch->dpcmBank); ImGui::Text("- sampleBank: %d",ch->sampleBank); ImGui::Text("- writeOscBuf: %d",ch->writeOscBuf); @@ -504,7 +504,7 @@ void putDispatchChip(void* data, int type) { ImGui::Text("* echo:"); ImGui::Text(" - delay: %d",ch->echoDelay); ImGui::Text(" - feedback: %d",ch->echoFeedback); - ImGui::Text("- sampleMemLen: %.8x",ch->sampleMemLen); + ImGui::Text("- sampleMemLen: %lld",ch->sampleMemLen); COMMON_CHIP_DEBUG_BOOL; break; } @@ -512,7 +512,7 @@ void putDispatchChip(void* data, int type) { DivPlatformX1_010* ch=(DivPlatformX1_010*)data; ImGui::Text("> X1-010"); COMMON_CHIP_DEBUG; - ImGui::Text("- sampleMemLen: %.8x",ch->sampleMemLen); + ImGui::Text("- sampleMemLen: %lld",ch->sampleMemLen); ImGui::Text("- sampleBank: %d",ch->sampleBank); ImGui::Text("- bankSlot: [%d,%d,%d,%d,%d,%d,%d,%d]",ch->bankSlot[0],ch->bankSlot[1],ch->bankSlot[2],ch->bankSlot[3],ch->bankSlot[4],ch->bankSlot[5],ch->bankSlot[6],ch->bankSlot[7]); COMMON_CHIP_DEBUG_BOOL;