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