From 314b7d43f8f71263a2a6c58d2cbbee13717302bc Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 2 Nov 2025 15:06:16 -0500 Subject: [PATCH 1/6] =?UTF-8?q?limit=20range=20of=20multi-ins=20transpose?= =?UTF-8?q?=20to=20=C2=B160?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gui/multiInsSetup.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/gui/multiInsSetup.cpp b/src/gui/multiInsSetup.cpp index 003a8dd6b..90e55fa01 100644 --- a/src/gui/multiInsSetup.cpp +++ b/src/gui/multiInsSetup.cpp @@ -53,10 +53,16 @@ void FurnaceGUI::drawMultiInsSetup() { ImGui::PushItemFlag(ImGuiItemFlags_ButtonRepeat,true); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding,ImVec2(0.0f,0.0f)); if (ImGui::Button(ICON_FA_CHEVRON_UP "##Up",ImVec2(ImGui::GetContentRegionAvail().x,0))) { - if (i>0) multiInsTranspose[i-1]++; + if (i>0) { + multiInsTranspose[i-1]++; + if (multiInsTranspose[i-1]>60) multiInsTranspose[i-1]=60; + } } if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) { - if (i>0) multiInsTranspose[i-1]+=12; + if (i>0) { + multiInsTranspose[i-1]+=12; + if (multiInsTranspose[i-1]>60) multiInsTranspose[i-1]=60; + } } ImGui::PopStyleVar(); ImGui::PopItemFlag(); @@ -84,10 +90,16 @@ void FurnaceGUI::drawMultiInsSetup() { ImGui::PushItemFlag(ImGuiItemFlags_ButtonRepeat,true); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding,ImVec2(0.0f,0.0f)); if (ImGui::Button(ICON_FA_CHEVRON_DOWN "##Down",ImVec2(ImGui::GetContentRegionAvail().x,0))) { - if (i>0) multiInsTranspose[i-1]--; + if (i>0) { + multiInsTranspose[i-1]--; + if (multiInsTranspose[i-1]<-60) multiInsTranspose[i-1]=-60; + } } if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) { - if (i>0) multiInsTranspose[i-1]-=12; + if (i>0) { + multiInsTranspose[i-1]-=12; + if (multiInsTranspose[i-1]<-60) multiInsTranspose[i-1]=-60; + } } ImGui::PopStyleVar(); ImGui::PopItemFlag(); From 872eeff9f1595b4d7b9ec28f4915e9e751dab3c5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 3 Nov 2025 03:30:23 -0500 Subject: [PATCH 2/6] OPL: fix some OPL3 chan osc bugs - 4-op muting being broken - output channel inconsistencies between Nuked-OPL3 and ymfm thanks Forte! --- src/engine/platform/opl.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index e13239225..4b7268f13 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -270,9 +270,10 @@ void DivPlatformOPL::acquire_nuked(short** buf, size_t len) { if (properDrums) { for (int i=0; idebug_output(0)+fmChan[ch]->debug_output(1); if (chOut==0) { chOut=fmChan[ch]->debug_output(2); @@ -608,9 +611,10 @@ void DivPlatformOPL::acquire_ymfm3(short** buf, size_t len) { oscBuf[19]->putSample(h,CLAMP(fmChan[7]->debug_special1()<<1,-32768,32767)); } else { for (int i=0; i<18; i++) { - unsigned char ch=outChanMap[i]; + unsigned char ch=(i<12 && chan[i&(~1)].fourOp)?outChanMap[i^1]:outChanMap[i]; + unsigned char chMute=(i<12 && chan[i&(~1)].fourOp)?(i^1):i; if (ch==255) continue; - if (isMuted[i]) continue; + if (isMuted[chMute]) continue; int chOut=fmChan[ch]->debug_output(0)+fmChan[ch]->debug_output(1); if (chOut==0) { chOut=fmChan[ch]->debug_output(2); @@ -683,8 +687,9 @@ void DivPlatformOPL::acquire_ymfm4(short** buf, size_t len) { if (properDrums) { for (int i=0; i<16; i++) { unsigned char ch=(i<12 && chan[i&(~1)].fourOp)?outChanMap[i^1]:outChanMap[i]; + unsigned char chMute=(i<12 && chan[i&(~1)].fourOp)?(i^1):i; if (ch==255) continue; - if (isMuted[i]) continue; + if (isMuted[chMute]) continue; int chOut=fmChan[ch]->debug_output(0); if (chOut==0) { chOut=fmChan[ch]->debug_output(1); @@ -707,9 +712,10 @@ void DivPlatformOPL::acquire_ymfm4(short** buf, size_t len) { oscBuf[19]->putSample(h,CLAMP(fmChan[7]->debug_special1()<<1,-32768,32767)); } else { for (int i=0; i<18; i++) { - unsigned char ch=outChanMap[i]; + unsigned char ch=(i<12 && chan[i&(~1)].fourOp)?outChanMap[i^1]:outChanMap[i]; + unsigned char chMute=(i<12 && chan[i&(~1)].fourOp)?(i^1):i; if (ch==255) continue; - if (isMuted[i]) continue; + if (isMuted[chMute]) continue; int chOut=fmChan[ch]->debug_output(0); if (chOut==0) { chOut=fmChan[ch]->debug_output(1); @@ -1019,7 +1025,8 @@ void DivPlatformOPL::acquire_nukedLLE3(short** buf, size_t len) { } for (int i=0; i<20; i++) { - if (isMuted[i]) continue; + unsigned char chMute=(i<12 && chan[i&(~1)].fourOp)?(i^1):i; + if (isMuted[chMute]) continue; if (chOut[i]<-32768) chOut[i]=-32768; if (chOut[i]>32767) chOut[i]=32767; oscBuf[i]->putSample(h,chOut[i]); From 83ba6f8d0a6c6e1f616517c99f98629bab456768 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 3 Nov 2025 18:33:28 -0500 Subject: [PATCH 3/6] VGM export: fix VRC7 export why is this UNDOCUMENTED AGAIN... --- src/engine/vgmOps.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/engine/vgmOps.cpp b/src/engine/vgmOps.cpp index c7d1cbfde..f18342422 100644 --- a/src/engine/vgmOps.cpp +++ b/src/engine/vgmOps.cpp @@ -1695,6 +1695,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p case DIV_SYSTEM_VRC7: if (!hasOPLL) { hasOPLL=disCont[i].dispatch->chipClock; + if (song.system[i]==DIV_SYSTEM_VRC7) hasOPLL|=0x8000000; CHIP_VOL(1,3.2); willExport[i]=true; } else if (!(hasOPLL&0x40000000)) { From ee800a231b260d2554fa663e74107e0e7891676a Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 4 Nov 2025 01:05:19 -0500 Subject: [PATCH 4/6] ASIO backend: fix crash on buffer size change i hope --- src/audio/asio.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/audio/asio.cpp b/src/audio/asio.cpp index e522affe8..19cb4d9fb 100644 --- a/src/audio/asio.cpp +++ b/src/audio/asio.cpp @@ -43,7 +43,7 @@ static long _onMessage(long type, long value, void* msg, double* opt) { case kAsioSelectorSupported: case kAsioEngineVersion: case kAsioResetRequest: - case kAsioBufferSizeChange: + //case kAsioBufferSizeChange: case kAsioResyncRequest: return 1; default: @@ -58,8 +58,9 @@ static long _onMessage(long type, long value, void* msg, double* opt) { return 1; break; case kAsioBufferSizeChange: - callbackInstance->onBufferSize(value); - return 1; + // unfortunately the following triggers a crash, so I am disabling it for now. + //callbackInstance->onBufferSize(value); + return 0; break; case kAsioResyncRequest: // ignore From 51b27746ab6b6e85c26f63e9bbfaefab914bd466 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 4 Nov 2025 03:26:51 -0500 Subject: [PATCH 5/6] actually fix it --- src/engine/vgmOps.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/vgmOps.cpp b/src/engine/vgmOps.cpp index f18342422..cab97710f 100644 --- a/src/engine/vgmOps.cpp +++ b/src/engine/vgmOps.cpp @@ -1695,7 +1695,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p case DIV_SYSTEM_VRC7: if (!hasOPLL) { hasOPLL=disCont[i].dispatch->chipClock; - if (song.system[i]==DIV_SYSTEM_VRC7) hasOPLL|=0x8000000; + if (song.system[i]==DIV_SYSTEM_VRC7) hasOPLL|=0x80000000; CHIP_VOL(1,3.2); willExport[i]=true; } else if (!(hasOPLL&0x40000000)) { From 53c1db7fa649a28e54aa944d79b13bcebca7a280 Mon Sep 17 00:00:00 2001 From: Eknous-P Date: Tue, 4 Nov 2025 13:39:05 +0400 Subject: [PATCH 6/6] change xyosc channel selectors from drags to inputs --- src/gui/xyOsc.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gui/xyOsc.cpp b/src/gui/xyOsc.cpp index 9c4eca9f1..a9b18f7f7 100644 --- a/src/gui/xyOsc.cpp +++ b/src/gui/xyOsc.cpp @@ -39,16 +39,18 @@ void FurnaceGUI::drawXYOsc() { int xyOscXChannelP1=xyOscXChannel+1; int xyOscYChannelP1=xyOscYChannel+1; + ImGui::AlignTextToFramePadding(); ImGui::Text(_("X Channel")); ImGui::SameLine(); - if (ImGui::DragInt("##XChannel",&xyOscXChannelP1,1.0f,1,DIV_MAX_OUTPUTS)) { + if (ImGui::InputInt("##XChannel",&xyOscXChannelP1)) { xyOscXChannel=MIN(MAX(xyOscXChannelP1,1),DIV_MAX_OUTPUTS)-1; } rightClickable ImGui::SameLine(); ImGui::Checkbox(_("Invert##X"),&xyOscXInvert); + ImGui::AlignTextToFramePadding(); ImGui::Text(_("Y Channel")); ImGui::SameLine(); - if (ImGui::DragInt("##YChannel",&xyOscYChannelP1,1.0f,1,DIV_MAX_OUTPUTS)) { + if (ImGui::InputInt("##YChannel",&xyOscYChannelP1)) { xyOscYChannel=MIN(MAX(xyOscYChannelP1,1),DIV_MAX_OUTPUTS)-1; } rightClickable ImGui::SameLine();