diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index b8b18cb40..d24700fe9 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -2025,6 +2025,10 @@ void DivEngine::setMetronome(bool enable) { metroAmp=0; } +void DivEngine::setMetronomeVol(float vol) { + metroVol=vol; +} + void DivEngine::setConsoleMode(bool enable) { consoleMode=enable; } @@ -2196,6 +2200,9 @@ bool DivEngine::initAudioBackend() { lowQuality=getConfInt("audioQuality",0); forceMono=getConfInt("forceMono",0); + metroVol=(float)(getConfInt("metroVol",100))/100.0f; + if (metroVol<0.0f) metroVol=0.0f; + if (metroVol>2.0f) metroVol=2.0f; switch (audioEngine) { case DIV_AUDIO_JACK: diff --git a/src/engine/engine.h b/src/engine/engine.h index 6b93666bf..bde102a27 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -252,6 +252,7 @@ class DivEngine { size_t metroTickLen; float metroFreq, metroPos; float metroAmp; + float metroVol; size_t totalProcessed; @@ -622,6 +623,9 @@ class DivEngine { // set metronome void setMetronome(bool enable); + // set metronome volume (1.0 = 100%) + void setMetronomeVol(float vol); + // halt now void halt(); @@ -772,6 +776,7 @@ class DivEngine { metroFreq(0), metroPos(0), metroAmp(0.0f), + metroVol(1.0f), totalProcessed(0), oscBuf{NULL,NULL}, oscSize(1), diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 05cb890c5..240209943 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -1925,8 +1925,8 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi metroAmp=0.7f; } if (metroAmp>0.0f) { - out[0][i]+=(sin(metroPos*2*M_PI))*metroAmp; - out[1][i]+=(sin(metroPos*2*M_PI))*metroAmp; + out[0][i]+=(sin(metroPos*2*M_PI))*metroAmp*metroVol; + out[1][i]+=(sin(metroPos*2*M_PI))*metroAmp*metroVol; } metroAmp-=0.0003f; if (metroAmp<0.0f) metroAmp=0.0f; diff --git a/src/gui/gui.h b/src/gui/gui.h index ad20d8e7d..84292825f 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -810,6 +810,7 @@ class FurnaceGUI { int oscBorder; int separateFMColors; int insEditColorize; + int metroVol; unsigned int maxUndoSteps; String mainFontPath; String patFontPath; @@ -876,6 +877,7 @@ class FurnaceGUI { oscBorder(1), separateFMColors(0), insEditColorize(0), + metroVol(100), maxUndoSteps(100), mainFontPath(""), patFontPath(""), diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index b823fb88e..7dc6478e0 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -198,9 +198,6 @@ struct MappedInput { scan(s), val(v) {} }; -// TODO: -// - add metronome volume setting -// - maybe add metronome sound setting void FurnaceGUI::drawSettings() { if (nextWindow==GUI_WINDOW_SETTINGS) { settingsOpen=true; @@ -385,6 +382,14 @@ void FurnaceGUI::drawSettings() { ImGui::SameLine(); ImGui::Combo("##Quality",&settings.audioQuality,audioQualities,2); + ImGui::Text("Metronome volume"); + ImGui::SameLine(); + if (ImGui::SliderInt("##MetroVol",&settings.metroVol,0,200,"%d%%")) { + if (settings.metroVol<0) settings.metroVol=0; + if (settings.metroVol>200) settings.metroVol=200; + e->setMetronomeVol(((float)settings.metroVol)/100.0f); + } + bool forceMonoB=settings.forceMono; if (ImGui::Checkbox("Force mono audio",&forceMonoB)) { settings.forceMono=forceMonoB; @@ -1562,6 +1567,7 @@ void FurnaceGUI::syncSettings() { settings.oscBorder=e->getConfInt("oscBorder",1); settings.separateFMColors=e->getConfInt("separateFMColors",0); settings.insEditColorize=e->getConfInt("insEditColorize",0); + settings.metroVol=e->getConfInt("metroVol",100); clampSetting(settings.mainFontSize,2,96); clampSetting(settings.patFontSize,2,96); @@ -1617,6 +1623,7 @@ void FurnaceGUI::syncSettings() { clampSetting(settings.sampleLayout,0,1); clampSetting(settings.separateFMColors,0,1); clampSetting(settings.insEditColorize,0,1); + clampSetting(settings.metroVol,0,200); // keybinds for (int i=0; isetMidiDirect(midiMap.directChannel); + e->setMetronomeVol(((float)settings.metroVol)/100.0f); } void FurnaceGUI::commitSettings() { @@ -1698,6 +1706,7 @@ void FurnaceGUI::commitSettings() { e->setConf("oscBorder",settings.oscBorder); e->setConf("separateFMColors",settings.separateFMColors); e->setConf("insEditColorize",settings.insEditColorize); + e->setConf("metroVol",settings.metroVol); // colors for (int i=0; i