diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 6ad37fff4..55569a620 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -5235,9 +5235,15 @@ FurnaceGUI::FurnaceGUI(): memset(waveGenAmp,0,sizeof(float)*16); memset(waveGenPhase,0,sizeof(float)*16); - memset(waveGenTL,0,sizeof(float)*4); - memset(waveGenMult,0,sizeof(int)*4); - memset(waveGenFB,0,sizeof(float)*4); + waveGenTL[0]=0.0f; + waveGenTL[1]=0.0f; + waveGenTL[2]=0.0f; + waveGenTL[3]=1.0f; + waveGenMult[0]=1; + waveGenMult[1]=1; + waveGenMult[2]=1; + waveGenMult[3]=1; + memset(waveGenFB,0,sizeof(int)*4); memset(waveGenFMCon1,0,sizeof(bool)*4); memset(waveGenFMCon2,0,sizeof(bool)*3); memset(waveGenFMCon3,0,sizeof(bool)*2); diff --git a/src/gui/gui.h b/src/gui/gui.h index 797f9fd71..7a67ac374 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1566,7 +1566,7 @@ class FurnaceGUI { float waveGenPhase[16]; float waveGenTL[4]; int waveGenMult[4]; - float waveGenFB[4]; + int waveGenFB[4]; bool waveGenFMCon1[4]; bool waveGenFMCon2[3]; bool waveGenFMCon3[2]; diff --git a/src/gui/waveEdit.cpp b/src/gui/waveEdit.cpp index 9842d808b..80f3a3419 100644 --- a/src/gui/waveEdit.cpp +++ b/src/gui/waveEdit.cpp @@ -61,12 +61,31 @@ void FurnaceGUI::doGenerateWave() { if (wave->len<2) return; if (waveGenFM) { + float s0fb0=0; + float s0fb1=0; + float s1fb0=0; + float s1fb1=0; + float s2fb0=0; + float s2fb1=0; + float s3fb0=0; + float s3fb1=0; for (int i=0; ilen; i++) { float pos=(float)i/(float)wave->len; - float s0=sin(pos*multFactors[waveGenMult[0]])*waveGenTL[0]; - float s1=sin((pos+(waveGenFMCon1[0]?s0:0.0f))*multFactors[waveGenMult[1]])*waveGenTL[1]; - float s2=sin((pos+(waveGenFMCon1[1]?s0:0.0f)+(waveGenFMCon2[0]?s1:0.0f))*multFactors[waveGenMult[2]])*waveGenTL[2]; - float s3=sin((pos+(waveGenFMCon1[2]?s0:0.0f)+(waveGenFMCon2[1]?s1:0.0f)+(waveGenFMCon3[0]?s2:0.0f))*multFactors[waveGenMult[3]])*waveGenTL[3]; + float s0=sin((pos+(waveGenFB[0]?((s0fb0+s0fb1)*pow(2.0f,waveGenFB[0]-8)):0.0f))*multFactors[waveGenMult[0]])*waveGenTL[0]; + s0fb0=s0fb1; + s0fb1=s0; + + float s1=sin((pos+(waveGenFB[1]?((s1fb0+s1fb1)*pow(2.0f,waveGenFB[1]-8)):0.0f)+(waveGenFMCon1[0]?s0:0.0f))*multFactors[waveGenMult[1]])*waveGenTL[1]; + s1fb0=s1fb1; + s1fb1=s1; + + float s2=sin((pos+(waveGenFB[2]?((s2fb0+s2fb1)*pow(2.0f,waveGenFB[2]-8)):0.0f)+(waveGenFMCon1[1]?s0:0.0f)+(waveGenFMCon2[0]?s1:0.0f))*multFactors[waveGenMult[2]])*waveGenTL[2]; + s2fb0=s2fb1; + s2fb1=s2; + + float s3=sin((pos+(waveGenFB[3]?((s3fb0+s3fb1)*pow(2.0f,waveGenFB[3]-8)):0.0f)+(waveGenFMCon1[2]?s0:0.0f)+(waveGenFMCon2[1]?s1:0.0f)+(waveGenFMCon3[0]?s2:0.0f))*multFactors[waveGenMult[3]])*waveGenTL[3]; + s3fb0=s3fb1; + s3fb1=s3; if (waveGenFMCon1[3]) finalResult[i]+=s0; if (waveGenFMCon2[2]) finalResult[i]+=s1; @@ -394,7 +413,7 @@ void FurnaceGUI::drawWaveEdit() { ImGui::TableNextColumn(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); ImGui::PushID(i); - if (CWSliderFloat("##WGFB",&waveGenFB[i],0.0f,7.0f)) { + if (CWSliderInt("##WGFB",&waveGenFB[i],0,7)) { doGenerateWave(); } ImGui::PopID();