From 240d3c5718f78580f62479d7aede930d4a2e30f6 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 27 Dec 2025 17:30:19 -0500 Subject: [PATCH] GUI: use an accumulator for wave synth preview issue #2735 --- src/gui/gui.cpp | 1 + src/gui/gui.h | 1 + src/gui/insEdit.cpp | 15 ++++++++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 27693d56c..9cab5c014 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -9010,6 +9010,7 @@ FurnaceGUI::FurnaceGUI(): wavePreviewHeight(255), wavePreviewInit(true), wavePreviewPaused(false), + wavePreviewAccum(0.0f), pgSys(0), pgAddr(0), pgVal(0), diff --git a/src/gui/gui.h b/src/gui/gui.h index ce2aaec8c..008e1a40d 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2470,6 +2470,7 @@ class FurnaceGUI { DivWaveSynth wavePreview; int wavePreviewLen, wavePreviewHeight; bool wavePreviewInit, wavePreviewPaused; + float wavePreviewAccum; // bit 31: ctrl // bit 30: reserved for SDL scancode mask diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 3ea1ce6f7..db3ddd7d2 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -3289,6 +3289,7 @@ void FurnaceGUI::insTabWavetable(DivInstrument* ins) DivWavetable* wave2=e->getWave(ins->ws.wave2); if (wavePreviewInit) { wavePreview.init(ins,wavePreviewLen,wavePreviewHeight,true); + wavePreviewAccum=0.0f; wavePreviewInit=false; } float wavePreview1[257]; @@ -3315,7 +3316,19 @@ void FurnaceGUI::insTabWavetable(DivInstrument* ins) wavePreview2[wave2->len]=wave2->data[wave2->len-1]; } if (ins->ws.enabled && (!wavePreviewPaused || wavePreviewInit)) { - wavePreview.tick(true); + if (wavePreviewInit) { + wavePreview.tick(true); + } else { + wavePreviewAccum+=ImGui::GetIO().DeltaTime; + double accumRate=e->getCurHz(); + if (accumRate<1.0) accumRate=1.0; + if (accumRate>1023.0) accumRate=1023.0; + accumRate=1.0/accumRate; + while (wavePreviewAccum>=accumRate) { + wavePreviewAccum-=accumRate; + wavePreview.tick(true); + } + } WAKE_UP; } for (int i=0; i