/* * 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. } } }