Open Fire-wood opened 6 years ago
So what we call the "ADSR" module is just a curve that has a few stop points - there's no way for it to return to the regular volume when the key is released if it hasn't reached the sustain point at the moment. This isn't the normal behavior, obviously.
I'm not sure what to do about this, other than saying that it doesn't have the expected behaviour, and the "Attack/Release" module is probably more useful there (although it doesn't have a separate sustain). Perhaps rename the "ADSR" one to "Envelope" and add an ADSR one that has the expected behaviour? I'm open to suggestions.
The simplest solution to achieve ADSR would be to implement the controls from 3x Osc - Attack, A-Tension, A-Hold, Decay, D-Tension, Sustain, Release, R-Tension (as the Attack/Release node). While this solution restricts how creative you can get with volume envelopes, it should be sufficient for most of the synths being envisioned.
A 'hacky' alternative would be to add 'Jump Tags' - namely if the time slider hits a jump tag, and the current gate/active value matches it, the time slider jumps its equivalent tag somewhere else on the graph (probably add the rule where the second tag must be after the first to avoid infinite loops). This would allow the possibility to manually find the likely spots that a synth key will be released and ADSR can be achieved that way (pretty dodgy and user-inefficient, but technically do-able).
Using the ADSR graph to create sounds with a slow attack causes issues when playing sounds, as it will currently play through the whole graph when a key is pressed regardless of how long it is held (until it reaches the sustain point) instead of moving to it's equivalent volume after the sustain once the key is no longer held.