amalgam/src/FM/Envelope.cpp

105 lines
1.9 KiB
C++

/*
* Filename: Envelope.cpp
*
* Description:
*
*
* Version:
* Created: Sun Mar 8 08:41:17 2020
* Revision: None
* Author: Rachel Fae Fox (foxiepaws),fox@foxiepa.ws
*
*/
#include "Envelope.h"
namespace amalgam {
namespace FM {
float Envelope::process () {
switch (envstate) {
case _e_off:
if (*gate) {
t = 0;
envstate = _e_attack;
return process();
}
break;
case _e_attack:
if (*gate) {
if ( t < attack ) {
float stepsize = (max_level - min_level) / attack;
t++;
return t * stepsize;
} else {
t = 0;
envstate = _e_decay;
return max_level;
}
} else {
envstate = _e_attackrelease;
return process();
}
break;
case _e_decay:
if (*gate) {
if (t < decay) {
float stepsize = (max_level - sustain_level) / decay;
t++;
return (max_level - (t * stepsize));
} else {
envstate = _e_sustain;
return sustain_level;
}
} else {
envstate = _e_attackrelease;
return process();
}
break;
case _e_sustain:
if (!sustain) {
envstate = _e_release;
t = 0;
return process();
}
if (!*gate) {
t = 0;
envstate = _e_release;
return sustain_level;
}
return sustain_level;
break;
case _e_release:
if (*gate) {
// reset envelope.
envstate=_e_off;
return process();
}
if (modMode) {
return sustain_level;
}
if (t < release) {
float stepsize = (sustain_level - min_level) / release;
t++;
return sustain_level - (stepsize * t);
} else {
envstate = _e_off;
return min_level;
}
break;
case _e_attackrelease:
if (*gate) {
//reset envelope
envstate=_e_off;
return process();
}
return 0.0f;
break;
}
return 0.0f; // if this is reached, something went wrong or an unhandled function was used.
}
}
}