diff --git a/plugins/editor/layout/main.fl b/plugins/editor/layout/main.fl index 588466f1..86ef24ca 100644 --- a/plugins/editor/layout/main.fl +++ b/plugins/editor/layout/main.fl @@ -60,9 +60,9 @@ widget_class mainView {open xywh {195 11 250 31} labelsize 20 align 20 class ClickableLabel } - Fl_Box {} { - label {Key switch:} - xywh {195 44 250 30} labelsize 20 align 20 + Fl_Box keyswitchLabel_ { + label {Key switch:} selected + xywh {195 44 360 30} labelsize 20 align 20 class Label } Fl_Box {} { @@ -221,7 +221,7 @@ widget_class mainView {open class LogicalGroup } { Fl_Group {} { - label Engine open selected + label Engine open xywh {305 135 195 100} box ROUNDED_BOX labelsize 12 align 17 class TitleGroup } { diff --git a/plugins/editor/src/editor/Editor.cpp b/plugins/editor/src/editor/Editor.cpp index cceefe7a..9a9c77cb 100644 --- a/plugins/editor/src/editor/Editor.cpp +++ b/plugins/editor/src/editor/Editor.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,10 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { std::string userFilesDir_; std::string fallbackFilesDir_; + int currentKeyswitch_ = -1; + std::unordered_map keyswitchNames_; + std::string keyswitchLabelPrefix_; + SharedPointer memQueryTimer_; enum { @@ -102,6 +107,7 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { CTextLabel* tuningFrequencyLabel_ = nullptr; CControl *stretchedTuningSlider_ = nullptr; CTextLabel* stretchedTuningLabel_ = nullptr; + CTextLabel* keyswitchLabel_ = nullptr; STitleContainer* userFilesGroup_ = nullptr; STextButton* userFilesDirButton_ = nullptr; @@ -170,12 +176,17 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { void updateTuningFrequencyLabel(float tuningFrequency); void updateStretchedTuningLabel(float stretchedTuning); + absl::string_view getCurrentKeyswitchName() const; + void updateKeyswitchNameLabel(); + void updateKeyUsed(unsigned key, bool used); void updateKeyswitchUsed(unsigned key, bool used); void updateCCUsed(unsigned cc, bool used); void updateCCValue(unsigned cc, float value); void updateCCDefaultValue(unsigned cc, float value); void updateCCLabel(unsigned cc, const char* label); + void updateSWLastCurrent(int sw); + void updateSWLastLabel(unsigned sw, const char* label); void updateMemoryUsed(uint64_t mem); // edition of CC by UI @@ -436,7 +447,13 @@ void Editor::Impl::uiReceiveMessage(const char* path, const char* sig, const sfi for (unsigned key = 0; key < 128; ++key) { bool used = key < numBits && bits.test(key); updateKeyswitchUsed(key, used); + if (used) { + char pathBuf[256]; + sprintf(pathBuf, "/sw/last/%u/label", key); + sendQueuedOSC(pathBuf, "", nullptr); + } } + sendQueuedOSC("/sw/last/current", "", nullptr); } else if (Messages::matchOSC("/cc/slots", path, indices) && !strcmp(sig, "b")) { size_t numBits = 8 * args[0].b->size; @@ -476,6 +493,12 @@ void Editor::Impl::uiReceiveMessage(const char* path, const char* sig, const sfi else if (Messages::matchOSC("/cc&/label", path, indices) && !strcmp(sig, "s")) { updateCCLabel(indices[0], args[0].s); } + else if (Messages::matchOSC("/sw/last/current", path, indices) && !strcmp(sig, "i")) { + updateSWLastCurrent(args[0].i); + } + else if (Messages::matchOSC("/sw/last/&/label", path, indices) && !strcmp(sig, "s")) { + updateSWLastLabel(indices[0], args[0].s); + } else if (Messages::matchOSC("/mem/buffers", path, indices) && !strcmp(sig, "h")) { updateMemoryUsed(args[0].h); } @@ -808,6 +831,10 @@ void Editor::Impl::createFrameContents() mainView_ = owned(mainView); } + /// + if (keyswitchLabel_) + keyswitchLabelPrefix_ = std::string(keyswitchLabel_->getText()) + ' '; + /// SharedPointer fileDropTarget = owned(new SFileDropTarget); @@ -1347,6 +1374,27 @@ void Editor::Impl::updateStretchedTuningLabel(float stretchedTuning) label->setText(text); } +absl::string_view Editor::Impl::getCurrentKeyswitchName() const +{ + int sw = currentKeyswitch_; + if (sw == -1) + return {}; + + auto it = keyswitchNames_.find(static_cast(sw)); + if (it == keyswitchNames_.end()) + return {}; + + return it->second; +} + +void Editor::Impl::updateKeyswitchNameLabel() +{ + if (CTextLabel* label = keyswitchLabel_) { + std::string name { getCurrentKeyswitchName() }; + label->setText((keyswitchLabelPrefix_ + name).c_str()); + } +} + void Editor::Impl::updateKeyUsed(unsigned key, bool used) { if (SPiano* piano = piano_) @@ -1383,6 +1431,21 @@ void Editor::Impl::updateCCLabel(unsigned cc, const char* label) panel->setControlLabelText(cc, label); } +void Editor::Impl::updateSWLastCurrent(int sw) +{ + if (currentKeyswitch_ == sw) + return; + currentKeyswitch_ = sw; + updateKeyswitchNameLabel(); +} + +void Editor::Impl::updateSWLastLabel(unsigned sw, const char* label) +{ + keyswitchNames_[sw].assign(label); + if ((unsigned)currentKeyswitch_ == sw) + updateKeyswitchNameLabel(); +} + void Editor::Impl::updateMemoryUsed(uint64_t mem) { if (CTextLabel* label = memoryLabel_) { diff --git a/plugins/editor/src/editor/layout/main.hpp b/plugins/editor/src/editor/layout/main.hpp index e53cdeff..3a124a18 100644 --- a/plugins/editor/src/editor/layout/main.hpp +++ b/plugins/editor/src/editor/layout/main.hpp @@ -25,7 +25,8 @@ view__8->addView(view__10); auto* const view__11 = createClickableLabel(CRect(10, 6, 260, 37), kTagLoadSfzFile, "DefaultInstrument.sfz", kLeftText, 20); sfzFileLabel_ = view__11; view__8->addView(view__11); -auto* const view__12 = createLabel(CRect(10, 39, 260, 69), -1, "Key switch:", kLeftText, 20); +auto* const view__12 = createLabel(CRect(10, 39, 370, 69), -1, "Key switch:", kLeftText, 20); +keyswitchLabel_ = view__12; view__8->addView(view__12); auto* const view__13 = createLabel(CRect(10, 71, 70, 96), -1, "Voices:", kRightText, 12); view__8->addView(view__13);