Just a heads-up: If someone sets a segment time on an envelope to zero (for example to have a zero attack), it will crash on the next Process() call.
Reason is that
time_samps = (uint32_t)(segment_time_[current_segment_] * sample_rate_);
ends up being zero and
[…]
c_inc_ = (end - beg) / time_samps;
will divide by zero.