From 3412ead0ac25e47ac2e48b1cc7592b678f976f32 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Sat, 26 Sep 2020 14:51:43 +0200 Subject: [PATCH] Ampeg in modulation matrix --- src/sfizz/Synth.cpp | 6 ++++++ src/sfizz/Voice.cpp | 11 ++++------- src/sfizz/Voice.h | 4 ++++ src/sfizz/modulations/ModId.cpp | 2 ++ src/sfizz/modulations/ModId.h | 1 + src/sfizz/modulations/ModKey.cpp | 2 ++ src/sfizz/modulations/sources/ADSREnvelope.cpp | 13 +++++++++++++ 7 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index b191d841..52b02c96 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -159,6 +159,11 @@ void sfz::Synth::buildRegion(const std::vector& regionOpcodes) ModKey::createCC(10, 1, defaultSmoothness, 100, 0), ModKey::createNXYZ(ModId::Pan, lastRegion->id)).sourceDepth = 1.0f; + // Create the amplitude envelope + lastRegion->getOrCreateConnection( + ModKey::createNXYZ(ModId::AmpEG, lastRegion->id), + ModKey::createNXYZ(ModId::Amplitude, lastRegion->id)).sourceDepth = 100.0f; + // auto parseOpcodes = [&](const std::vector& opcodes) { for (auto& opcode : opcodes) { @@ -1530,6 +1535,7 @@ void sfz::Synth::setupModMatrix() case ModId::Envelope: gen = genFlexEnvelope.get(); break; + case ModId::AmpEG: case ModId::PitchEG: case ModId::FilEG: gen = genADSREnvelope.get(); diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index a60b1af7..98ecf495 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -130,7 +130,6 @@ void sfz::Voice::startVoice(Region* region, int delay, const TriggerEvent& event bendStepFactor = centsFactor(region->bendStep); bendSmoother.setSmoothing(region->bendSmooth, sampleRate); bendSmoother.reset(centsFactor(region->getBendInCents(resources.midiState.getPitchBend()))); - egAmplitude.reset(region->amplitudeEG, *region, resources.midiState, delay, triggerEvent.value, sampleRate); resources.modMatrix.initVoice(id, region->getId(), delay); saveModulationTargets(region); @@ -154,8 +153,6 @@ void sfz::Voice::release(int delay) noexcept if (egAmplitude.getRemainingDelay() > delay) { switchState(State::cleanMeUp); - } else { - egAmplitude.startRelease(delay); } resources.modMatrix.releaseVoice(id, region->getId(), delay); @@ -367,14 +364,14 @@ void sfz::Voice::amplitudeEnvelope(absl::Span modulationSpan) noexcept ModMatrix& mm = resources.modMatrix; - // AmpEG envelope - egAmplitude.getBlock(modulationSpan); - // Amplitude envelope applyGain1(baseGain, modulationSpan); if (float* mod = mm.getModulation(amplitudeTarget)) { for (size_t i = 0; i < numSamples; ++i) - modulationSpan[i] *= normalizePercents(mod[i]); + modulationSpan[i] = normalizePercents(mod[i]); + } + else { + ASSERTFALSE; } // Volume envelope diff --git a/src/sfizz/Voice.h b/src/sfizz/Voice.h index 419c6584..86b1c5ab 100644 --- a/src/sfizz/Voice.h +++ b/src/sfizz/Voice.h @@ -336,6 +336,10 @@ public: Duration getLastFilterDuration() const noexcept { return filterDuration; } Duration getLastPanningDuration() const noexcept { return panningDuration; } + /** + * @brief Get the SFZv1 amplitude EG, if existing + */ + ADSREnvelope* getAmplitudeEG() { return &egAmplitude; } /** * @brief Get the SFZv1 pitch EG, if existing */ diff --git a/src/sfizz/modulations/ModId.cpp b/src/sfizz/modulations/ModId.cpp index 427d7511..d21ba9e0 100644 --- a/src/sfizz/modulations/ModId.cpp +++ b/src/sfizz/modulations/ModId.cpp @@ -30,6 +30,8 @@ int ModIds::flags(ModId id) noexcept return kModIsPerVoice; case ModId::LFO: return kModIsPerVoice; + case ModId::AmpEG: + return kModIsPerVoice; case ModId::PitchEG: return kModIsPerVoice; case ModId::FilEG: diff --git a/src/sfizz/modulations/ModId.h b/src/sfizz/modulations/ModId.h index ccd25b98..3eb7022d 100644 --- a/src/sfizz/modulations/ModId.h +++ b/src/sfizz/modulations/ModId.h @@ -23,6 +23,7 @@ enum class ModId : int { Controller = _SourcesStart, Envelope, LFO, + AmpEG, PitchEG, FilEG, diff --git a/src/sfizz/modulations/ModKey.cpp b/src/sfizz/modulations/ModKey.cpp index 80c3accb..2b9767d3 100644 --- a/src/sfizz/modulations/ModKey.cpp +++ b/src/sfizz/modulations/ModKey.cpp @@ -74,6 +74,8 @@ std::string ModKey::toString() const return absl::StrCat("EG ", 1 + params_.N, " {", region_.number(), "}"); case ModId::LFO: return absl::StrCat("LFO ", 1 + params_.N, " {", region_.number(), "}"); + case ModId::AmpEG: + return absl::StrCat("AmplitudeEG {", region_.number(), "}"); case ModId::PitchEG: return absl::StrCat("PitchEG {", region_.number(), "}"); case ModId::FilEG: diff --git a/src/sfizz/modulations/sources/ADSREnvelope.cpp b/src/sfizz/modulations/sources/ADSREnvelope.cpp index 7128b216..57f8ba7d 100644 --- a/src/sfizz/modulations/sources/ADSREnvelope.cpp +++ b/src/sfizz/modulations/sources/ADSREnvelope.cpp @@ -35,6 +35,11 @@ void ADSREnvelopeSource::init(const ModKey& sourceKey, NumericId voiceId, const EGDescription* desc = nullptr; switch (sourceKey.id()) { + case ModId::AmpEG: + eg = voice->getAmplitudeEG(); + ASSERT(eg); + desc = ®ion->amplitudeEG; + break; case ModId::PitchEG: eg = voice->getPitchEG(); ASSERT(eg); @@ -69,6 +74,10 @@ void ADSREnvelopeSource::release(const ModKey& sourceKey, NumericId voice ADSREnvelope* eg = nullptr; switch (sourceKey.id()) { + case ModId::AmpEG: + eg = voice->getAmplitudeEG(); + ASSERT(eg); + break; case ModId::PitchEG: eg = voice->getPitchEG(); ASSERT(eg); @@ -98,6 +107,10 @@ void ADSREnvelopeSource::generate(const ModKey& sourceKey, NumericId voic ADSREnvelope* eg = nullptr; switch (sourceKey.id()) { + case ModId::AmpEG: + eg = voice->getAmplitudeEG(); + ASSERT(eg); + break; case ModId::PitchEG: eg = voice->getPitchEG(); ASSERT(eg);