(no subject)
(too old to reply)
Frank Sheeran
2018-09-28 06:58:45 UTC
I have a general purpose synthesizer envelope with an arbitrary number of
segments. Each segment can be linear or exponential right now, as chosen
by the user.

Whichever of the two options was chosen, the "next sample's output" of the
envelope is generated from the current sample with the formula:

current = previous * multiplier + delta.

Say the segment is going to be 10,000 samples long and the output should
fall from 2 to 1.

For a linear segment, multiplier = 1 and delta = (1-2) / 10000.

For a exponential segment, delta = 0 and multiplier = pow( 2/1, 1/10000).

(It turns out that the repeated multiplication is extremely accurate. Even
for segment lengths under 5 minutes at 44.1kHz and value outputs of just a
semitone ratio, the output closest to the expected final output is the
expected sample.)

Users suggest that other curves be offered. I'm sure that given the
constraints of start point, end point, and any other point within that
rectangle to go through, there will be a multiplier/delta combo that does
it. But:

1) how do I find that pair (other than for instance brute-force binary

2) is there any naming convention for the resulting set of curves? My
current thought on would be a notation whereby 0=linear. 1=exponential.
Otherwise, we look at x=halfway through the curve, and y [0,1] is an
interpolation between linear and exponential y at that x; [1,infinity] is
an interpolation between exponential y and the endpoint; and negative
values are simply on the other side of linear. But while this would be
easy enough to explain (with a picture) and code, it's not particularly
even, and I wonder if there isn't already an established system.
André Michelle
2018-09-28 07:29:18 UTC
Post by Frank Sheeran
current = previous * multiplier + delta.
Hi Frank,

we developed the same idea six years ago for www.audiotool.com

Werner Van Belle worked the math out: http://werner.yellowcouch.org/Papers/fastenv12/index.html


André Michelle

Continue reading on narkive: