diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 662ad1a6..0f322512 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -579,7 +579,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) setValueFromOpcode(opcode, filters[filterIndex].resonance, Default::filterResonanceRange); } break; - case hash("cutoff&_oncc&"): // also cutoff_oncc&, cutoff_cc&, cutoff&_cc& + case_any_ccN("cutoff&"): // also cutoff_oncc&, cutoff_cc&, cutoff&_cc& { const auto filterIndex = opcode.parameters.front() - 1; if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) @@ -588,7 +588,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) processGenericCc(opcode, Default::filterCutoffModRange, ModKey::createNXYZ(ModId::FilCutoff, id, filterIndex)); } break; - case hash("resonance&_oncc&"): // also resonance_oncc&, resonance_cc&, resonance&_cc& + case_any_ccN("resonance&"): // also resonance_oncc&, resonance_cc&, resonance&_cc& { const auto filterIndex = opcode.parameters.front() - 1; if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) @@ -642,7 +642,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) setValueFromOpcode(opcode, filters[filterIndex].gain, Default::filterGainRange); } break; - case hash("fil&_gain_oncc&"): // also fil_gain_oncc& + case_any_ccN("fil&_gain"): // also fil_gain_oncc& { const auto filterIndex = opcode.parameters.front() - 1; if (!extendIfNecessary(filters, filterIndex + 1, Default::numFilters)) @@ -678,7 +678,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) setValueFromOpcode(opcode, equalizers[eqIndex].bandwidth, Default::eqBandwidthRange); } break; - case hash("eq&_bw_oncc&"): // also eq&_bwcc& + case_any_ccN("eq&_bw"): // also eq&_bwcc& { const auto eqIndex = opcode.parameters.front() - 1; if (!extendIfNecessary(equalizers, eqIndex + 1, Default::numEQs)) @@ -695,7 +695,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) setValueFromOpcode(opcode, equalizers[eqIndex].frequency, Default::eqFrequencyRange); } break; - case hash("eq&_freq_oncc&"): // also eq&_freqcc& + case_any_ccN("eq&_freq"): // also eq&_freqcc& { const auto eqIndex = opcode.parameters.front() - 1; if (!extendIfNecessary(equalizers, eqIndex + 1, Default::numEQs)) @@ -723,7 +723,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) setValueFromOpcode(opcode, equalizers[eqIndex].gain, Default::eqGainRange); } break; - case hash("eq&_gain_oncc&"): // also eq&_gaincc& + case_any_ccN("eq&_gain"): // also eq&_gaincc& { const auto eqIndex = opcode.parameters.front() - 1; if (!extendIfNecessary(equalizers, eqIndex + 1, Default::numEQs)) diff --git a/src/sfizz/modulations/ModKey.cpp b/src/sfizz/modulations/ModKey.cpp index 8aa40a9d..35a68980 100644 --- a/src/sfizz/modulations/ModKey.cpp +++ b/src/sfizz/modulations/ModKey.cpp @@ -88,17 +88,17 @@ std::string ModKey::toString() const case ModId::Volume: return absl::StrCat("Volume {", region_.number(), "}"); case ModId::FilGain: - return absl::StrCat("FilterGain {", region_.number(), "N=", params_.N, "}"); + return absl::StrCat("FilterGain {", region_.number(), ", N=", params_.N, "}"); case ModId::FilCutoff: - return absl::StrCat("FilterCutoff {", region_.number(), "N=", params_.N, "}"); + return absl::StrCat("FilterCutoff {", region_.number(), ", N=", params_.N, "}"); case ModId::FilResonance: - return absl::StrCat("FilterResonance {", region_.number(), "N=", params_.N, "}"); + return absl::StrCat("FilterResonance {", region_.number(), ", N=", params_.N, "}"); case ModId::EqGain: - return absl::StrCat("EqGain {", region_.number(), "N=", params_.N, "}"); + return absl::StrCat("EqGain {", region_.number(), ", N=", params_.N, "}"); case ModId::EqFrequency: - return absl::StrCat("EqFrequency {", region_.number(), "N=", params_.N, "}"); + return absl::StrCat("EqFrequency {", region_.number(), ", N=", params_.N, "}"); case ModId::EqBandwidth: - return absl::StrCat("EqBandwitdth {", region_.number(), "N=", params_.N, "}"); + return absl::StrCat("EqBandwidth {", region_.number(), ", N=", params_.N, "}"); default: return {}; diff --git a/tests/ModulationsT.cpp b/tests/ModulationsT.cpp index 870595e8..16968b7c 100644 --- a/tests/ModulationsT.cpp +++ b/tests/ModulationsT.cpp @@ -107,13 +107,31 @@ TEST_CASE("[Modulations] Filter CC connections") sample=*sine cutoff=100 fil1_gain_oncc3=5 fil1_gain_stepcc3=0.5 cutoff2=300 cutoff2_cc2=100 cutoff2_curvecc2=2 - resonance2=-1 resonance2_oncc1=2 resonance2_smoothcc1=10 + resonance3=-1 resonance3_oncc1=2 resonance3_smoothcc1=10 )"); const std::string graph = synth.getResources().modMatrix.toDotGraph(); REQUIRE(graph == createReferenceGraph({ - R"("Controller 1 {curve=0, smooth=10, value=2, step=0}" -> "FilResonance")", - R"("Controller 2 {curve=2, smooth=0, value=100, step=0}" -> "FilCutoff")", - R"("Controller 3 {curve=0, smooth=0, value=5, step=0.5}" -> "FilGain")", + R"("Controller 1 {curve=0, smooth=10, value=2, step=0}" -> "FilterResonance {0, N=2}")", + R"("Controller 2 {curve=2, smooth=0, value=100, step=0}" -> "FilterCutoff {0, N=1}")", + R"("Controller 3 {curve=0, smooth=0, value=5, step=0.5}" -> "FilterGain {0, N=0}")", + })); +} + +TEST_CASE("[Modulations] EQ CC connections") +{ + sfz::Synth synth; + synth.loadSfzString("/modulation.sfz", R"( + sample=*sine + eq1_gain_oncc2=5 eq1_gain_stepcc2=0.5 + eq2_freq_oncc3=300 eq2_freq_curvecc3=3 + eq3_bw_oncc1=2 eq3_bw_smoothcc1=10 + )"); + + const std::string graph = synth.getResources().modMatrix.toDotGraph(); + REQUIRE(graph == createReferenceGraph({ + R"("Controller 1 {curve=0, smooth=10, value=2, step=0}" -> "EqBandwidth {0, N=2}")", + R"("Controller 2 {curve=0, smooth=0, value=5, step=0.5}" -> "EqGain {0, N=0}")", + R"("Controller 3 {curve=3, smooth=0, value=300, step=0}" -> "EqFrequency {0, N=1}")", })); }