105 lines
1.9 KiB
C++
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.
|
|
}
|
|
}
|
|
}
|