From 1153c1521171ca2a1f267a990ed6e00a7814cbb8 Mon Sep 17 00:00:00 2001 From: Paul Fd Date: Sun, 23 May 2021 15:23:12 +0200 Subject: [PATCH] Parse `hint_sustain_cancels_release` --- src/sfizz/Defaults.cpp | 1 + src/sfizz/Defaults.h | 1 + src/sfizz/Synth.cpp | 6 ++++++ src/sfizz/SynthConfig.h | 2 ++ src/sfizz/Voice.cpp | 1 + 5 files changed, 11 insertions(+) diff --git a/src/sfizz/Defaults.cpp b/src/sfizz/Defaults.cpp index 5908a340..0cb3803c 100644 --- a/src/sfizz/Defaults.cpp +++ b/src/sfizz/Defaults.cpp @@ -187,6 +187,7 @@ FloatSpec lofiBitred { 0.0f, {0.0f, 100.0f}, 0 }; FloatSpec lofiDecim { 0.0f, {0.0f, 100.0f}, 0 }; FloatSpec rectify { 0.0f, {0.0f, 100.0f}, 0 }; UInt32Spec stringsNumber { maxStrings, {0, maxStrings}, 0 }; +BoolSpec sustainCancelsRelease { false, {0, 1}, kEnforceBounds }; ESpec trigger { Trigger::attack, {Trigger::attack, Trigger::release_key}, 0}; ESpec crossfadeCurve { CrossfadeCurve::power, {CrossfadeCurve::gain, CrossfadeCurve::power}, 0}; diff --git a/src/sfizz/Defaults.h b/src/sfizz/Defaults.h index 71e3b029..41a72607 100644 --- a/src/sfizz/Defaults.h +++ b/src/sfizz/Defaults.h @@ -305,6 +305,7 @@ namespace Default extern const OpcodeSpec selfMask; extern const OpcodeSpec filter; extern const OpcodeSpec eq; + extern const OpcodeSpec sustainCancelsRelease; // Default/max count for objects constexpr int numEQs { 3 }; diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index c76de616..54cca904 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -437,6 +437,12 @@ void Synth::Impl::handleControlOpcodes(const std::vector& members) DBG("Unsupported value for hint_stealing: " << member.value); } break; + case hash("hint_sustain_cancels_release"): + { + SynthConfig& config = resources_.getSynthConfig(); + config.sustainCancelsRelease = member.read(Default::sustainCancelsRelease); + } + break; default: // Unsupported control opcode DBG("Unsupported control opcode: " << member.name); diff --git a/src/sfizz/SynthConfig.h b/src/sfizz/SynthConfig.h index dbd9414b..f5f38d89 100644 --- a/src/sfizz/SynthConfig.h +++ b/src/sfizz/SynthConfig.h @@ -28,5 +28,7 @@ struct SynthConfig { return freeWheeling ? freeWheelingOscillatorQuality : liveOscillatorQuality; } + + bool sustainCancelsRelease { Default::sustainCancelsRelease }; }; } diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index ed3623b2..78e96d64 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -678,6 +678,7 @@ void Voice::registerCC(int delay, int ccNumber, float ccValue) noexcept release(delay); if (region.checkSustain && (impl.sustainState_ == Impl::SustainState::Sustaining) + && impl.resources_.getSynthConfig().sustainCancelsRelease && impl.released() && (region.trigger != Trigger::release && region.trigger != Trigger::release_key) ) { ModMatrix& modMatrix = impl.resources_.getModMatrix(); modMatrix.cancelRelease(impl.id_, impl.region_->getId(), delay);