@Jamestocher The last value in each sequence needs to be CALCULATED from the beginning of the entire sample, so if your attack lasts x and your decay lasts for y then your message must be sent as
[$value at top of attack $time to get there ((x)) COMMA
$sustain level $decay time ((y)) $time of start of decay---from beginning of sample--- (x unless you want a "hold after the attack, in which case =x+hold-time) COMMA
$final level (often zero) $release time (time to get there) $time to start the release ((x+y(+hold if you had one!!)) + SUSTAIN TIME(
Sorry to introduce "hold" as well, but you might want it one day!
A BETTER WAY to explain it is maybe.... each group between commas is "value to go to" "in time" "starting at a time elapsed since the beginning of the whole sample", and of course the first instruction assumes a start at the beginning of the sample and therefore only has 2 parameters.
You could have an envelope that goes up and down (and sideways) as often as you like.
PS.. something like this.....vline parameters.pd