From d0bf55faf78f1e5df496660c0f5ed8af04b0d5d6 Mon Sep 17 00:00:00 2001 From: Blitblank Date: Fri, 26 Dec 2025 15:37:20 -0600 Subject: [PATCH] cleanup envelopeGenerator initialization --- src/ParameterStore.h | 17 +++++++++- src/synth/Synth.cpp | 1 + .../EnvelopeGenerator/EnvelopeGenerator.cpp | 32 ++++++------------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/ParameterStore.h b/src/ParameterStore.h index 4067130..9cafebf 100644 --- a/src/ParameterStore.h +++ b/src/ParameterStore.h @@ -25,7 +25,6 @@ enum class ParamId : uint16_t { Count // for sizing }; -// TODO: might make a map of EnvelopeIds to a struct of 4 ParamIds enum class EnvelopeId : uint16_t { Osc1Volume, Osc2Volume, @@ -35,6 +34,22 @@ enum class EnvelopeId : uint16_t { Count }; +struct EnvelopeParam { + ParamId a; + ParamId d; + ParamId s; + ParamId r; +}; + +constexpr std::array(EnvelopeId::Count)> ENV_PARAMS {{ + { ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvR, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc1Volume + { ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvR, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc2Volume (not implemented) + { ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvR, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc3Volume (not implemented) + { ParamId::FilterCutoffEnvA, ParamId::FilterCutoffEnvR, ParamId::FilterCutoffEnvS, ParamId::FilterCutoffEnvR }, // FilterCutoff + { ParamId::FilterResonanceEnvA, ParamId::FilterResonanceEnvR, ParamId::FilterResonanceEnvS, ParamId::FilterResonanceEnvR }, // FilterResonance + +}}; + struct ParamDefault { float def; float min; diff --git a/src/synth/Synth.cpp b/src/synth/Synth.cpp index b59bb2c..3d0e244 100644 --- a/src/synth/Synth.cpp +++ b/src/synth/Synth.cpp @@ -72,6 +72,7 @@ void Synth::process(float* out, uint32_t nFrames, uint32_t sampleRate) { for(auto& p : params_) p.update(); // TODO: profile this // process all envelopes + // should be easy enough if all the envelopes are in an array to loop over them gainEnvelope_.set(getParam(ParamId::Osc1VolumeEnvA), getParam(ParamId::Osc1VolumeEnvD), getParam(ParamId::Osc1VolumeEnvS), getParam(ParamId::Osc1VolumeEnvR)); float gain = gainEnvelope_.process(); // TODO: envelope is shared between all notes so this sequence involves a note change but only one envelope attack: diff --git a/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.cpp b/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.cpp index 2cc68d5..5df505c 100644 --- a/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.cpp +++ b/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.cpp @@ -67,30 +67,16 @@ void EnvelopeGenerator::emitEnvelope() { void EnvelopeGenerator::init(EnvelopeId id) { - // could probably make this simpler with a map - ParamId aId, dId, sId, rId; - switch (id) { - case EnvelopeId::Osc1Volume: - aId = ParamId::Osc1VolumeEnvA; dId = ParamId::Osc1VolumeEnvD; sId = ParamId::Osc1VolumeEnvS; rId = ParamId::Osc1VolumeEnvR; - break; - case EnvelopeId::FilterCutoff: - aId = ParamId::FilterCutoffEnvA; dId = ParamId::FilterCutoffEnvD; sId = ParamId::FilterCutoffEnvS; rId = ParamId::FilterCutoffEnvR; - break; - case EnvelopeId::FilterResonance: - aId = ParamId::FilterResonanceEnvA; dId = ParamId::FilterResonanceEnvD; sId = ParamId::FilterResonanceEnvS; rId = ParamId::FilterResonanceEnvR; - break; - default: // not found - break; - } + EnvelopeParam params = ENV_PARAMS[static_cast(id)]; - ui_->sliderAttack->setRange(PARAM_DEFS[static_cast(aId)].min, PARAM_DEFS[static_cast(aId)].max); - ui_->sliderDecay->setRange(PARAM_DEFS[static_cast(dId)].min, PARAM_DEFS[static_cast(dId)].max); - ui_->sliderSustain->setRange(PARAM_DEFS[static_cast(sId)].min, PARAM_DEFS[static_cast(sId)].max); - ui_->sliderRelease->setRange(PARAM_DEFS[static_cast(rId)].min, PARAM_DEFS[static_cast(rId)].max); + ui_->sliderAttack->setRange(PARAM_DEFS[static_cast(params.a)].min, PARAM_DEFS[static_cast(params.a)].max); + ui_->sliderDecay->setRange(PARAM_DEFS[static_cast(params.d)].min, PARAM_DEFS[static_cast(params.d)].max); + ui_->sliderSustain->setRange(PARAM_DEFS[static_cast(params.s)].min, PARAM_DEFS[static_cast(params.s)].max); + ui_->sliderRelease->setRange(PARAM_DEFS[static_cast(params.r)].min, PARAM_DEFS[static_cast(params.r)].max); - setAttack(PARAM_DEFS[static_cast(aId)].def); - setDecay(PARAM_DEFS[static_cast(sId)].def); - setSustain(PARAM_DEFS[static_cast(sId)].def); - setRelease(PARAM_DEFS[static_cast(rId)].def); + setAttack(PARAM_DEFS[static_cast(params.a)].def); + setDecay(PARAM_DEFS[static_cast(params.d)].def); + setSustain(PARAM_DEFS[static_cast(params.s)].def); + setRelease(PARAM_DEFS[static_cast(params.r)].def); }