Merge pull request #741 from jpcima/misc

Access to key label via OSC
This commit is contained in:
JP Cimalando 2021-03-24 02:43:21 +01:00 committed by GitHub
commit 858028fcc6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 6 deletions

View file

@ -249,7 +249,7 @@ void Synth::Impl::clear()
clearCCLabels(); clearCCLabels();
currentUsedCCs_.clear(); currentUsedCCs_.clear();
changedCCsThisCycle_.clear(); changedCCsThisCycle_.clear();
keyLabels_.clear(); clearKeyLabels();
keySlots_.clear(); keySlots_.clear();
swLastSlots_.clear(); swLastSlots_.clear();
clearKeyswitchLabels(); clearKeyswitchLabels();
@ -371,7 +371,7 @@ void Synth::Impl::handleControlOpcodes(const std::vector<Opcode>& members)
case hash("label_key&"): case hash("label_key&"):
if (member.parameters.back() <= Default::key.bounds.getEnd()) { if (member.parameters.back() <= Default::key.bounds.getEnd()) {
const auto noteNumber = static_cast<uint8_t>(member.parameters.back()); const auto noteNumber = static_cast<uint8_t>(member.parameters.back());
insertPairUniquely(keyLabels_, noteNumber, std::string(member.value)); setKeyLabel(noteNumber, member.value);
} }
break; break;
case hash("default_path"): case hash("default_path"):
@ -1905,7 +1905,25 @@ BitArray<config::numCCs> Synth::Impl::collectAllUsedCCs()
return used; return used;
} }
const std::string* Synth::Impl::getCCLabel(int ccNumber) const std::string* Synth::Impl::getKeyLabel(int keyNumber) const
{
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) const
{ {
auto it = ccLabelsMap_.find(ccNumber); auto it = ccLabelsMap_.find(ccNumber);
return (it == ccLabelsMap_.end()) ? nullptr : &ccLabels_[it->second].second; return (it == ccLabelsMap_.end()) ? nullptr : &ccLabels_[it->second].second;
@ -1923,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); auto it = keyswitchLabelsMap_.find(swNumber);
return (it == keyswitchLabelsMap_.end()) ? nullptr : &keyswitchLabels_[it->second].second; return (it == keyswitchLabelsMap_.end()) ? nullptr : &keyswitchLabels_[it->second].second;
@ -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() void Synth::Impl::clearCCLabels()
{ {
ccLabels_.clear(); ccLabels_.clear();

View file

@ -44,6 +44,13 @@ void sfz::Synth::dispatchMessage(Client& client, int delay, const char* path, co
client.receive<'b'>(delay, path, &blob); client.receive<'b'>(delay, path, &blob);
} break; } 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", "") { MATCH("/sw/last/slots", "") {

View file

@ -181,10 +181,13 @@ struct Synth::Impl final: public Parser::Listener {
BitArray<config::numCCs> collectAllUsedCCs(); BitArray<config::numCCs> collectAllUsedCCs();
const std::string* getCCLabel(int ccNumber); const std::string* getKeyLabel(int keyNumber) const;
void setKeyLabel(int keyNumber, std::string name);
void clearKeyLabels();
const std::string* getCCLabel(int ccNumber) const;
void setCCLabel(int ccNumber, std::string name); void setCCLabel(int ccNumber, std::string name);
void clearCCLabels(); void clearCCLabels();
const std::string* getKeyswitchLabel(int swNumber); const std::string* getKeyswitchLabel(int swNumber) const;
void setKeyswitchLabel(int swNumber, std::string name); void setKeyswitchLabel(int swNumber, std::string name);
void clearKeyswitchLabels(); void clearKeyswitchLabels();
@ -219,6 +222,7 @@ struct Synth::Impl final: public Parser::Listener {
std::vector<CCNamePair> ccLabels_; std::vector<CCNamePair> ccLabels_;
std::map<int, size_t> ccLabelsMap_; std::map<int, size_t> ccLabelsMap_;
std::vector<NoteNamePair> keyLabels_; std::vector<NoteNamePair> keyLabels_;
std::map<int, size_t> keyLabelsMap_;
BitArray<128> keySlots_; BitArray<128> keySlots_;
BitArray<128> swLastSlots_; BitArray<128> swLastSlots_;
std::vector<NoteNamePair> keyswitchLabels_; std::vector<NoteNamePair> keyswitchLabels_;