From ca983090cc866a96cf4aaca696a62fe2a98105bc Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Tue, 23 Mar 2021 21:30:53 +0100 Subject: [PATCH 1/2] 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_; From c86e04e63ecb6cb111ee6c71646e8ab0b4c7e9b1 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Tue, 23 Mar 2021 21:44:54 +0100 Subject: [PATCH 2/2] Add some const qualifiers --- src/sfizz/Synth.cpp | 6 +++--- src/sfizz/SynthPrivate.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 1bd10f69..879816b1 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -1905,7 +1905,7 @@ BitArray Synth::Impl::collectAllUsedCCs() return used; } -const std::string* Synth::Impl::getKeyLabel(int keyNumber) +const std::string* Synth::Impl::getKeyLabel(int keyNumber) const { auto it = keyLabelsMap_.find(keyNumber); return (it == keyLabelsMap_.end()) ? nullptr : &keyLabels_[it->second].second; @@ -1923,7 +1923,7 @@ void Synth::Impl::setKeyLabel(int keyNumber, std::string name) } } -const std::string* Synth::Impl::getCCLabel(int ccNumber) +const std::string* Synth::Impl::getCCLabel(int ccNumber) const { auto it = ccLabelsMap_.find(ccNumber); return (it == ccLabelsMap_.end()) ? nullptr : &ccLabels_[it->second].second; @@ -1941,7 +1941,7 @@ void Synth::Impl::setCCLabel(int ccNumber, std::string name) } } -const std::string* Synth::Impl::getKeyswitchLabel(int swNumber) +const std::string* Synth::Impl::getKeyswitchLabel(int swNumber) const { auto it = keyswitchLabelsMap_.find(swNumber); return (it == keyswitchLabelsMap_.end()) ? nullptr : &keyswitchLabels_[it->second].second; diff --git a/src/sfizz/SynthPrivate.h b/src/sfizz/SynthPrivate.h index bfc3344a..502f548b 100644 --- a/src/sfizz/SynthPrivate.h +++ b/src/sfizz/SynthPrivate.h @@ -181,13 +181,13 @@ struct Synth::Impl final: public Parser::Listener { BitArray collectAllUsedCCs(); - const std::string* getKeyLabel(int keyNumber); + const std::string* getKeyLabel(int keyNumber) const; void setKeyLabel(int keyNumber, std::string name); void clearKeyLabels(); - const std::string* getCCLabel(int ccNumber); + const std::string* getCCLabel(int ccNumber) const; void setCCLabel(int ccNumber, std::string name); void clearCCLabels(); - const std::string* getKeyswitchLabel(int swNumber); + const std::string* getKeyswitchLabel(int swNumber) const; void setKeyswitchLabel(int swNumber, std::string name); void clearKeyswitchLabels();