| @@ -199,6 +199,8 @@ struct ParamWidget : OpaqueWidget, QuantityWidget { | |||||
| struct Knob : ParamWidget { | struct Knob : ParamWidget { | ||||
| /** Snap to nearest integer while dragging */ | /** Snap to nearest integer while dragging */ | ||||
| bool snap = false; | bool snap = false; | ||||
| /** Multiplier for mouse movement to adjust knob value */ | |||||
| float speed = 1.0; | |||||
| float dragValue; | float dragValue; | ||||
| void onDragStart(EventDragStart &e) override; | void onDragStart(EventDragStart &e) override; | ||||
| void onDragMove(EventDragMove &e) override; | void onDragMove(EventDragMove &e) override; | ||||
| @@ -249,7 +251,6 @@ struct SVGSwitch : virtual Switch, FramebufferWidget { | |||||
| SVGSwitch(); | SVGSwitch(); | ||||
| /** Adds an SVG file to represent the next switch position */ | /** Adds an SVG file to represent the next switch position */ | ||||
| void addFrame(std::shared_ptr<SVG> svg); | void addFrame(std::shared_ptr<SVG> svg); | ||||
| void step() override; | |||||
| void onChange(EventChange &e) override; | void onChange(EventChange &e) override; | ||||
| }; | }; | ||||
| @@ -2,6 +2,7 @@ | |||||
| #include <assert.h> | #include <assert.h> | ||||
| #include <samplerate.h> | #include <samplerate.h> | ||||
| #include <string.h> | |||||
| #include "frame.hpp" | #include "frame.hpp" | ||||
| @@ -33,6 +34,15 @@ struct SampleRateConverter { | |||||
| } | } | ||||
| /** `in` and `out` are interlaced with the number of channels */ | /** `in` and `out` are interlaced with the number of channels */ | ||||
| void process(const Frame<CHANNELS> *in, int *inFrames, Frame<CHANNELS> *out, int *outFrames) { | void process(const Frame<CHANNELS> *in, int *inFrames, Frame<CHANNELS> *out, int *outFrames) { | ||||
| /* | |||||
| if (nearf(data.src_ratio, 1.0)) { | |||||
| int len = mini(*inFrames, *outFrames); | |||||
| memcpy(out, in, len * sizeof(Frame<CHANNELS>)); | |||||
| *inFrames = len; | |||||
| *outFrames = len; | |||||
| return; | |||||
| } | |||||
| */ | |||||
| // Old versions of libsamplerate use float* here instead of const float* | // Old versions of libsamplerate use float* here instead of const float* | ||||
| data.data_in = (float*) in; | data.data_in = (float*) in; | ||||
| data.input_frames = *inFrames; | data.input_frames = *inFrames; | ||||
| @@ -16,7 +16,7 @@ struct Light { | |||||
| float value = 0.0; | float value = 0.0; | ||||
| float getBrightness(); | float getBrightness(); | ||||
| void setBrightness(float brightness) { | void setBrightness(float brightness) { | ||||
| value = brightness * brightness; | |||||
| value = (brightness > 0.f) ? brightness * brightness : 0.f; | |||||
| } | } | ||||
| void setBrightnessSmooth(float brightness); | void setBrightnessSmooth(float brightness); | ||||
| }; | }; | ||||
| @@ -18,7 +18,7 @@ void Knob::onDragStart(EventDragStart &e) { | |||||
| void Knob::onDragMove(EventDragMove &e) { | void Knob::onDragMove(EventDragMove &e) { | ||||
| // Drag slower if Mod | // Drag slower if Mod | ||||
| float delta = KNOB_SENSITIVITY * (maxValue - minValue) * -e.mouseRel.y; | |||||
| float delta = KNOB_SENSITIVITY * (maxValue - minValue) * -e.mouseRel.y * speed; | |||||
| if (guiIsModPressed()) | if (guiIsModPressed()) | ||||
| delta /= 16.0; | delta /= 16.0; | ||||
| dragValue += delta; | dragValue += delta; | ||||
| @@ -46,6 +46,15 @@ void RackRail::draw(NVGcontext *vg) { | |||||
| nvgLineTo(vg, box.size.x, railY + RACK_GRID_HEIGHT - 0.5); | nvgLineTo(vg, box.size.x, railY + RACK_GRID_HEIGHT - 0.5); | ||||
| nvgStroke(vg); | nvgStroke(vg); | ||||
| } | } | ||||
| // Useful for screenshots | |||||
| if (0) { | |||||
| nvgBeginPath(vg); | |||||
| nvgRect(vg, 0.0, 0.0, box.size.x, box.size.y); | |||||
| nvgFillColor(vg, nvgRGBf(1.0, 1.0, 1.0)); | |||||
| nvgFill(vg); | |||||
| } | |||||
| } | } | ||||
| @@ -38,6 +38,25 @@ void RackWidget::clear() { | |||||
| wireContainer->clearChildren(); | wireContainer->clearChildren(); | ||||
| moduleContainer->clearChildren(); | moduleContainer->clearChildren(); | ||||
| lastPath = ""; | lastPath = ""; | ||||
| /* | |||||
| // Add all modules to rack | |||||
| Vec pos; | |||||
| for (Plugin *plugin : gPlugins) { | |||||
| for (Model *model : plugin->models) { | |||||
| ModuleWidget *moduleWidget = model->createModuleWidget(); | |||||
| moduleContainer->addChild(moduleWidget); | |||||
| // Move module nearest to the mouse position | |||||
| Rect box; | |||||
| box.size = moduleWidget->box.size; | |||||
| box.pos = pos; | |||||
| requestModuleBoxNearest(moduleWidget, box); | |||||
| pos.x += box.size.x; | |||||
| } | |||||
| pos.y += RACK_GRID_HEIGHT; | |||||
| pos.x = 0; | |||||
| } | |||||
| */ | |||||
| } | } | ||||
| void RackWidget::reset() { | void RackWidget::reset() { | ||||
| @@ -127,8 +146,10 @@ json_t *RackWidget::toJson() { | |||||
| json_t *rootJ = json_object(); | json_t *rootJ = json_object(); | ||||
| // version | // version | ||||
| json_t *versionJ = json_string(gApplicationVersion.c_str()); | |||||
| json_object_set_new(rootJ, "version", versionJ); | |||||
| if (!gApplicationVersion.empty()) { | |||||
| json_t *versionJ = json_string(gApplicationVersion.c_str()); | |||||
| json_object_set_new(rootJ, "version", versionJ); | |||||
| } | |||||
| // modules | // modules | ||||
| json_t *modulesJ = json_array(); | json_t *modulesJ = json_array(); | ||||
| @@ -323,8 +344,8 @@ bool RackWidget::requestModuleBoxNearest(ModuleWidget *m, Rect box) { | |||||
| int x0 = roundf(box.pos.x / RACK_GRID_WIDTH); | int x0 = roundf(box.pos.x / RACK_GRID_WIDTH); | ||||
| int y0 = roundf(box.pos.y / RACK_GRID_HEIGHT); | int y0 = roundf(box.pos.y / RACK_GRID_HEIGHT); | ||||
| std::vector<Vec> positions; | std::vector<Vec> positions; | ||||
| for (int y = maxi(0, y0 - 4); y < y0 + 4; y++) { | |||||
| for (int x = maxi(0, x0 - 200); x < x0 + 200; x++) { | |||||
| for (int y = maxi(0, y0 - 8); y < y0 + 8; y++) { | |||||
| for (int x = maxi(0, x0 - 400); x < x0 + 400; x++) { | |||||
| positions.push_back(Vec(x * RACK_GRID_WIDTH, y * RACK_GRID_HEIGHT)); | positions.push_back(Vec(x * RACK_GRID_WIDTH, y * RACK_GRID_HEIGHT)); | ||||
| } | } | ||||
| } | } | ||||
| @@ -18,10 +18,6 @@ void SVGSwitch::addFrame(std::shared_ptr<SVG> svg) { | |||||
| } | } | ||||
| } | } | ||||
| void SVGSwitch::step() { | |||||
| FramebufferWidget::step(); | |||||
| } | |||||
| void SVGSwitch::onChange(EventChange &e) { | void SVGSwitch::onChange(EventChange &e) { | ||||
| assert(frames.size() > 0); | assert(frames.size() > 0); | ||||
| float valueScaled = rescalef(value, minValue, maxValue, 0, frames.size() - 1); | float valueScaled = rescalef(value, minValue, maxValue, 0, frames.size() - 1); | ||||