DB to gain~ to DB

Maa's icon

I am using the Gain Object to set level
I want to be able to set the value in DB
Then when I get the value from the outlet in the range 0 to 157
i'd like to have the exact number I punch in

to make it simple I am searching to build these 2 subpatchs

Max Patch
Copy patch and select New From Clipboard in Max.

I look àt several docs but I can't find the exact formulas
I sure I am not the first one to try this
I am even surprised it is not part of the object

Roman Thilenius's icon

[expr (pow(10.,$f1*0.05))*($f1!=-90.)]
[* 127]

Maa's icon

Sorry this is unclear
could you complete the patch ?
thanks Maa

Roman Thilenius's icon

[flonum] -90. - 0. (db/A)
|
[expr (pow(10.,$f1*0.05))*($f1!=-90.)] (transform dB/A to 0.-1.)
|
[* 127]
|
gainslider

Maa's icon

The object gain~ / DB have this correspondence
158 = 17.4 dB
128 = 0 dB
1 = -75.6 dB
and I don't see the relation with your expression

maxwainwright's icon

maybe you could try [live.gain~]

jvkr's icon
Max Patch
Copy patch and select New From Clipboard in Max.

You have to work it out yourself, but in the patch below there might be some useful hints. All that is required is simple math and db to amplitude conversion. Hope it helps.

Roman Thilenius's icon

oh well, when it is 1-128 it is

[expr (pow(10.,$f1*0.05))*($f1!=-90.)]
|
[* 127]
|
[+ 1]

i thought it is 0-127 :)

Maa's icon

very usefull, I can compare to exact values
The live.gain do the job even simplier and better( I put it also in the patch to compare )
any differences oddities advantages with the live object en general ?
or they are just msp objects ?

maxwainwright's icon

Well, live.gain~ is stereo which is nice most of the time for me at least. And it has built in meters with clipping and stuff. Maybe too much for some things.

You could try looking into combinations of slider, scale and *~ also maybe.

rbblackstone's icon

Hello,

Yes I know this thread is a year old, but I was trying to do the same thing and did not find anything else in the forum that seemed clear to me.

The formula I came up with for dB for gain~ from the slider value is:

dB gain of the slider = 20*log(2^(( x-128)/10)) "dB"

Where x is the gain~ slider value and the settings are the default.

Default settings:
158 steps or 0 to 157 on the slider
128 is 0dB (no gain or loss)
10 slider value steps = 6 dB (probably 6.02)
157 is roughly +18dB
1 is roughly -76 dB
0 is off. It should say -infinity, but the meter reads -120 dB. (effectively the same thing)

I would love to know more about these values.
base value (7.94231)
increment (1.071519

Zero is a separate case - I imagine there is a more elegant way to handle it than what I did in the patch. I am relatively new to Max, but an old hand at audio.

Generating the slider value should be the reverse of this process. Feel free to do that or I'll pursue that another time.

If you decide to look at the patch, the left side is individual steps and the right is my attempt to pack it into one expr. The results at the very end of the scale are different. Miniscule, but may highlight differences in algorithms.

There is a cycle~ connected to the meter so that you can compare the meter out with the calculation. How that value correlates with real VU ballistics or an RMS value is anyone's guess. It does seem to show the calc to be pretty close for a sine wave.

Please feel free to comment and let me know if I just calculated something that's already an object. LOL

Max Patch
Copy patch and select New From Clipboard in Max.

-RB

ak's icon

see the very first hit. ^^

Roman Thilenius's icon

so, i refused to give that answer to the other guy one year ago, but i will do it now for you:

it is misleading and makes it only extra complicated to look at the gainslider MSP object in order to find out how it is calculated.
for a valid formula for "dB/A to linear" i am posting my solution for the 4th time now:

-90. – 0.
|
[expr (pow(10.,$f1*0.05))*($f1!=-90.)]
|
0. – 1.

where the input and the output range will also work with this formula when you exceed +0. db/A:

+6.
|
[expr (pow(10.,$f1*0.05))*($f1!=-90.)]
|
2.

the "158" of the gainslider GUI object is set by will, it is only releated to the slider resolution and has nothing to do with gaining up a digital audio signal.
you shouldn´t deal at all with "step value" and these things. ignore this object and build your own.

dB/A (float) – [expr (pow(10.,$f1*0.05))*($f1!=-90.)] – [*~ 0.] is all you need.

for displaying the result with a GUI object you might need to scale the "linear" value.
the "live" objects might be an alternative for the GUI, multislider is another one.

i find my vesion of "dealing with the 0" the most elegant possible, just to answer that question, too. :)
or did you mean the "0" of the dB/A result? that should be 100% at "0.0" if you use a correct expression.

-110

Alberto Barberis's icon

I wrote this little patch today, to connect dB to a gain~ object.
Maybe it can be useful for someone.
Bye :)

ab.dBgain.maxpat
Max Patch