Get normalized slider value
-
I'm using a slider to control the volume of a container. The slider is set to dB mode -100 to 0, but the container volume attribute expects a value between 0 and 1. If I change my slider to be between 0 and 1 the value read out will no longer be correct. Could we have a function to normalize the value of the slider to 0-1?
-
Two solutions:
-
Use the SimpleGain module, which has a dB-Range for the volume. The advantage is that the volume parameter is smoothed there, so you don't get the nasty zipper effects like when controlling the sound generators gain directly.
-
Use
Engine.getGainFactorForDecibels()
in your control callback to convert the dB Value of the slider to a gain factor from 0...1.
For a mixer type control I highly recommend the first solution because of not-zippering.
-
-
Aha that's good. Does the simple gain module add much CPU overhead? I'm using simple gains for my main mixer anyway but this container volume control was so I can tweak the volume of individual articulations from the UI.
-
I've just added 10 Containers with 10 SimpleGain modules and it uses 15% - 20% CPU, so you have 0.1% - 0.3% CPU usage per simple gain module. Shouldn't be too problematic :)
EDIT: However, if you rarely use it and have to write a custom callback anyway (which I think is the case since you are using a dynamic target), the
Engine.getGainFactorForDecibel
thing might be more practical in this scenario -
Is there a handy function to convert a CC value (0-127) to an attack time slider (0-20000)? I've been using
v = (Message.getControllerValue() * 20000) / 127;
but the resolution is poor. -
Why is the resolution poor? If you want to make sure it uses floating point precision, use decimal numbers like this:
v = (Message.getControllerValue() * 20000.0) / 127.0
There's nothing that can be more precise in Javascript :)
-
Maybe resolution is the wrong term. Basically if my CC is at 1 (the lowest it can be above 0) then the slider will be at 157ms which is not very good for an attack slider.
-
Ah, you need a skew factor:
// values > 1 will yield more resolution at the lower end var skewFactor = 5.0; var normalised = Message.getControllerValue() / 127.0; // this will "bend" the line towards the lower end var skewed = Math.pow(normalised, skewFactor); var value = skewed * 20000.0;
There are more sophisticated methods, but this is a quick'n dirty formula to give you more resolution on the lower end. Also, exchange
var
with the suitable variable type (I usedvar
to be as generic as possible in this example). -
Yes that looks like what I'm after. Thank you!