Reset to default CC values

This commit is contained in:
Paul Fd 2021-05-23 17:31:48 +02:00
parent f8c498b227
commit 4defdce04a
5 changed files with 32 additions and 29 deletions

View file

@ -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)

View file

@ -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;

View file

@ -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]);
}
}

View file

@ -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;

View file

@ -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<std::string> messageList;
sfz::Client client(&messageList);
client.setReceiveCallback(&simpleMessageReceiver);
sfz::AudioBuffer<float> buffer { 2, static_cast<unsigned>(synth.getSamplesPerBlock()) };
synth.loadSfzString(fs::current_path() / "tests/TestFiles/default_cc.sfz", R"(
<control> set_cc56=64
<region> 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 );
}