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

search)?

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.

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

search)?

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.