diff --git a/src/sfizz/MidiState.cpp b/src/sfizz/MidiState.cpp index 2072b1fd..4abaffb8 100644 --- a/src/sfizz/MidiState.cpp +++ b/src/sfizz/MidiState.cpp @@ -230,14 +230,6 @@ void sfz::MidiState::reset() noexcept absl::c_fill(noteOffTimes, 0); } -void sfz::MidiState::resetAllControllers(int delay) noexcept -{ - for (int ccIdx = 0; ccIdx < config::numCCs; ++ccIdx) - ccEvent(delay, ccIdx, 0.0f); - - pitchBendEvent(delay, 0.0f); -} - const sfz::EventVector& sfz::MidiState::getCCEvents(int ccIdx) const noexcept { if (ccIdx < 0 || ccIdx >= config::numCCs) diff --git a/src/sfizz/MidiState.h b/src/sfizz/MidiState.h index c92f45a4..16197c2f 100644 --- a/src/sfizz/MidiState.h +++ b/src/sfizz/MidiState.h @@ -180,11 +180,6 @@ public: */ void reset() noexcept; - /** - * @brief Reset all the controllers - */ - void resetAllControllers(int delay) noexcept; - const EventVector& getCCEvents(int ccIdx) const noexcept; const EventVector& getPolyAftertouchEvents(int noteNumber) const noexcept; const EventVector& getPitchEvents() const noexcept; diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index c76de616..c16b2e65 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -1926,18 +1926,21 @@ void Synth::disableFreeWheeling() noexcept void Synth::Impl::resetAllControllers(int delay) noexcept { - resources_.getMidiState().resetAllControllers(delay); + MidiState& midiState = resources_.getMidiState(); + midiState.pitchBendEvent(delay, 0.0f); + for (int cc = 0; cc < config::numCCs; ++cc) + midiState.ccEvent(delay, cc, defaultCCValues_[cc]); for (auto& voice : voiceManager_) { voice.registerPitchWheel(delay, 0); for (int cc = 0; cc < config::numCCs; ++cc) - voice.registerCC(delay, cc, 0.0f); + voice.registerCC(delay, cc, defaultCCValues_[cc]); } for (const LayerPtr& layerPtr : layers_) { Layer& layer = *layerPtr; for (int cc = 0; cc < config::numCCs; ++cc) - layer.registerCC(cc, 0.0f); + layer.registerCC(cc, defaultCCValues_[cc]); } } diff --git a/tests/MidiStateT.cpp b/tests/MidiStateT.cpp index 8bb44d40..f29c7198 100644 --- a/tests/MidiStateT.cpp +++ b/tests/MidiStateT.cpp @@ -57,19 +57,6 @@ TEST_CASE("[MidiState] Reset") REQUIRE(state.getCCValue(123) == 0_norm); } -TEST_CASE("[MidiState] Reset all controllers") -{ - sfz::MidiState state; - state.pitchBendEvent(20, 0.7f); - state.ccEvent(10, 122, 124_norm); - REQUIRE(state.getPitchBend() == 0.7f); - REQUIRE(state.getCCValue(122) == 124_norm); - state.resetAllControllers(30); - REQUIRE(state.getPitchBend() == 0.0f); - REQUIRE(state.getCCValue(122) == 0_norm); - REQUIRE(state.getCCValue(4) == 0_norm); -} - TEST_CASE("[MidiState] Set and get note velocities") { sfz::MidiState state; diff --git a/tests/SynthT.cpp b/tests/SynthT.cpp index 3ca5db3f..403dd6e5 100644 --- a/tests/SynthT.cpp +++ b/tests/SynthT.cpp @@ -1828,3 +1828,29 @@ TEST_CASE("[Synth] Short empty files are turned into *silence") }; REQUIRE(messageList == expected); } + + +TEST_CASE("[Synth] Resets all controllers to default values") +{ + sfz::Synth synth; + std::vector messageList; + sfz::Client client(&messageList); + client.setReceiveCallback(&simpleMessageReceiver); + sfz::AudioBuffer buffer { 2, static_cast(synth.getSamplesPerBlock()) }; + synth.loadSfzString(fs::current_path() / "tests/TestFiles/default_cc.sfz", R"( + set_cc56=64 + sample=*sine + )"); + REQUIRE( synth.getHdcc(56) == 64_norm ); + REQUIRE( synth.getHdcc(78) == 0.0f ); + synth.cc(0, 56, 10); + synth.cc(0, 78, 100); + synth.renderBlock(buffer); + REQUIRE( synth.getHdcc(56) == 10_norm ); + REQUIRE( synth.getHdcc(78) == 100_norm ); + synth.cc(0, 121, 127); + synth.cc(0, 121, 0); + synth.renderBlock(buffer); + REQUIRE( synth.getHdcc(56) == 64_norm ); + REQUIRE( synth.getHdcc(78) == 0.0f ); +}