Frank Sheeran

2018-10-01 07:21:05 UTC

Sali Andre,

I'm just now seeing your answer, thanks! It seems a lot more

complicated--but probably far more thorough--an explanation than I have.

The solution I hit upon to generate coefficients "multiplier" and "delta"

for the sample-by-sample calculation

current = previous * multiplier + delta

was to do the following calculations ONCE, AT INITIALIZATION TIME:

1) multiplier = pow( startLevel / endLevel, curve / secs / sampleRate )

This can be thought of as "curve" being approximately how steep the curve

should start, relative to linear, than exponential. curve=2 will be twice

as steep initially (for falling segment) or finally (for rising segment).

curve=.5 will split the distance between the linear and exponential curve's

initial (final) slope, and so on. Pretty intuitive.

2) solve for delta with a binary search over [-1,1] (can be much more

optimized), to find a delta that reaches endLevel in the right number of

samples. (Seems to take at most 40 iterations for 1/2 second curves).

Curve of 0 gives a multiplier of 1, so you get a linear "curve." For this

special and very common curve, just calculate:

delta = ( endLevel - startLevel ) / sec / sampleRate

Curve of 1 will give an exponential curve that needs no delta. For this

special and very common curve, just calculate:

delta = 0.

Otherwise the iterative method finds a delta for curve values about

[-6.6,6.6] for a half-second curve rising from 0+-47dB to 1+-47dB. (-47dB

is a default value in my envelope for an epsilon shift, allowing

exponential curves to reach 0.) Negative curve values will produce the

exact same curve as the corresponding positive, except reversed top to

bottom and left to right.

It looks like your delta calculation is going to be much faster than my

iteration :-D But one little advantage of the iterative search is that it

will find a delta that actually works (if there is one), even if floating

point rounding errors make the theoretical number not work.

----------------

Reading your paper, it looks like you have a definition of "bend" than my

"curve". Your bend seems to be (0,1) with .5=linear. My curve is

theoretically infinite range but in practice more like [-5,5] with

0=linear. Since your delta calculation refers to your bend, I won't be

able to use your formula directly. However seeing that you found a

solution for your "bend" gives me hope that there's a solution for my

"curve."

Gruss, Frank

I'm just now seeing your answer, thanks! It seems a lot more

complicated--but probably far more thorough--an explanation than I have.

The solution I hit upon to generate coefficients "multiplier" and "delta"

for the sample-by-sample calculation

current = previous * multiplier + delta

was to do the following calculations ONCE, AT INITIALIZATION TIME:

1) multiplier = pow( startLevel / endLevel, curve / secs / sampleRate )

This can be thought of as "curve" being approximately how steep the curve

should start, relative to linear, than exponential. curve=2 will be twice

as steep initially (for falling segment) or finally (for rising segment).

curve=.5 will split the distance between the linear and exponential curve's

initial (final) slope, and so on. Pretty intuitive.

2) solve for delta with a binary search over [-1,1] (can be much more

optimized), to find a delta that reaches endLevel in the right number of

samples. (Seems to take at most 40 iterations for 1/2 second curves).

Curve of 0 gives a multiplier of 1, so you get a linear "curve." For this

special and very common curve, just calculate:

delta = ( endLevel - startLevel ) / sec / sampleRate

Curve of 1 will give an exponential curve that needs no delta. For this

special and very common curve, just calculate:

delta = 0.

Otherwise the iterative method finds a delta for curve values about

[-6.6,6.6] for a half-second curve rising from 0+-47dB to 1+-47dB. (-47dB

is a default value in my envelope for an epsilon shift, allowing

exponential curves to reach 0.) Negative curve values will produce the

exact same curve as the corresponding positive, except reversed top to

bottom and left to right.

It looks like your delta calculation is going to be much faster than my

iteration :-D But one little advantage of the iterative search is that it

will find a delta that actually works (if there is one), even if floating

point rounding errors make the theoretical number not work.

----------------

Reading your paper, it looks like you have a definition of "bend" than my

"curve". Your bend seems to be (0,1) with .5=linear. My curve is

theoretically infinite range but in practice more like [-5,5] with

0=linear. Since your delta calculation refers to your bend, I won't be

able to use your formula directly. However seeing that you found a

solution for your "bend" gives me hope that there's a solution for my

"curve."

Gruss, Frank