cleanup envelopeGenerator initialization
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user