34 |
|
|
35 |
// TODO: add support for loops |
// TODO: add support for loops |
36 |
// TODO: optimization: use segment_lin for linear stages |
// TODO: optimization: use segment_lin for linear stages |
37 |
|
// TODO: support cancel_release events? |
38 |
|
|
39 |
void EG::update(event_t Event, uint SampleRate) { |
void EG::update(event_t Event, uint SampleRate) { |
40 |
if (atEnd(Event)) return; |
if (atEnd(Event)) return; |
41 |
|
|
42 |
|
// ignore duplicated release events |
43 |
|
if (Event == event_release) { |
44 |
|
if (GotRelease) return; |
45 |
|
GotRelease = true; |
46 |
|
} |
47 |
|
|
48 |
if (Event == event_stage_end || Event == event_release) { |
if (Event == event_stage_end || Event == event_release) { |
49 |
if (Stage == eg->node.size() - 1) { |
if (Stage == eg->node.size() - 1) { |
50 |
enterFadeOutStage(); |
enterFadeOutStage(); |
90 |
Stage = 0; |
Stage = 0; |
91 |
this->eg = ⪚ |
this->eg = ⪚ |
92 |
TimeCoeff = exp(0.0054578518 * Velocity); // pow(2, Velcocity / 127) |
TimeCoeff = exp(0.0054578518 * Velocity); // pow(2, Velcocity / 127) |
93 |
|
GotRelease = false; |
94 |
|
|
95 |
enterFirstStage(); |
enterFirstStage(); |
96 |
update(event_stage_end, SampleRate); |
update(event_stage_end, SampleRate); |