@@ -25,6 +25,8 @@ struct Knob : ParamWidget { | |||||
void onDragStart(const widget::DragStartEvent &e) override; | void onDragStart(const widget::DragStartEvent &e) override; | ||||
void onDragEnd(const widget::DragEndEvent &e) override; | void onDragEnd(const widget::DragEndEvent &e) override; | ||||
void onDragMove(const widget::DragMoveEvent &e) override; | void onDragMove(const widget::DragMoveEvent &e) override; | ||||
void reset() override; | |||||
void randomize() override; | |||||
}; | }; | ||||
@@ -28,6 +28,8 @@ struct ParamWidget : widget::OpaqueWidget { | |||||
void fromJson(json_t *rootJ); | void fromJson(json_t *rootJ); | ||||
void createContextMenu(); | void createContextMenu(); | ||||
void resetAction(); | void resetAction(); | ||||
virtual void reset() {} | |||||
virtual void randomize() {} | |||||
}; | }; | ||||
@@ -19,6 +19,8 @@ struct Switch : ParamWidget { | |||||
void onDoubleClick(const widget::DoubleClickEvent &e) override; | void onDoubleClick(const widget::DoubleClickEvent &e) override; | ||||
void onDragStart(const widget::DragStartEvent &e) override; | void onDragStart(const widget::DragStartEvent &e) override; | ||||
void onDragEnd(const widget::DragEndEvent &e) override; | void onDragEnd(const widget::DragEndEvent &e) override; | ||||
void reset() override; | |||||
void randomize() override; | |||||
}; | }; | ||||
@@ -54,8 +54,6 @@ struct Module { | |||||
void config(int numParams, int numInputs, int numOutputs, int numLights = 0); | void config(int numParams, int numInputs, int numOutputs, int numLights = 0); | ||||
json_t *toJson(); | json_t *toJson(); | ||||
void fromJson(json_t *rootJ); | void fromJson(json_t *rootJ); | ||||
void reset(); | |||||
void randomize(); | |||||
struct ProcessArgs { | struct ProcessArgs { | ||||
float sampleRate; | float sampleRate; | ||||
@@ -48,8 +48,6 @@ struct Param { | |||||
/** An optional one-sentence description of the parameter. */ | /** An optional one-sentence description of the parameter. */ | ||||
std::string description; | std::string description; | ||||
ParamQuantityFactory *paramQuantityFactory = NULL; | ParamQuantityFactory *paramQuantityFactory = NULL; | ||||
/** Determines whether this Param will be randomized when the user requests to randomize the Module. */ | |||||
bool randomizable = true; | |||||
~Param() { | ~Param() { | ||||
if (paramQuantityFactory) | if (paramQuantityFactory) | ||||
@@ -93,8 +91,6 @@ struct Param { | |||||
json_t *toJson(); | json_t *toJson(); | ||||
void fromJson(json_t *rootJ); | void fromJson(json_t *rootJ); | ||||
void reset(); | |||||
void randomize(); | |||||
}; | }; | ||||
@@ -1,6 +1,7 @@ | |||||
#include "app/Knob.hpp" | #include "app/Knob.hpp" | ||||
#include "app.hpp" | #include "app.hpp" | ||||
#include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
#include "random.hpp" | |||||
#include "history.hpp" | #include "history.hpp" | ||||
@@ -98,6 +99,21 @@ void Knob::onDragMove(const widget::DragMoveEvent &e) { | |||||
ParamWidget::onDragMove(e); | ParamWidget::onDragMove(e); | ||||
} | } | ||||
void Knob::reset() { | |||||
if (paramQuantity && paramQuantity->isBounded()) { | |||||
paramQuantity->reset(); | |||||
} | |||||
} | |||||
void Knob::randomize() { | |||||
if (paramQuantity && paramQuantity->isBounded()) { | |||||
float value = math::rescale(random::uniform(), 0.f, 1.f, paramQuantity->getMinValue(), paramQuantity->getMaxValue()); | |||||
if (snap) | |||||
value = std::round(value); | |||||
paramQuantity->setValue(value); | |||||
} | |||||
} | |||||
} // namespace app | } // namespace app | ||||
} // namespace rack | } // namespace rack |
@@ -651,6 +651,9 @@ void ModuleWidget::resetAction() { | |||||
h->moduleId = module->id; | h->moduleId = module->id; | ||||
h->oldModuleJ = toJson(); | h->oldModuleJ = toJson(); | ||||
for (ParamWidget *param : params) { | |||||
param->reset(); | |||||
} | |||||
APP->engine->resetModule(module); | APP->engine->resetModule(module); | ||||
h->newModuleJ = toJson(); | h->newModuleJ = toJson(); | ||||
@@ -666,6 +669,9 @@ void ModuleWidget::randomizeAction() { | |||||
h->moduleId = module->id; | h->moduleId = module->id; | ||||
h->oldModuleJ = toJson(); | h->oldModuleJ = toJson(); | ||||
for (ParamWidget *param : params) { | |||||
param->randomize(); | |||||
} | |||||
APP->engine->randomizeModule(module); | APP->engine->randomizeModule(module); | ||||
h->newModuleJ = toJson(); | h->newModuleJ = toJson(); | ||||
@@ -6,7 +6,6 @@ | |||||
#include "app.hpp" | #include "app.hpp" | ||||
#include "engine/Engine.hpp" | #include "engine/Engine.hpp" | ||||
#include "settings.hpp" | #include "settings.hpp" | ||||
#include "random.hpp" | |||||
#include "history.hpp" | #include "history.hpp" | ||||
#include "helpers.hpp" | #include "helpers.hpp" | ||||
@@ -230,7 +229,7 @@ void ParamWidget::createContextMenu() { | |||||
void ParamWidget::resetAction() { | void ParamWidget::resetAction() { | ||||
if (paramQuantity && paramQuantity->isBounded()) { | if (paramQuantity && paramQuantity->isBounded()) { | ||||
float oldValue = paramQuantity->getValue(); | float oldValue = paramQuantity->getValue(); | ||||
paramQuantity->reset(); | |||||
reset(); | |||||
float newValue = paramQuantity->getValue(); | float newValue = paramQuantity->getValue(); | ||||
if (oldValue != newValue) { | if (oldValue != newValue) { | ||||
@@ -1,6 +1,7 @@ | |||||
#include "app/Switch.hpp" | #include "app/Switch.hpp" | ||||
#include "app.hpp" | #include "app.hpp" | ||||
#include "app/Scene.hpp" | #include "app/Scene.hpp" | ||||
#include "random.hpp" | |||||
#include "history.hpp" | #include "history.hpp" | ||||
@@ -69,6 +70,19 @@ void Switch::onDragEnd(const widget::DragEndEvent &e) { | |||||
} | } | ||||
} | } | ||||
void Switch::reset() { | |||||
if (paramQuantity && !momentary) { | |||||
paramQuantity->reset(); | |||||
} | |||||
} | |||||
void Switch::randomize() { | |||||
if (paramQuantity && !momentary) { | |||||
float value = paramQuantity->getMinValue() + std::floor(random::uniform() * (paramQuantity->getRange() + 1)); | |||||
paramQuantity->setValue(value); | |||||
} | |||||
} | |||||
} // namespace app | } // namespace app | ||||
} // namespace rack | } // namespace rack |
@@ -507,7 +507,7 @@ void Engine::resetModule(Module *module) { | |||||
VIPLock vipLock(internal->vipMutex); | VIPLock vipLock(internal->vipMutex); | ||||
std::lock_guard<std::recursive_mutex> lock(internal->mutex); | std::lock_guard<std::recursive_mutex> lock(internal->mutex); | ||||
module->reset(); | |||||
module->onReset(); | |||||
} | } | ||||
void Engine::randomizeModule(Module *module) { | void Engine::randomizeModule(Module *module) { | ||||
@@ -515,7 +515,7 @@ void Engine::randomizeModule(Module *module) { | |||||
VIPLock vipLock(internal->vipMutex); | VIPLock vipLock(internal->vipMutex); | ||||
std::lock_guard<std::recursive_mutex> lock(internal->mutex); | std::lock_guard<std::recursive_mutex> lock(internal->mutex); | ||||
module->randomize(); | |||||
module->onRandomize(); | |||||
} | } | ||||
void Engine::bypassModule(Module *module, bool bypass) { | void Engine::bypassModule(Module *module, bool bypass) { | ||||
@@ -89,21 +89,6 @@ void Module::fromJson(json_t *rootJ) { | |||||
rightModuleId = json_integer_value(rightModuleIdJ); | rightModuleId = json_integer_value(rightModuleIdJ); | ||||
} | } | ||||
void Module::reset() { | |||||
for (Param ¶m : params) { | |||||
param.reset(); | |||||
} | |||||
onReset(); | |||||
} | |||||
void Module::randomize() { | |||||
for (Param ¶m : params) { | |||||
if (param.randomizable) | |||||
param.randomize(); | |||||
} | |||||
onRandomize(); | |||||
} | |||||
} // namespace engine | } // namespace engine | ||||
} // namespace rack | } // namespace rack |
@@ -26,18 +26,6 @@ void Param::fromJson(json_t *rootJ) { | |||||
} | } | ||||
} | } | ||||
void Param::reset() { | |||||
if (isBounded()) { | |||||
value = defaultValue; | |||||
} | |||||
} | |||||
void Param::randomize() { | |||||
if (isBounded()) { | |||||
value = math::rescale(random::uniform(), 0.f, 1.f, minValue, maxValue); | |||||
} | |||||
} | |||||
} // namespace engine | } // namespace engine | ||||
} // namespace rack | } // namespace rack |