diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 0f438686..52b80c9a 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -209,6 +209,16 @@ void sfz::Synth::handleControlOpcodes(const std::vector& members) resources.midiState.ccEvent(0, member.parameters.back(), normalizeCC(*ccValue)); } break; + case hash("Set_hdcc&"): // fallthrough + case hash("set_hdcc&"): + case hash("Set_realcc&"): + case hash("set_realcc&"): + if (Default::ccNumberRange.containsWithEnd(member.parameters.back())) { + const auto ccValue = readOpcode(member.value, Default::normalizedRange); + if (ccValue) + resources.midiState.ccEvent(0, member.parameters.back(), *ccValue); + } + break; case hash("Label_cc&"): // fallthrough case hash("label_cc&"): if (Default::ccNumberRange.containsWithEnd(member.parameters.back())) diff --git a/tests/FilesT.cpp b/tests/FilesT.cpp index dbfaea38..c3b6d473 100644 --- a/tests/FilesT.cpp +++ b/tests/FilesT.cpp @@ -400,6 +400,15 @@ TEST_CASE("[Files] Set CC applies properly") REQUIRE(midiState.getCCValue(61) == 122_norm); } +TEST_CASE("[Files] Set HDCC applies properly") +{ + sfz::Synth synth; + const auto& midiState = synth.getResources().midiState; + synth.loadSfzFile(fs::current_path() / "tests/TestFiles/set_hdcc.sfz"); + REQUIRE(midiState.getCCValue(142) == Approx(0.5678)); + REQUIRE(midiState.getCCValue(61) == Approx(0.1234)); +} + TEST_CASE("[Files] Note and octave offsets") { sfz::Synth synth; diff --git a/tests/TestFiles/set_hdcc.sfz b/tests/TestFiles/set_hdcc.sfz new file mode 100644 index 00000000..02673b3b --- /dev/null +++ b/tests/TestFiles/set_hdcc.sfz @@ -0,0 +1,3 @@ + set_hdcc61=0.1234 + set_hdcc142=0.5678 + sample=snare.wav