Do not connect CC 7 and 10 if used in SFZ file
This commit is contained in:
parent
2351f18bfd
commit
6fc1d470ff
2 changed files with 57 additions and 9 deletions
|
|
@ -142,15 +142,6 @@ void sfz::Synth::buildRegion(const std::vector<Opcode>& regionOpcodes)
|
||||||
int regionNumber = static_cast<int>(regions.size());
|
int regionNumber = static_cast<int>(regions.size());
|
||||||
auto lastRegion = absl::make_unique<Region>(regionNumber, resources.midiState, defaultPath);
|
auto lastRegion = absl::make_unique<Region>(regionNumber, resources.midiState, defaultPath);
|
||||||
|
|
||||||
// Create default connections
|
|
||||||
constexpr unsigned defaultSmoothness = 10;
|
|
||||||
lastRegion->getOrCreateConnection(
|
|
||||||
ModKey::createCC(7, 4, defaultSmoothness, 0),
|
|
||||||
ModKey::createNXYZ(ModId::Amplitude, lastRegion->id)).sourceDepth = 100.0f;
|
|
||||||
lastRegion->getOrCreateConnection(
|
|
||||||
ModKey::createCC(10, 1, defaultSmoothness, 0),
|
|
||||||
ModKey::createNXYZ(ModId::Pan, lastRegion->id)).sourceDepth = 100.0f;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
auto parseOpcodes = [&](const std::vector<Opcode>& opcodes) {
|
auto parseOpcodes = [&](const std::vector<Opcode>& opcodes) {
|
||||||
for (auto& opcode : opcodes) {
|
for (auto& opcode : opcodes) {
|
||||||
|
|
@ -626,6 +617,33 @@ void sfz::Synth::finalizeSfzLoad()
|
||||||
}
|
}
|
||||||
DBG("Removing " << (regions.size() - currentRegionCount) << " out of " << regions.size() << " regions");
|
DBG("Removing " << (regions.size() - currentRegionCount) << " out of " << regions.size() << " regions");
|
||||||
regions.resize(currentRegionCount);
|
regions.resize(currentRegionCount);
|
||||||
|
|
||||||
|
// collect all CCs used in regions, with matrix not yet connected
|
||||||
|
std::bitset<config::numCCs> usedCCs;
|
||||||
|
for (const RegionPtr& regionPtr : regions) {
|
||||||
|
const Region& region = *regionPtr;
|
||||||
|
updateUsedCCsFromRegion(usedCCs, region);
|
||||||
|
for (const Region::Connection& connection : region.connections) {
|
||||||
|
if (connection.source.id() == ModId::Controller)
|
||||||
|
usedCCs.set(connection.source.parameters().cc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// connect default controllers, except if these CC are already used
|
||||||
|
for (const RegionPtr& regionPtr : regions) {
|
||||||
|
Region& region = *regionPtr;
|
||||||
|
constexpr unsigned defaultSmoothness = 10;
|
||||||
|
if (!usedCCs.test(7)) {
|
||||||
|
region.getOrCreateConnection(
|
||||||
|
ModKey::createCC(7, 4, defaultSmoothness, 0),
|
||||||
|
ModKey::createNXYZ(ModId::Amplitude, region.id)).sourceDepth = 100.0f;
|
||||||
|
}
|
||||||
|
if (!usedCCs.test(10)) {
|
||||||
|
region.getOrCreateConnection(
|
||||||
|
ModKey::createCC(10, 1, defaultSmoothness, 0),
|
||||||
|
ModKey::createNXYZ(ModId::Pan, region.id)).sourceDepth = 100.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
modificationTime = checkModificationTime();
|
modificationTime = checkModificationTime();
|
||||||
|
|
||||||
settingsPerVoice.maxFilters = maxFilters;
|
settingsPerVoice.maxFilters = maxFilters;
|
||||||
|
|
|
||||||
|
|
@ -304,3 +304,33 @@ TEST_CASE("[Modulations] FlexEG Ampeg target with multiple EGs targeting ampeg")
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("[Modulations] Override the default volume controller")
|
||||||
|
{
|
||||||
|
sfz::Synth synth;
|
||||||
|
|
||||||
|
synth.loadSfzString(fs::current_path(), R"(
|
||||||
|
<region> sample=*sine tune_oncc7=1200
|
||||||
|
)");
|
||||||
|
|
||||||
|
const std::string graph = synth.getResources().modMatrix.toDotGraph();
|
||||||
|
REQUIRE(graph == createModulationDotGraph({
|
||||||
|
R"("AmplitudeEG {0}" -> "MasterAmplitude {0}")",
|
||||||
|
R"("Controller 10 {curve=1, smooth=10, step=0}" -> "Pan {0}")",
|
||||||
|
R"("Controller 7 {curve=0, smooth=0, step=0}" -> "Pitch {0}")",
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("[Modulations] Override the default pan controller")
|
||||||
|
{
|
||||||
|
sfz::Synth synth;
|
||||||
|
|
||||||
|
synth.loadSfzString(fs::current_path(), R"(
|
||||||
|
<region> sample=*sine on_locc10=127 on_hicc10=127
|
||||||
|
)");
|
||||||
|
|
||||||
|
const std::string graph = synth.getResources().modMatrix.toDotGraph();
|
||||||
|
REQUIRE(graph == createModulationDotGraph({
|
||||||
|
R"("AmplitudeEG {0}" -> "MasterAmplitude {0}")",
|
||||||
|
R"("Controller 7 {curve=4, smooth=10, step=0}" -> "Amplitude {0}")",
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue