| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- #pragma once
- #include "settings.h"
- inline byte calcCurve(CurveSettings curveSettings, int Value)
- {
- int ret = 0;
- float x = Value * 8.0;
- float f = ((float)curveSettings.value) / 64.0; //[1;127]->[0.;2.0]
- switch(curveSettings.type) {
- //[0-1023]x[0-127]
- case 0:
- ret = x * f / 16.0;
- break;
- case 1:
- ret = (127.0 / (exp(2.0 * f) - 1)) * (exp(f * x / 512.0) - 1.0);
- break; //Exp 4*(exp(x/256)-1)
- case 2:
- ret = log(1.0 + (f * x / 128.0)) * (127.0 / log((8 * f) + 1));
- break; //Log 64*log(1+x/128)
- case 3:
- ret = (127.0 / (1.0 + exp(f * (512.0 - x) / 64.0)));
- break; //Sigma
- case 4:
- ret = (64.0 - ((8.0 / f) * log((1024 / (1 + x)) - 1)));
- break; //Flat
- case eXTRA:
- ret = (x + 0x20) * f / 16.0;
- }
- ret = ret * (curveSettings.factor / 127.0) + curveSettings.offset;
- if(ret <= 0) { return 0; }
- if(ret >= 127) { return 127; } //127
- return ret;
- }
|