diff --git a/modes/AudioApps/MEMLCeliumAudioApp.hpp b/modes/AudioApps/MEMLCeliumAudioApp.hpp index ba164c1..ad0392a 100644 --- a/modes/AudioApps/MEMLCeliumAudioApp.hpp +++ b/modes/AudioApps/MEMLCeliumAudioApp.hpp @@ -32,6 +32,26 @@ public: static constexpr float frequencies[nFREQs] = {100, 200, 400,800, 400, 800, 100,1600,100,400,100,50,1600,200,100,800,400}; static constexpr size_t nVoiceSpaces=7; + // Focus group bitmasks + static constexpr uint32_t kFocusSeq = (1u << 0); + static constexpr uint32_t kFocusSyn = (1u << 1); + + // Per-param group membership: params 0-13 = sequencer, 14-63 = synthesis + static constexpr std::array kParamGroupMask = { + // 0-13: sequencer (14 entries) + kFocusSeq, kFocusSeq, kFocusSeq, kFocusSeq, kFocusSeq, kFocusSeq, kFocusSeq, + kFocusSeq, kFocusSeq, kFocusSeq, kFocusSeq, kFocusSeq, kFocusSeq, kFocusSeq, + // 14-63: synthesis (50 entries) + kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, + kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, + kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, + kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, + kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, + kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, + kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, kFocusSyn, + kFocusSyn, + }; + std::array, nVoiceSpaces> voiceSpaces; VoiceSpaceFn currentVoiceSpace; diff --git a/modes/MEMLNautModeMEMLCelium.hpp b/modes/MEMLNautModeMEMLCelium.hpp index af40f5c..6e2d9ab 100644 --- a/modes/MEMLNautModeMEMLCelium.hpp +++ b/modes/MEMLNautModeMEMLCelium.hpp @@ -2,9 +2,11 @@ #include "../src/memllib/interface/MIDIInOut.hpp" #include "../src/memllib/hardware/memlnaut/display/XYPadView.hpp" +#include "../src/memllib/hardware/memlnaut/display/BlockSelectView.hpp" #include "../src/memllib/hardware/memlnaut/MEMLNaut.hpp" #include "AudioApps/MEMLCeliumAudioApp.hpp" #include "../src/memllib/examples/InterfaceRL.hpp" +#include "../src/memllib/audio/FocusManager.hpp" #include "../src/memllib/PicoDefs.hpp" #include "MEMLNautMode.hpp" #include @@ -22,6 +24,8 @@ public: bool sequencerPlaying = false; + FocusManager::kN_Params, 2> focusManager; + void setupInterface() { interface.setup(kN_InputParams, MEMLCeliumAudioApp<>::kN_Params); @@ -29,6 +33,13 @@ public: interface.setModeInfo("memlcelium", "MEMLCelium"); interfacePtr = make_non_owning(interface); + focusManager.setGroupName(0, "Seq"); + focusManager.setGroupName(1, "Synth"); + focusManager.setParamGroups(MEMLCeliumAudioApp<>::kParamGroupMask); + interface.paramTransformHook = [this](std::vector& p) { + focusManager.applyInPlace(p); + }; + MEMLNaut::Instance()->setTogA2Callback([this](bool state) { // scr_ref no longer captured directly Serial.println(state ? "TogA2 ON" : "TogA2 OFF"); if (state) { @@ -76,6 +87,19 @@ public: } void addViews() { + // Focus screen — select which parameter groups are live + auto focusView = std::make_shared( + "Focus", TFT_CYAN, 2, 120, 70, TFT_BLACK, + std::vector{"Seq", "Synth"}, TFT_DARKGREY, 2); + + focusView->SetOnSelectCallback([this, focusView](size_t id) { + size_t groupIdx = id - 1; + uint32_t newMask = focusManager.getSelectedMask() ^ (1u << groupIdx); + focusManager.setFocus(newMask, interface.getLastAction()); + focusView->toggleAlt(groupIdx); + }); + MEMLNaut::Instance()->disp->InsertViewAfter(interface.rlStatsView, focusView); + std::shared_ptr voiceSpaceSelectView; voiceSpaceSelectView = std::make_shared("Voice Spaces"); diff --git a/src/memllib b/src/memllib index 6bf7d2c..188496d 160000 --- a/src/memllib +++ b/src/memllib @@ -1 +1 @@ -Subproject commit 6bf7d2c362541047f02fdbf2f6dc359873bcd51f +Subproject commit 188496d4621cec7008d83404b80578597b67414b