#include "cubefader.hpp" #include #include "util/math.hpp" #include "rack.hpp" namespace rack_plugin_CastleRocktronics { void Cubefader::step() { float x, y, z, crossFaded; if (params[UNI_BI_TOGGLE].value <= 0.5f) { x = rescaleInputBiPolar(inputs[X_CV], params[X_TRIMPOT]); y = rescaleInputBiPolar(inputs[Y_CV], params[Y_TRIMPOT]); z = rescaleInputBiPolar(inputs[Z_CV], params[Z_TRIMPOT]); } else { x = rescaleInputUniPolar(inputs[X_CV], params[X_TRIMPOT]); y = rescaleInputUniPolar(inputs[Y_CV], params[Y_TRIMPOT]); z = rescaleInputUniPolar(inputs[Z_CV], params[Z_TRIMPOT]); } crossFaded = trilinear( inputs[INPUT_000].value, inputs[INPUT_100].value, inputs[INPUT_010].value, inputs[INPUT_110].value, inputs[INPUT_001].value, inputs[INPUT_101].value, inputs[INPUT_011].value, inputs[INPUT_111].value, x, y, z); outputs[OUTPUT].value = antiAlias(crossFaded); }; float Cubefader::linear(float x0, float x1, float xDist) { return (x1 * xDist) + (x0 * (1 - xDist)); }; float Cubefader::bilinear(float xy00, float xy10, float xy01, float xy11, float x, float y) { return linear(linear(xy01, xy11, x), linear(xy00, xy10, x), y); }; float Cubefader::trilinear(float xyz000, float xyz100, float xyz010, float xyz110, float xyz001, float xyz101, float xyz011, float xyz111, float x, float y, float z) { return linear(bilinear(xyz000, xyz100, xyz010, xyz110, x, y), bilinear(xyz001, xyz101, xyz011, xyz111, x, y), z); }; float Cubefader::antiAlias(float input) { z_1 = (z_1 * aaFactor) + ((1 - aaFactor) * input); z_2 = (z_2 * aaFactor) + ((1 - aaFactor) * z_1); return z_2; }; float Cubefader::rescaleInputUniPolar(Input input, Param trim) { float scaled = rescalef(input.value * trim.value, 0.0f, 10.0f, 0.0f, 1.0f); return clampf(scaled, 0.0f, 1.0f); }; float Cubefader::rescaleInputBiPolar(Input input, Param trim) { float scaled = rescalef(input.value * trim.value, -10.0f, 10.0f, 0.0f, 1.0f); return clampf(scaled, 0.0f, 1.0f); }; } // namespace rack_plugin_CastleRocktronics