add a metronome

This commit is contained in:
tildearrow 2022-01-04 00:02:41 -05:00
parent 943e4e374f
commit 530a9bafc7
4 changed files with 66 additions and 0 deletions

View File

@ -2044,6 +2044,15 @@ void DivEngine::setView(DivStatusView which) {
view=which; view=which;
} }
bool DivEngine::getMetronome() {
return metronome;
}
void DivEngine::setMetronome(bool enable) {
metronome=enable;
metroAmp=0;
}
void DivEngine::setConsoleMode(bool enable) { void DivEngine::setConsoleMode(bool enable) {
consoleMode=enable; consoleMode=enable;
} }

View File

@ -106,6 +106,7 @@ class DivEngine {
bool consoleMode; bool consoleMode;
bool extValuePresent; bool extValuePresent;
bool repeatPattern; bool repeatPattern;
bool metronome;
int ticks, cycles, curRow, curOrder, remainingLoops, nextSpeed, clockDrift; int ticks, cycles, curRow, curOrder, remainingLoops, nextSpeed, clockDrift;
int changeOrd, changePos, totalTicks, totalCmds, lastCmds, cmdsPerSecond, globalPitch; int changeOrd, changePos, totalTicks, totalCmds, lastCmds, cmdsPerSecond, globalPitch;
unsigned char extValue; unsigned char extValue;
@ -136,6 +137,10 @@ class DivEngine {
int temp[3], prevSample[3]; int temp[3], prevSample[3];
short* bbIn[3]; short* bbIn[3];
short* bbOut[3]; short* bbOut[3];
unsigned char* metroTick;
size_t metroTickLen;
int metroPeriod, metroPos;
float metroAmp;
size_t totalProcessed; size_t totalProcessed;
@ -357,6 +362,12 @@ class DivEngine {
// set the console mode. // set the console mode.
void setConsoleMode(bool enable); void setConsoleMode(bool enable);
// get metronome
bool getMetronome();
// set metronome
void setMetronome(bool enable);
// public render samples // public render samples
void renderSamplesP(); void renderSamplesP();
@ -390,6 +401,7 @@ class DivEngine {
consoleMode(false), consoleMode(false),
extValuePresent(false), extValuePresent(false),
repeatPattern(false), repeatPattern(false),
metronome(false),
ticks(0), ticks(0),
cycles(0), cycles(0),
curRow(0), curRow(0),
@ -411,6 +423,11 @@ class DivEngine {
bbInLen(0), bbInLen(0),
temp{0,0}, temp{0,0},
prevSample{0,0}, prevSample{0,0},
metroTick(NULL),
metroTickLen(0),
metroPeriod(0),
metroPos(0),
metroAmp(0.0f),
totalProcessed(0), totalProcessed(0),
jediTable(NULL), jediTable(NULL),
adpcmMem(NULL) {} adpcmMem(NULL) {}

View File

@ -882,6 +882,14 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
bbInLen=runtotal+256; bbInLen=runtotal+256;
} }
if (metroTickLen<size) {
if (metroTick!=NULL) delete[] metroTick;
metroTick=new unsigned char[size];
metroTickLen=size;
}
memset(metroTick,0,size);
size_t runLeft=runtotal; size_t runLeft=runtotal;
size_t runPos=0; size_t runPos=0;
totalProcessed=0; totalProcessed=0;
@ -895,6 +903,14 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
runLeft-=cycles; runLeft-=cycles;
dispatch->acquire(bbIn[0],bbIn[1],runPos,cycles); dispatch->acquire(bbIn[0],bbIn[1],runPos,cycles);
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 (nextTick()) {
if (remainingLoops>0) { if (remainingLoops>0) {
remainingLoops--; 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; out[1][i]+=(float)bbOut[0][i]/16384.0;
} }
} }
if (metronome) for (size_t i=0; i<size; i++) {
if (metroTick[i]) {
if (metroTick[i]==2) {
metroPeriod=30;
} else {
metroPeriod=40;
}
metroPos=metroPeriod;
metroAmp=0.5f;
}
out[0][i]+=(metroPos>(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(); isBusy.unlock();
} }

View File

@ -273,6 +273,11 @@ void FurnaceGUI::drawEditControls() {
} }
ImGui::SameLine(); ImGui::SameLine();
ImGui::Checkbox("Edit",&edit); ImGui::Checkbox("Edit",&edit);
ImGui::SameLine();
bool metro=e->getMetronome();
if (ImGui::Checkbox("Metronome",&metro)) {
e->setMetronome(metro);
}
ImGui::Text("Follow"); ImGui::Text("Follow");
ImGui::SameLine(); ImGui::SameLine();