|
- #pragma once
- #include <vector>
- #include "util/common.hpp"
- #include <jansson.h>
-
-
- 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 > 0.f) ? brightness * brightness : 0.f;
- }
- /** Emulates slow fall (but immediate rise) of LED brightness.
- `frames` rescales the timestep. For example, if your module calls this method every 16 frames, use 16.0.
- */
- void setBrightnessSmooth(float brightness, float frames = 1.f);
- };
-
- 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<Param> params;
- std::vector<Input> inputs;
- std::vector<Output> outputs;
- std::vector<Light> lights;
- /** For CPU usage meter */
- float cpuTime = 0.0;
-
- /** Constructs a Module with no params, inputs, outputs, and lights */
- Module() {}
- /** Constructs a Module with a fixed number of params, inputs, outputs, and lights */
- 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() {}
-
- /** Called when the engine sample rate is changed */
- virtual void onSampleRateChange() {}
- /** Called when module is created by the Add Module popup, cloning, or when loading a patch or autosave */
- virtual void onCreate() {}
- /** Called when user explicitly deletes the module, not when Rack is closed or a new patch is loaded */
- virtual void onDelete() {}
- /** Called when user clicks Initialize in the module context menu */
- virtual void onReset() {
- // Call deprecated method
- reset();
- }
- /** Called when user clicks Randomize in the module context menu */
- virtual void onRandomize() {
- // Call deprecated method
- randomize();
- }
-
- /** Override these to store extra internal data in the "data" property */
- virtual json_t *toJson() { return NULL; }
- virtual void fromJson(json_t *root) {}
-
- /** Deprecated */
- virtual void reset() {}
- /** Deprecated */
- virtual void randomize() {}
- };
-
- 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;
- /** If plugins begin using this in harmful ways, I will remove it and break your API.
- To avoid spoiling the fun for everyone, make sure your plugins demonstrate good behavior by not being "surprising" to the user. Your plugin needs to have a clear purpose for manipulating other modules and wires and must be done with a good UX.
- */
- extern std::vector<Module*> gModules;
- extern std::vector<Wire*> gWires;
-
-
- } // namespace rack
|