Maybe you want to take this into account (I am currently working on a Lua based example for this…):
A point is specified by
– min, max and default value for each axis
– linked point for each axis
The rules are implemented on the level of the envelope control, a point itself contains no control logic. An ADSR envelope would be of type time/level and treats it´s points as a left-to-right sequence. Rules for handling are as follows:
If a point has a range on an axis (given bei min/max value), it is moveable on the axis. If a point has a linked point, the envelope updates the point position when it updates the linked point. The ranges set the dimensions of the bounding rectangle for each point.
Take the decay/sustain points as an example:
Decay gets min/max values that make it moveable on both axis. Decay is linked to Sustain:Y. Sustain gets min/max:X = MAX, thus is not moveable on the x-axis. Sustain is linked to Decay:Y. Now if you move Decay on the y-axis, sustain will follow. If you move sustain on the y-axis, Decay will follow.
As I said, I´m working on an example for that. The goal is to implement one ruleset on the envelope control level, and then set it´s character (ADSR, DADBSSR…) by adding points configured by min/max and linked points. Let´s see how this works out 🙂