You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
2.1KB

  1. #include "cubefader.hpp"
  2. #include <iostream>
  3. #include "util/math.hpp"
  4. #include "rack.hpp"
  5. namespace rack_plugin_CastleRocktronics {
  6. void Cubefader::step() {
  7. float x, y, z, crossFaded;
  8. if (params[UNI_BI_TOGGLE].value <= 0.5f) {
  9. x = rescaleInputBiPolar(inputs[X_CV], params[X_TRIMPOT]);
  10. y = rescaleInputBiPolar(inputs[Y_CV], params[Y_TRIMPOT]);
  11. z = rescaleInputBiPolar(inputs[Z_CV], params[Z_TRIMPOT]);
  12. } else {
  13. x = rescaleInputUniPolar(inputs[X_CV], params[X_TRIMPOT]);
  14. y = rescaleInputUniPolar(inputs[Y_CV], params[Y_TRIMPOT]);
  15. z = rescaleInputUniPolar(inputs[Z_CV], params[Z_TRIMPOT]);
  16. }
  17. crossFaded = trilinear(
  18. inputs[INPUT_000].value, inputs[INPUT_100].value, inputs[INPUT_010].value,
  19. inputs[INPUT_110].value, inputs[INPUT_001].value, inputs[INPUT_101].value,
  20. inputs[INPUT_011].value, inputs[INPUT_111].value, x, y, z);
  21. outputs[OUTPUT].value = antiAlias(crossFaded);
  22. };
  23. float Cubefader::linear(float x0, float x1, float xDist) {
  24. return (x1 * xDist) + (x0 * (1 - xDist));
  25. };
  26. float Cubefader::bilinear(float xy00, float xy10, float xy01, float xy11,
  27. float x, float y) {
  28. return linear(linear(xy01, xy11, x), linear(xy00, xy10, x), y);
  29. };
  30. float Cubefader::trilinear(float xyz000, float xyz100, float xyz010,
  31. float xyz110, float xyz001, float xyz101,
  32. float xyz011, float xyz111, float x, float y,
  33. float z) {
  34. return linear(bilinear(xyz000, xyz100, xyz010, xyz110, x, y),
  35. bilinear(xyz001, xyz101, xyz011, xyz111, x, y), z);
  36. };
  37. float Cubefader::antiAlias(float input) {
  38. z_1 = (z_1 * aaFactor) + ((1 - aaFactor) * input);
  39. z_2 = (z_2 * aaFactor) + ((1 - aaFactor) * z_1);
  40. return z_2;
  41. };
  42. float Cubefader::rescaleInputUniPolar(Input input, Param trim) {
  43. float scaled = rescalef(input.value * trim.value, 0.0f, 10.0f, 0.0f, 1.0f);
  44. return clampf(scaled, 0.0f, 1.0f);
  45. };
  46. float Cubefader::rescaleInputBiPolar(Input input, Param trim) {
  47. float scaled = rescalef(input.value * trim.value, -10.0f, 10.0f, 0.0f, 1.0f);
  48. return clampf(scaled, 0.0f, 1.0f);
  49. };
  50. } // namespace rack_plugin_CastleRocktronics