# Math.ratio

• Simple one here, adding a math function that I end up using in most projects.

Converting one variable in a given range, to the equivalent value in another range via:

NewValue = (((OldValue - OldMin) * (NewMax - NewMin)) / (OldMax - OldMin)) + NewMin

Easy to use my own function, but I'm sure this is one many would benefit from and likely already use.

Final output would look something like:

Math.rangeRatio(input, oldmin, oldmax, newmin, newmax)

• I think the math functions in HISE are just wrapper for the JUCE math library, so it would require a little more work to add a custom function (I might be wrong though).

I also seem to recall with this function that if `oldMax - oldMin == 0` the function returns the wrong result, so you have to handle that separately.

This is from my KSP library

``````//Maps a given value in a given range of values to that of another range of values
taskfunc units.rescale(value, oldmin, oldmax, newmin, newmax) -> return

declare local old_range
declare local new_range

old_range := oldmax - oldmin

if (old_range = 0)
return := newmin
else
new_range := newmax - newmin

return := (((value - oldmin) * new_range) / old_range) + newmin
end if

end taskfunc
``````

• @d-healey

Yeah you do need to handle it if the old range is 0, which is a very, very fringe case though since you'd need to call the function intentionally, without having a previous range at all!

• @LightandSound @d-healey In what kind of situation would you have the `oldRange` equal to `0`?
Variable range going from negative to positive value?

• @ustk that's why I say it's a fringe case, essentially if you set them as variables or for example use getvalue() without setting the min/max value of the panel then you could run in to problems. But there shouldn't be a 'real world use' for a range of 0 to a larger range, since all that does is spit out the same value. It's just to protect for the inevitable case where human error gets in the way.