cleanup envelopeGenerator initialization

This commit is contained in:
2025-12-26 15:37:20 -06:00
parent cbd60e2701
commit d0bf55faf7
3 changed files with 26 additions and 24 deletions

View File

@@ -25,7 +25,6 @@ enum class ParamId : uint16_t {
Count // for sizing Count // for sizing
}; };
// TODO: might make a map of EnvelopeIds to a struct of 4 ParamIds
enum class EnvelopeId : uint16_t { enum class EnvelopeId : uint16_t {
Osc1Volume, Osc1Volume,
Osc2Volume, Osc2Volume,
@@ -35,6 +34,22 @@ enum class EnvelopeId : uint16_t {
Count Count
}; };
struct EnvelopeParam {
ParamId a;
ParamId d;
ParamId s;
ParamId r;
};
constexpr std::array<EnvelopeParam, static_cast<size_t>(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 { struct ParamDefault {
float def; float def;
float min; float min;

View File

@@ -72,6 +72,7 @@ void Synth::process(float* out, uint32_t nFrames, uint32_t sampleRate) {
for(auto& p : params_) p.update(); // TODO: profile this for(auto& p : params_) p.update(); // TODO: profile this
// process all envelopes // 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)); gainEnvelope_.set(getParam(ParamId::Osc1VolumeEnvA), getParam(ParamId::Osc1VolumeEnvD), getParam(ParamId::Osc1VolumeEnvS), getParam(ParamId::Osc1VolumeEnvR));
float gain = gainEnvelope_.process(); float gain = gainEnvelope_.process();
// TODO: envelope is shared between all notes so this sequence involves a note change but only one envelope attack: // TODO: envelope is shared between all notes so this sequence involves a note change but only one envelope attack:

View File

@@ -67,30 +67,16 @@ void EnvelopeGenerator::emitEnvelope() {
void EnvelopeGenerator::init(EnvelopeId id) { void EnvelopeGenerator::init(EnvelopeId id) {
// could probably make this simpler with a map EnvelopeParam params = ENV_PARAMS[static_cast<size_t>(id)];
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;
}
ui_->sliderAttack->setRange(PARAM_DEFS[static_cast<size_t>(aId)].min, PARAM_DEFS[static_cast<size_t>(aId)].max); ui_->sliderAttack->setRange(PARAM_DEFS[static_cast<size_t>(params.a)].min, PARAM_DEFS[static_cast<size_t>(params.a)].max);
ui_->sliderDecay->setRange(PARAM_DEFS[static_cast<size_t>(dId)].min, PARAM_DEFS[static_cast<size_t>(dId)].max); ui_->sliderDecay->setRange(PARAM_DEFS[static_cast<size_t>(params.d)].min, PARAM_DEFS[static_cast<size_t>(params.d)].max);
ui_->sliderSustain->setRange(PARAM_DEFS[static_cast<size_t>(sId)].min, PARAM_DEFS[static_cast<size_t>(sId)].max); ui_->sliderSustain->setRange(PARAM_DEFS[static_cast<size_t>(params.s)].min, PARAM_DEFS[static_cast<size_t>(params.s)].max);
ui_->sliderRelease->setRange(PARAM_DEFS[static_cast<size_t>(rId)].min, PARAM_DEFS[static_cast<size_t>(rId)].max); ui_->sliderRelease->setRange(PARAM_DEFS[static_cast<size_t>(params.r)].min, PARAM_DEFS[static_cast<size_t>(params.r)].max);
setAttack(PARAM_DEFS[static_cast<size_t>(aId)].def); setAttack(PARAM_DEFS[static_cast<size_t>(params.a)].def);
setDecay(PARAM_DEFS[static_cast<size_t>(sId)].def); setDecay(PARAM_DEFS[static_cast<size_t>(params.d)].def);
setSustain(PARAM_DEFS[static_cast<size_t>(sId)].def); setSustain(PARAM_DEFS[static_cast<size_t>(params.s)].def);
setRelease(PARAM_DEFS[static_cast<size_t>(rId)].def); setRelease(PARAM_DEFS[static_cast<size_t>(params.r)].def);
} }