curve.h 774 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #pragma once
  2. inline byte calcCurve(Curve curve, int Value, int Form)
  3. {
  4. int ret = 0;
  5. float x = Value * 8.0;
  6. float f = ((float)Form) / 64.0; //[1;127]->[0.;2.0]
  7. switch(curve) {
  8. //[0-1023]x[0-127]
  9. case 0:
  10. ret = x * f / 16.0;
  11. break;
  12. case 1:
  13. ret = (127.0 / (exp(2.0 * f) - 1)) * (exp(f * x / 512.0) - 1.0);
  14. break; //Exp 4*(exp(x/256)-1)
  15. case 2:
  16. ret = log(1.0 + (f * x / 128.0)) * (127.0 / log((8 * f) + 1));
  17. break; //Log 64*log(1+x/128)
  18. case 3:
  19. ret = (127.0 / (1.0 + exp(f * (512.0 - x) / 64.0)));
  20. break; //Sigma
  21. case 4:
  22. ret = (64.0 - ((8.0 / f) * log((1024 / (1 + x)) - 1)));
  23. break; //Flat
  24. case eXTRA:
  25. ret = (x + 0x20) * f / 16.0;
  26. }
  27. if(ret <= 0) { return 0; }
  28. if(ret >= 127) { return 127; } //127
  29. return ret;
  30. }