Ensure label entries to be unique for their cc/note
This commit is contained in:
parent
1b104fd6d6
commit
111af1b648
2 changed files with 34 additions and 5 deletions
|
|
@ -7,6 +7,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <absl/types/optional.h>
|
#include <absl/types/optional.h>
|
||||||
#include <absl/strings/string_view.h>
|
#include <absl/strings/string_view.h>
|
||||||
|
#include <absl/algorithm/container.h>
|
||||||
//#include <string>
|
//#include <string>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
@ -202,6 +203,34 @@ inline CXX14_CONSTEXPR Type vaGain(Type cutoff, Type sampleRate)
|
||||||
return std::tan(cutoff / sampleRate * pi<Type>());
|
return std::tan(cutoff / sampleRate * pi<Type>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Insert an item uniquely into a vector of pairs.
|
||||||
|
*
|
||||||
|
* @param pairVector the vector of pairs
|
||||||
|
* @param key the unique key
|
||||||
|
* @param value the value
|
||||||
|
* @param replace whether to replace the value if the key is already present
|
||||||
|
* @return whether the item was inserted
|
||||||
|
*/
|
||||||
|
template <class P, class T, class U>
|
||||||
|
bool insertPairUniquely(std::vector<P>& pairVector, const T& key, U value, bool replace = true)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
auto it = absl::c_find_if(
|
||||||
|
pairVector, [&key](const P& pair) { return pair.first == key; });
|
||||||
|
if (it != pairVector.end()) {
|
||||||
|
if (replace) {
|
||||||
|
it->second = std::move(value);
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pairVector.emplace_back(key, std::move(value));
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief From a source view, find the next sfz header and its members and
|
* @brief From a source view, find the next sfz header and its members and
|
||||||
* return them, while updating the source by removing this header
|
* return them, while updating the source by removing this header
|
||||||
|
|
|
||||||
|
|
@ -233,8 +233,8 @@ void sfz::Synth::clear()
|
||||||
hdcc(0, 10, 0.5f); // pan
|
hdcc(0, 10, 0.5f); // pan
|
||||||
|
|
||||||
// set default controller labels
|
// set default controller labels
|
||||||
ccLabels.emplace_back(7, "Volume");
|
insertPairUniquely(ccLabels, 7, "Volume");
|
||||||
ccLabels.emplace_back(10, "Pan");
|
insertPairUniquely(ccLabels, 10, "Pan");
|
||||||
}
|
}
|
||||||
|
|
||||||
void sfz::Synth::handleMasterOpcodes(const std::vector<Opcode>& members)
|
void sfz::Synth::handleMasterOpcodes(const std::vector<Opcode>& members)
|
||||||
|
|
@ -336,12 +336,12 @@ void sfz::Synth::handleControlOpcodes(const std::vector<Opcode>& members)
|
||||||
break;
|
break;
|
||||||
case hash("label_cc&"):
|
case hash("label_cc&"):
|
||||||
if (Default::ccNumberRange.containsWithEnd(member.parameters.back()))
|
if (Default::ccNumberRange.containsWithEnd(member.parameters.back()))
|
||||||
ccLabels.emplace_back(member.parameters.back(), std::string(member.value));
|
insertPairUniquely(ccLabels, member.parameters.back(), std::string(member.value));
|
||||||
break;
|
break;
|
||||||
case hash("label_key&"):
|
case hash("label_key&"):
|
||||||
if (member.parameters.back() <= Default::keyRange.getEnd()) {
|
if (member.parameters.back() <= Default::keyRange.getEnd()) {
|
||||||
const auto noteNumber = static_cast<uint8_t>(member.parameters.back());
|
const auto noteNumber = static_cast<uint8_t>(member.parameters.back());
|
||||||
keyLabels.emplace_back(noteNumber, std::string(member.value));
|
insertPairUniquely(keyLabels, noteNumber, std::string(member.value));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case hash("default_path"):
|
case hash("default_path"):
|
||||||
|
|
@ -545,7 +545,7 @@ void sfz::Synth::finalizeSfzLoad()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (region->keyswitchLabel && region->keyswitch)
|
if (region->keyswitchLabel && region->keyswitch)
|
||||||
keyswitchLabels.push_back({ *region->keyswitch, *region->keyswitchLabel });
|
insertPairUniquely(keyswitchLabels, *region->keyswitch, *region->keyswitchLabel);
|
||||||
|
|
||||||
// Some regions had group number but no "group-level" opcodes handled the polyphony
|
// Some regions had group number but no "group-level" opcodes handled the polyphony
|
||||||
while (polyphonyGroups.size() <= region->group) {
|
while (polyphonyGroups.size() <= region->group) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue