diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 18d0ddd3b..b956c0a18 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -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), diff --git a/src/gui/gui.h b/src/gui/gui.h index add68e96e..ce2aaec8c 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -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& portPos); // piano + ImVec4 pianoKeyColor(int chan, ImVec4 fallback); void pianoLabel(ImDrawList* dl, ImVec2& p0, ImVec2& p1, int note); void updateWindowTitle(); diff --git a/src/gui/piano.cpp b/src/gui/piano.cpp index 3df1c187e..1659683f2 100644 --- a/src/gui/piano.cpp +++ b/src/gui/piano.cpp @@ -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;