add option for soft-clipping

This commit is contained in:
tildearrow 2022-07-25 18:41:47 -05:00
parent b0c2b10135
commit 09e457003b
5 changed files with 20 additions and 0 deletions

View file

@ -2996,6 +2996,7 @@ bool DivEngine::initAudioBackend() {
lowQuality=getConfInt("audioQuality",0); lowQuality=getConfInt("audioQuality",0);
forceMono=getConfInt("forceMono",0); forceMono=getConfInt("forceMono",0);
clampSamples=getConfInt("clampSamples",0);
lowLatency=getConfInt("lowLatency",0); lowLatency=getConfInt("lowLatency",0);
metroVol=(float)(getConfInt("metroVol",100))/100.0f; metroVol=(float)(getConfInt("metroVol",100))/100.0f;
if (metroVol<0.0f) metroVol=0.0f; if (metroVol<0.0f) metroVol=0.0f;

View file

@ -298,6 +298,7 @@ class DivEngine {
bool stopExport; bool stopExport;
bool halted; bool halted;
bool forceMono; bool forceMono;
bool clampSamples;
bool cmdStreamEnabled; bool cmdStreamEnabled;
bool softLocked; bool softLocked;
bool firstTick; bool firstTick;

View file

@ -1413,6 +1413,14 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
out[1][i]=out[0][i]; out[1][i]=out[0][i];
} }
} }
if (clampSamples) {
for (size_t i=0; i<size; i++) {
if (out[0][i]<-1.0) out[0][i]=-1.0;
if (out[0][i]>1.0) out[0][i]=1.0;
if (out[1][i]<-1.0) out[1][i]=-1.0;
if (out[1][i]>1.0) out[1][i]=1.0;
}
}
isBusy.unlock(); isBusy.unlock();
std::chrono::steady_clock::time_point ts_processEnd=std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point ts_processEnd=std::chrono::steady_clock::now();

View file

@ -1094,6 +1094,7 @@ class FurnaceGUI {
int dragMovesSelection; int dragMovesSelection;
int unsignedDetune; int unsignedDetune;
int noThreadedInput; int noThreadedInput;
int clampSamples;
unsigned int maxUndoSteps; unsigned int maxUndoSteps;
String mainFontPath; String mainFontPath;
String patFontPath; String patFontPath;
@ -1199,6 +1200,7 @@ class FurnaceGUI {
dragMovesSelection(1), dragMovesSelection(1),
unsignedDetune(0), unsignedDetune(0),
noThreadedInput(0), noThreadedInput(0),
clampSamples(0),
maxUndoSteps(100), maxUndoSteps(100),
mainFontPath(""), mainFontPath(""),
patFontPath(""), patFontPath(""),

View file

@ -659,6 +659,11 @@ void FurnaceGUI::drawSettings() {
settings.forceMono=forceMonoB; settings.forceMono=forceMonoB;
} }
bool clampSamplesB=settings.clampSamples;
if (ImGui::Checkbox("Software clipping",&clampSamplesB)) {
settings.clampSamples=clampSamplesB;
}
TAAudioDesc& audioWant=e->getAudioDescWant(); TAAudioDesc& audioWant=e->getAudioDescWant();
TAAudioDesc& audioGot=e->getAudioDescGot(); TAAudioDesc& audioGot=e->getAudioDescGot();
@ -2118,6 +2123,7 @@ void FurnaceGUI::syncSettings() {
settings.unsignedDetune=e->getConfInt("unsignedDetune",0); settings.unsignedDetune=e->getConfInt("unsignedDetune",0);
settings.noThreadedInput=e->getConfInt("noThreadedInput",0); settings.noThreadedInput=e->getConfInt("noThreadedInput",0);
settings.initialSysName=e->getConfString("initialSysName",""); settings.initialSysName=e->getConfString("initialSysName","");
settings.clampSamples=e->getConfInt("clampSamples",0);
clampSetting(settings.mainFontSize,2,96); clampSetting(settings.mainFontSize,2,96);
clampSetting(settings.patFontSize,2,96); clampSetting(settings.patFontSize,2,96);
@ -2205,6 +2211,7 @@ void FurnaceGUI::syncSettings() {
clampSetting(settings.dragMovesSelection,0,2); clampSetting(settings.dragMovesSelection,0,2);
clampSetting(settings.unsignedDetune,0,1); clampSetting(settings.unsignedDetune,0,1);
clampSetting(settings.noThreadedInput,0,1); clampSetting(settings.noThreadedInput,0,1);
clampSetting(settings.clampSamples,0,1);
settings.initialSys=e->decodeSysDesc(e->getConfString("initialSys","")); settings.initialSys=e->decodeSysDesc(e->getConfString("initialSys",""));
if (settings.initialSys.size()<4) { if (settings.initialSys.size()<4) {
@ -2343,6 +2350,7 @@ void FurnaceGUI::commitSettings() {
e->setConf("dragMovesSelection",settings.dragMovesSelection); e->setConf("dragMovesSelection",settings.dragMovesSelection);
e->setConf("unsignedDetune",settings.unsignedDetune); e->setConf("unsignedDetune",settings.unsignedDetune);
e->setConf("noThreadedInput",settings.noThreadedInput); e->setConf("noThreadedInput",settings.noThreadedInput);
e->setConf("clampSamples",settings.clampSamples);
// colors // colors
for (int i=0; i<GUI_COLOR_MAX; i++) { for (int i=0; i<GUI_COLOR_MAX; i++) {