From 530a9bafc7fefd93849a8dd44f9478432900fede Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 4 Jan 2022 00:02:41 -0500 Subject: [PATCH] add a metronome --- src/engine/engine.cpp | 9 +++++++++ src/engine/engine.h | 17 +++++++++++++++++ src/engine/playback.cpp | 35 +++++++++++++++++++++++++++++++++++ src/gui/gui.cpp | 5 +++++ 4 files changed, 66 insertions(+) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index d336dac54..f507ec64f 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -2044,6 +2044,15 @@ void DivEngine::setView(DivStatusView which) { view=which; } +bool DivEngine::getMetronome() { + return metronome; +} + +void DivEngine::setMetronome(bool enable) { + metronome=enable; + metroAmp=0; +} + void DivEngine::setConsoleMode(bool enable) { consoleMode=enable; } diff --git a/src/engine/engine.h b/src/engine/engine.h index 29a880afd..fede7dde6 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -106,6 +106,7 @@ class DivEngine { bool consoleMode; bool extValuePresent; bool repeatPattern; + bool metronome; int ticks, cycles, curRow, curOrder, remainingLoops, nextSpeed, clockDrift; int changeOrd, changePos, totalTicks, totalCmds, lastCmds, cmdsPerSecond, globalPitch; unsigned char extValue; @@ -136,6 +137,10 @@ class DivEngine { int temp[3], prevSample[3]; short* bbIn[3]; short* bbOut[3]; + unsigned char* metroTick; + size_t metroTickLen; + int metroPeriod, metroPos; + float metroAmp; size_t totalProcessed; @@ -356,6 +361,12 @@ class DivEngine { // set the console mode. void setConsoleMode(bool enable); + + // get metronome + bool getMetronome(); + + // set metronome + void setMetronome(bool enable); // public render samples void renderSamplesP(); @@ -390,6 +401,7 @@ class DivEngine { consoleMode(false), extValuePresent(false), repeatPattern(false), + metronome(false), ticks(0), cycles(0), curRow(0), @@ -411,6 +423,11 @@ class DivEngine { bbInLen(0), temp{0,0}, prevSample{0,0}, + metroTick(NULL), + metroTickLen(0), + metroPeriod(0), + metroPos(0), + metroAmp(0.0f), totalProcessed(0), jediTable(NULL), adpcmMem(NULL) {} diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index eb1cd41f7..d000913ee 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -882,6 +882,14 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi bbInLen=runtotal+256; } + if (metroTickLenacquire(bbIn[0],bbIn[1],runPos,cycles); runPos+=cycles; + unsigned int realPos=(runPos*size)/runtotal; + if (realPos>=size) realPos=size-1; + if (song.hilightA>0) { + if ((curRow%song.hilightA)==0 && ticks==1) metroTick[realPos]=1; + } + if (song.hilightB>0) { + if ((curRow%song.hilightB)==0 && ticks==1) metroTick[realPos]=2; + } if (nextTick()) { if (remainingLoops>0) { remainingLoops--; @@ -947,5 +963,24 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi out[1][i]+=(float)bbOut[0][i]/16384.0; } } + + if (metronome) for (size_t i=0; i(metroPeriod>>1))*metroAmp; + out[1][i]+=(metroPos>(metroPeriod>>1))*metroAmp; + metroAmp-=0.0002f; + if (metroAmp<0.0f) metroAmp=0.0f; + if (--metroPos<=0) { + metroPos=metroPeriod; + } + } isBusy.unlock(); } diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 829058811..805927b02 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -273,6 +273,11 @@ void FurnaceGUI::drawEditControls() { } ImGui::SameLine(); ImGui::Checkbox("Edit",&edit); + ImGui::SameLine(); + bool metro=e->getMetronome(); + if (ImGui::Checkbox("Metronome",&metro)) { + e->setMetronome(metro); + } ImGui::Text("Follow"); ImGui::SameLine();