option to change the piano hit key color mode

This commit is contained in:
Eknous-P 2025-12-07 21:31:23 +04:00
parent 9d4da19ab5
commit 19c78955bb
3 changed files with 49 additions and 4 deletions

View file

@ -8390,6 +8390,7 @@ void FurnaceGUI::syncState() {
pianoView=e->getConfInt("pianoView",pianoView);
pianoInputPadMode=e->getConfInt("pianoInputPadMode",pianoInputPadMode);
pianoLabelsMode=e->getConfInt("pianoLabelsMode",pianoLabelsMode);
pianoKeyColorMode=e->getConfInt("pianoKeyColorMode",pianoKeyColorMode);
chanOscCols=e->getConfInt("chanOscCols",3);
chanOscAutoCols=e->getConfBool("chanOscAutoColsType",0);
@ -8563,6 +8564,7 @@ void FurnaceGUI::commitState(DivConfig& conf) {
conf.set("pianoView",pianoView);
conf.set("pianoInputPadMode",pianoInputPadMode);
conf.set("pianoLabelsMode",pianoLabelsMode);
conf.set("pianoKeyColorMode",pianoKeyColorMode);
// commit per-chan osc state
conf.set("chanOscCols",chanOscCols);
@ -9252,6 +9254,7 @@ FurnaceGUI::FurnaceGUI():
pianoView(PIANO_LAYOUT_AUTOMATIC),
pianoInputPadMode(PIANO_INPUT_PAD_SPLIT_AUTO),
pianoLabelsMode(PIANO_LABELS_OCTAVE),
pianoKeyColorMode(PIANO_KEY_COLOR_SINGLE),
#else
pianoOctaves(7),
pianoOctavesEdit(4),
@ -9263,6 +9266,7 @@ FurnaceGUI::FurnaceGUI():
pianoView(PIANO_LAYOUT_STANDARD),
pianoInputPadMode(PIANO_INPUT_PAD_DISABLE),
pianoLabelsMode(PIANO_LABELS_OCTAVE),
pianoKeyColorMode(PIANO_KEY_COLOR_SINGLE),
#endif
hasACED(false),
waveGenBaseShape(0),

View file

@ -2841,6 +2841,12 @@ class FurnaceGUI {
PIANO_LABELS_OCTAVE_NOTE
};
enum PianoKeyColorMode {
PIANO_KEY_COLOR_SINGLE=0,
PIANO_KEY_COLOR_CHANNEL,
PIANO_KEY_COLOR_INSTRUMENT
};
int pianoOctaves, pianoOctavesEdit;
bool pianoOptions, pianoSharePosition, pianoOptionsSet;
struct pianoKeyState {
@ -2851,7 +2857,7 @@ class FurnaceGUI {
bool pianoKeyPressed[180];
bool pianoReadonly;
int pianoOffset, pianoOffsetEdit;
int pianoView, pianoInputPadMode, pianoLabelsMode;
int pianoView, pianoInputPadMode, pianoLabelsMode, pianoKeyColorMode;
// effect sorting / searching
bool effectsShow[10];
@ -2980,6 +2986,7 @@ class FurnaceGUI {
bool portSet(String label, unsigned int portSetID, int ins, int outs, int activeIns, int activeOuts, int& clickedPort, std::map<unsigned int,ImVec2>& portPos);
// piano
ImVec4 pianoKeyColor(int chan, ImVec4 fallback);
void pianoLabel(ImDrawList* dl, ImVec2& p0, ImVec2& p1, int note);
void updateWindowTitle();

View file

@ -33,6 +33,28 @@
} \
}
ImVec4 FurnaceGUI::pianoKeyColor(int chan, ImVec4 fallback) {
switch (pianoKeyColorMode) {
case PIANO_KEY_COLOR_CHANNEL:
return e->curSubSong->chanColor[chan]?ImGui::ColorConvertU32ToFloat4(e->curSubSong->chanColor[chan]):uiColors[GUI_COLOR_CHANNEL_FM+e->getChannelType(chan)];
case PIANO_KEY_COLOR_INSTRUMENT: {
DivChannelState* state=e->getChanState(chan);
if (state) {
int ins=state->lastIns;
if (ins>=0) {
int type=e->getIns(ins)->type;
if (type>DIV_INS_MAX) return uiColors[GUI_COLOR_INSTR_UNKNOWN];
else return uiColors[GUI_COLOR_INSTR_STD+type];
}
}
}
// intentional fallthrough
case PIANO_KEY_COLOR_SINGLE:
default:
return fallback;
}
}
void FurnaceGUI::pianoLabel(ImDrawList* dl, ImVec2& p0, ImVec2& p1, int note) {
switch (pianoLabelsMode) {
case PIANO_LABELS_OFF:
@ -175,6 +197,18 @@ void FurnaceGUI::drawPiano() {
pianoLabelsMode=PIANO_LABELS_OCTAVE_NOTE;
}
ImGui::Unindent();
ImGui::Text(_("Key colors:"));
ImGui::Indent();
if (ImGui::RadioButton(_("Single##keyColor0"),pianoKeyColorMode==PIANO_KEY_COLOR_SINGLE)) {
pianoKeyColorMode=PIANO_KEY_COLOR_SINGLE;
}
if (ImGui::RadioButton(_("Channel color##keyColor1"),pianoKeyColorMode==PIANO_KEY_COLOR_CHANNEL)) {
pianoKeyColorMode=PIANO_KEY_COLOR_CHANNEL;
}
if (ImGui::RadioButton(_("instrument color##keyColor2"),pianoKeyColorMode==PIANO_KEY_COLOR_INSTRUMENT)) {
pianoKeyColorMode=PIANO_KEY_COLOR_INSTRUMENT;
}
ImGui::Unindent();
ImGui::Checkbox(_("Share play/edit offset/range"),&pianoSharePosition);
ImGui::Checkbox(_("Read-only (can't input notes)"),&pianoReadonly);
ImGui::EndPopup();
@ -302,7 +336,7 @@ void FurnaceGUI::drawPiano() {
if (pianoKeyPressed[note]) {
color=isTopKey[i%12]?uiColors[GUI_COLOR_PIANO_KEY_TOP_ACTIVE]:uiColors[GUI_COLOR_PIANO_KEY_BOTTOM_ACTIVE];
} else {
ImVec4 colorHit=1?channelColor(pianoKeyHit[note].chan):(isTopKey[i%12]?uiColors[GUI_COLOR_PIANO_KEY_TOP_HIT]:uiColors[GUI_COLOR_PIANO_KEY_BOTTOM_HIT]);
ImVec4 colorHit=pianoKeyColor(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;
@ -360,7 +394,7 @@ void FurnaceGUI::drawPiano() {
if (pianoKeyPressed[note]) {
color=uiColors[GUI_COLOR_PIANO_KEY_BOTTOM_ACTIVE];
} else {
ImVec4 colorHit=1?channelColor(pianoKeyHit[note].chan):uiColors[GUI_COLOR_PIANO_KEY_BOTTOM_HIT];
ImVec4 colorHit=pianoKeyColor(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;
@ -388,7 +422,7 @@ void FurnaceGUI::drawPiano() {
if (pianoKeyPressed[note]) {
color=uiColors[GUI_COLOR_PIANO_KEY_TOP_ACTIVE];
} else {
ImVec4 colorHit=1?channelColor(pianoKeyHit[note].chan):uiColors[GUI_COLOR_PIANO_KEY_TOP_HIT];
ImVec4 colorHit=pianoKeyColor(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;