diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index ab04f7830..f6861edca 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -9385,7 +9385,7 @@ FurnaceGUI::FurnaceGUI(): memset(lastAudioLoads,0,sizeof(float)*120); - memset(pianoKeyHit,0,sizeof(float)*180); + memset(pianoKeyHit,0,sizeof(pianoKeyState)*180); // posiblly repace with a for loop memset(pianoKeyPressed,0,sizeof(bool)*180); memset(queryReplaceEffectMode,0,sizeof(int)*8); diff --git a/src/gui/gui.h b/src/gui/gui.h index 0a0076e57..e83bf0900 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2090,6 +2090,7 @@ class FurnaceGUI { int sampleImportInstDetune; int mixerStyle; int mixerLayout; + float channelFeedbackGamma; String mainFontPath; String headFontPath; String patFontPath; @@ -2344,6 +2345,7 @@ class FurnaceGUI { sampleImportInstDetune(0), mixerStyle(1), mixerLayout(0), + channelFeedbackGamma(1.0f), mainFontPath(""), headFontPath(""), patFontPath(""), @@ -2839,7 +2841,11 @@ class FurnaceGUI { int pianoOctaves, pianoOctavesEdit; bool pianoOptions, pianoSharePosition, pianoOptionsSet; - float pianoKeyHit[180]; + struct pianoKeyState { + float value; + int chan; + }; + pianoKeyState pianoKeyHit[180]; bool pianoKeyPressed[180]; bool pianoReadonly; int pianoOffset, pianoOffsetEdit; diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index 46f799c27..65f45cb0c 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -666,7 +666,8 @@ void FurnaceGUI::drawPattern() { if (!muted) { int note=e->getChanState(i)->note+60; if (note>=0 && note<180) { - pianoKeyHit[note]=1.0; + pianoKeyHit[note].value=1.0; + pianoKeyHit[note].chan=i; } } } @@ -679,7 +680,8 @@ void FurnaceGUI::drawPattern() { if (!muted) { int note=e->getChanState(i)->note+60; if (note>=0 && note<180) { - pianoKeyHit[note]=amount; + pianoKeyHit[note].value=amount; + pianoKeyHit[note].chan=i; } } } else if (settings.channelFeedbackStyle==3 && e->isRunning()) { @@ -688,7 +690,19 @@ void FurnaceGUI::drawPattern() { if (!muted) { int note=e->getChanState(i)->note+60; if (note>=0 && note<180) { - pianoKeyHit[note]=active?1.0f:0.0f; + pianoKeyHit[note].value=active?1.0f:0.0f; + pianoKeyHit[note].chan=i; + } + } + } else if (settings.channelFeedbackStyle==4 && e->isRunning()) { + float amount=powf(chanOscVol[i],settings.channelFeedbackGamma); + if (!e->getChanState(i)->keyOn) amount=0.0f; + keyHit[i]=amount*0.2f; + if (!muted) { + int note=e->getChanState(i)->note+60; + if (note>=0 && note<180) { + pianoKeyHit[note].value=amount; + pianoKeyHit[note].chan=i; } } } diff --git a/src/gui/piano.cpp b/src/gui/piano.cpp index 6bcfbdda1..3df1c187e 100644 --- a/src/gui/piano.cpp +++ b/src/gui/piano.cpp @@ -297,12 +297,12 @@ void FurnaceGUI::drawPiano() { int note=i+12*off; if (note<0) continue; if (note>=180) continue; - float pkh=pianoKeyHit[note]; + float pkh=pianoKeyHit[note].value; ImVec4 color=isTopKey[i%12]?uiColors[GUI_COLOR_PIANO_KEY_TOP]:uiColors[GUI_COLOR_PIANO_KEY_BOTTOM]; if (pianoKeyPressed[note]) { color=isTopKey[i%12]?uiColors[GUI_COLOR_PIANO_KEY_TOP_ACTIVE]:uiColors[GUI_COLOR_PIANO_KEY_BOTTOM_ACTIVE]; } else { - ImVec4 colorHit=isTopKey[i%12]?uiColors[GUI_COLOR_PIANO_KEY_TOP_HIT]:uiColors[GUI_COLOR_PIANO_KEY_BOTTOM_HIT]; + ImVec4 colorHit=1?channelColor(pianoKeyHit[note].chan):(isTopKey[i%12]?uiColors[GUI_COLOR_PIANO_KEY_TOP_HIT]:uiColors[GUI_COLOR_PIANO_KEY_BOTTOM_HIT]); color.x+=(colorHit.x-color.x)*pkh; color.y+=(colorHit.y-color.y)*pkh; color.z+=(colorHit.z-color.z)*pkh; @@ -355,12 +355,12 @@ void FurnaceGUI::drawPiano() { if (note<0) continue; if (note>=180) continue; - float pkh=pianoKeyHit[note]; + float pkh=pianoKeyHit[note].value; ImVec4 color=uiColors[GUI_COLOR_PIANO_KEY_BOTTOM]; if (pianoKeyPressed[note]) { color=uiColors[GUI_COLOR_PIANO_KEY_BOTTOM_ACTIVE]; } else { - ImVec4 colorHit=uiColors[GUI_COLOR_PIANO_KEY_BOTTOM_HIT]; + ImVec4 colorHit=1?channelColor(pianoKeyHit[note].chan):uiColors[GUI_COLOR_PIANO_KEY_BOTTOM_HIT]; color.x+=(colorHit.x-color.x)*pkh; color.y+=(colorHit.y-color.y)*pkh; color.z+=(colorHit.z-color.z)*pkh; @@ -383,12 +383,12 @@ void FurnaceGUI::drawPiano() { int note=topKeyNotes[j]+12*(i+off); if (note<0) continue; if (note>=180) continue; - float pkh=pianoKeyHit[note]; + float pkh=pianoKeyHit[note].value; ImVec4 color=uiColors[GUI_COLOR_PIANO_KEY_TOP]; if (pianoKeyPressed[note]) { color=uiColors[GUI_COLOR_PIANO_KEY_TOP_ACTIVE]; } else { - ImVec4 colorHit=uiColors[GUI_COLOR_PIANO_KEY_TOP_HIT]; + ImVec4 colorHit=1?channelColor(pianoKeyHit[note].chan):uiColors[GUI_COLOR_PIANO_KEY_TOP_HIT]; color.x+=(colorHit.x-color.x)*pkh; color.y+=(colorHit.y-color.y)*pkh; color.z+=(colorHit.z-color.z)*pkh; @@ -407,8 +407,8 @@ void FurnaceGUI::drawPiano() { const float reduction=ImGui::GetIO().DeltaTime*60.0f*0.12; for (int i=0; i<180; i++) { - pianoKeyHit[i]-=reduction; - if (pianoKeyHit[i]<0) pianoKeyHit[i]=0; + pianoKeyHit[i].value-=reduction; + if (pianoKeyHit[i].value<0) pianoKeyHit[i].value=0; } } diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 7c785d169..ea614b76e 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -3505,6 +3505,19 @@ void FurnaceGUI::drawSettings() { settings.channelFeedbackStyle=3; settingsChanged=true; } + if (ImGui::RadioButton(_("Volume (Real)##CHF4"),settings.channelFeedbackStyle==4)) { + settings.channelFeedbackStyle=4; + settingsChanged=true; + } + if (settings.channelFeedbackStyle==4) { + ImGui::Indent(); + if (ImGui::SliderFloat(_("Gamma##CHF"),&settings.channelFeedbackGamma,0.0f,2.0f)) { + if (settings.channelFeedbackGamma<0.0f) settings.channelFeedbackGamma=0.0f; + if (settings.channelFeedbackGamma>2.0f) settings.channelFeedbackGamma=2.0f; + settingsChanged=true; + } + ImGui::Unindent(); + } ImGui::Unindent(); ImGui::Text(_("Channel font:")); @@ -5123,6 +5136,7 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { settings.channelStyle=conf.getInt("channelStyle",1); settings.channelVolStyle=conf.getInt("channelVolStyle",0); settings.channelFeedbackStyle=conf.getInt("channelFeedbackStyle",1); + settings.channelFeedbackGamma=conf.getFloat("channelFeedbackGamma",1.0f); settings.channelFont=conf.getInt("channelFont",1); settings.channelTextCenter=conf.getInt("channelTextCenter",1); @@ -5399,7 +5413,8 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { clampSetting(settings.channelTextColors,0,2); clampSetting(settings.channelStyle,0,5); clampSetting(settings.channelVolStyle,0,4); - clampSetting(settings.channelFeedbackStyle,0,3); + clampSetting(settings.channelFeedbackStyle,0,4); + clampSetting(settings.channelFeedbackGamma,0.0f,2.0f); clampSetting(settings.channelFont,0,1); clampSetting(settings.channelTextCenter,0,1); clampSetting(settings.maxRecentFile,0,30); @@ -5711,6 +5726,7 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("channelStyle",settings.channelStyle); conf.set("channelVolStyle",settings.channelVolStyle); conf.set("channelFeedbackStyle",settings.channelFeedbackStyle); + conf.set("channelFeedbackGamma",settings.channelFeedbackGamma); conf.set("channelFont",settings.channelFont); conf.set("channelTextCenter",settings.channelTextCenter);