From ca983090cc866a96cf4aaca696a62fe2a98105bc Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Tue, 23 Mar 2021 21:30:53 +0100 Subject: [PATCH] Access to key label via OSC --- src/sfizz/Synth.cpp | 28 ++++++++++++++++++++++++++-- src/sfizz/SynthMessaging.cpp | 7 +++++++ src/sfizz/SynthPrivate.h | 4 ++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 95e588de..1bd10f69 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -249,7 +249,7 @@ void Synth::Impl::clear() clearCCLabels(); currentUsedCCs_.clear(); changedCCsThisCycle_.clear(); - keyLabels_.clear(); + clearKeyLabels(); keySlots_.clear(); swLastSlots_.clear(); clearKeyswitchLabels(); @@ -371,7 +371,7 @@ void Synth::Impl::handleControlOpcodes(const std::vector& members) case hash("label_key&"): if (member.parameters.back() <= Default::key.bounds.getEnd()) { const auto noteNumber = static_cast(member.parameters.back()); - insertPairUniquely(keyLabels_, noteNumber, std::string(member.value)); + setKeyLabel(noteNumber, member.value); } break; case hash("default_path"): @@ -1905,6 +1905,24 @@ BitArray Synth::Impl::collectAllUsedCCs() return used; } +const std::string* Synth::Impl::getKeyLabel(int keyNumber) +{ + auto it = keyLabelsMap_.find(keyNumber); + return (it == keyLabelsMap_.end()) ? nullptr : &keyLabels_[it->second].second; +} + +void Synth::Impl::setKeyLabel(int keyNumber, std::string name) +{ + auto it = keyLabelsMap_.find(keyNumber); + if (it != keyLabelsMap_.end()) + keyLabels_[it->second].second = std::move(name); + else { + size_t index = keyLabels_.size(); + keyLabels_.emplace_back(keyNumber, std::move(name)); + keyLabelsMap_[keyNumber] = index; + } +} + const std::string* Synth::Impl::getCCLabel(int ccNumber) { auto it = ccLabelsMap_.find(ccNumber); @@ -1941,6 +1959,12 @@ void Synth::Impl::setKeyswitchLabel(int swNumber, std::string name) } } +void Synth::Impl::clearKeyLabels() +{ + keyLabels_.clear(); + keyLabelsMap_.clear(); +} + void Synth::Impl::clearCCLabels() { ccLabels_.clear(); diff --git a/src/sfizz/SynthMessaging.cpp b/src/sfizz/SynthMessaging.cpp index 9b2bcd54..bfeda787 100644 --- a/src/sfizz/SynthMessaging.cpp +++ b/src/sfizz/SynthMessaging.cpp @@ -44,6 +44,13 @@ void sfz::Synth::dispatchMessage(Client& client, int delay, const char* path, co client.receive<'b'>(delay, path, &blob); } break; + MATCH("/key%d/label", "") { + if (indices[0] >= 128) + break; + const std::string* label = impl.getKeyLabel(indices[0]); + client.receive<'s'>(delay, path, label ? label->c_str() : ""); + } break; + //---------------------------------------------------------------------- MATCH("/sw/last/slots", "") { diff --git a/src/sfizz/SynthPrivate.h b/src/sfizz/SynthPrivate.h index faf2b7e3..bfc3344a 100644 --- a/src/sfizz/SynthPrivate.h +++ b/src/sfizz/SynthPrivate.h @@ -181,6 +181,9 @@ struct Synth::Impl final: public Parser::Listener { BitArray collectAllUsedCCs(); + const std::string* getKeyLabel(int keyNumber); + void setKeyLabel(int keyNumber, std::string name); + void clearKeyLabels(); const std::string* getCCLabel(int ccNumber); void setCCLabel(int ccNumber, std::string name); void clearCCLabels(); @@ -219,6 +222,7 @@ struct Synth::Impl final: public Parser::Listener { std::vector ccLabels_; std::map ccLabelsMap_; std::vector keyLabels_; + std::map keyLabelsMap_; BitArray<128> keySlots_; BitArray<128> swLastSlots_; std::vector keyswitchLabels_;