#pragma once #include #include "util.hpp" #include namespace rack { struct Param { float value = 0.0; }; struct Light { /** The square of the brightness value */ float value = 0.0; float getBrightness(); void setBrightness(float brightness) { value = brightness * brightness; } void setBrightnessSmooth(float brightness); }; struct Input { /** Voltage of the port, zero if not plugged in. Read-only by Module */ float value = 0.0; /** Whether a wire is plugged in */ bool active = false; Light plugLights[2]; /** Returns the value if a wire is plugged in, otherwise returns the given default value */ float normalize(float normalValue) { return active ? value : normalValue; } }; struct Output { /** Voltage of the port. Write-only by Module */ float value = 0.0; /** Whether a wire is plugged in */ bool active = false; Light plugLights[2]; }; struct Module { std::vector params; std::vector inputs; std::vector outputs; std::vector lights; /** For CPU usage meter */ float cpuTime = 0.0; /** Deprecated, use constructor below this one */ Module() DEPRECATED {} /** Constructs Module with a fixed number of params, inputs, and outputs */ Module(int numParams, int numInputs, int numOutputs, int numLights = 0) { params.resize(numParams); inputs.resize(numInputs); outputs.resize(numOutputs); lights.resize(numLights); } virtual ~Module() {} /** Advances the module by 1 audio frame with duration 1.0 / gSampleRate */ virtual void step() {} virtual void onSampleRateChange() {} /** Override these to implement spacial behavior when user clicks Initialize and Randomize */ virtual void reset() {} virtual void randomize() {} /** Deprecated */ virtual void initialize() final {} /** Override these to store extra internal data in the "data" property */ virtual json_t *toJson() { return NULL; } virtual void fromJson(json_t *root) {} }; struct Wire { Module *outputModule = NULL; int outputId; Module *inputModule = NULL; int inputId; void step(); }; void engineInit(); void engineDestroy(); /** Launches engine thread */ void engineStart(); void engineStop(); /** Does not transfer pointer ownership */ void engineAddModule(Module *module); void engineRemoveModule(Module *module); /** Does not transfer pointer ownership */ void engineAddWire(Wire *wire); void engineRemoveWire(Wire *wire); void engineSetParam(Module *module, int paramId, float value); void engineSetParamSmooth(Module *module, int paramId, float value); void engineSetSampleRate(float sampleRate); float engineGetSampleRate(); /** Returns the inverse of the current sample rate */ float engineGetSampleTime(); extern bool gPaused; } // namespace rack