computerscare-vcv-modules

computerscare modules for VCV Rack
Log | Files | Refs

commit 2d468aa46d30b953979273d37851c91d64d7b50f
parent 43eb539238004238c75b77bbc246821a4abc6699
Author: Adam M <aemalone@gmail.com>
Date:   Wed, 17 Feb 2021 20:05:02 -0600

Tooltips showing useful horse info

Diffstat:
Msrc/Computerscare.hpp | 9+++++++++
Msrc/ComputerscareHorseADoodleDoo.cpp | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
2 files changed, 69 insertions(+), 8 deletions(-)

diff --git a/src/Computerscare.hpp b/src/Computerscare.hpp @@ -382,12 +382,21 @@ struct SmallKnob : RoundKnob { setSvg(APP->window->loadSvg(asset::plugin(pluginInstance, "res/computerscare-small-knob-effed.svg"))); } }; + struct ScrambleKnob : RoundKnob { ScrambleKnob() { shadow->opacity = 0.f; setSvg(APP->window->loadSvg(asset::plugin(pluginInstance, "res/computerscare-scramble-knob.svg"))); } }; +struct ScrambleKnobNoRandom : RoundKnob { + ScrambleKnobNoRandom() { + shadow->opacity = 0.f; + setSvg(APP->window->loadSvg(asset::plugin(pluginInstance, "res/computerscare-scramble-knob.svg"))); + } + void randomize() override { return; } +}; + struct ScrambleSnapKnob : RoundKnob { ScrambleSnapKnob() { snap = true; diff --git a/src/ComputerscareHorseADoodleDoo.cpp b/src/ComputerscareHorseADoodleDoo.cpp @@ -214,7 +214,15 @@ struct ComputerscareHorseADoodleDoo : ComputerscarePolyModule { HorseSequencer seq[16]; - + struct HorsePatternParamQ: ParamQuantity { + virtual std::string getString() { + return dynamic_cast<ComputerscareHorseADoodleDoo*>(module)->getPatternDisplay(); + } + std::string getDisplayValueString() override { + float val = getValue(); + return std::to_string(val) + "\n" + getString(); + } + }; struct HorseStepsSpreadParam: ParamQuantity { std::string newLineSepIntVector(std::vector<int> vec) { @@ -243,11 +251,20 @@ struct ComputerscareHorseADoodleDoo : ComputerscarePolyModule { } }; + struct HorseResetParamQ: ParamQuantity { + virtual std::string getResetTransportDisplay() { + return dynamic_cast<ComputerscareHorseADoodleDoo*>(module)->getResetTransportDisplay(); + } + std::string getDisplayValueString() override { + return "\n" + getResetTransportDisplay(); + } + }; + ComputerscareHorseADoodleDoo() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); - configParam(PATTERN_KNOB, 0.f, 10.f, 0.f, "Pattern"); + configParam<HorsePatternParamQ>(PATTERN_KNOB, 0.f, 10.f, 0.f, "Pattern"); configParam(STEPS_KNOB, 2.f, 64.f, 8.f, "Number of Steps"); configParam(DENSITY_KNOB, 0.f, 1.f, 0.5f, "Density", "%", 0, 100); @@ -264,8 +281,8 @@ struct ComputerscareHorseADoodleDoo : ComputerscarePolyModule { configParam<HorseModeParam>(MODE_KNOB, 0.f, 3.f, 0.f, "Mode"); - configParam(MANUAL_RESET_BUTTON, 0.f, 1.f, 0.f); - configParam(MANUAL_CLOCK_BUTTON, 0.f, 1.f, 0.f); + configParam<HorseResetParamQ>(MANUAL_RESET_BUTTON, 0.f, 1.f, 0.f, "Reset all Sequences"); + configParam(MANUAL_CLOCK_BUTTON, 0.f, 1.f, 0.f, "Advance all Sequences"); @@ -316,6 +333,35 @@ struct ComputerscareHorseADoodleDoo : ComputerscarePolyModule { } return out; } + std::string getResetTransportDisplay(std::string sep = "\n") { + std::string out = ""; + for (int i = 0; i < polyChannels; i++) { + + out += "ch " + string::f("%*d", 2, i + 1) + ": "; + out = out + string::f("%*d", 4, seq[i].currentStep + 1); + out = out + " / " + string::f("%*d", 4, seq[i].numSteps); + + out += sep; + } + return out; + } + std::string getPatternDisplay(std::string sep = "\n") { + std::string out = ""; + for (int i = 0; i < polyChannels; i++) { + + out += "ch " + string::f("%*d", 2, i + 1) + ": "; + int current = seq[i].currentStep; + for (int j = 0; j < seq[i].pendingNumSteps; j++) { + + bool highStep = seq[i].absoluteSequence[j] == 1; + + out += (current == j) ? (highStep ? "☺" : "☹") : ( highStep ? "x" : "_"); + } + + out += sep; + } + return out; + } void setMode(int newMode) { params[MODE_KNOB].setValue(newMode); @@ -676,8 +722,8 @@ struct ComputerscareHorseADoodleDooWidget : ModuleWidget { } addInputBlock("Pattern", 10, 100, module, 0, ComputerscareHorseADoodleDoo::PATTERN_CV, 0, ComputerscareHorseADoodleDoo::PATTERN_SPREAD); - addInputBlock("Length", 10, 150, module, 2, ComputerscareHorseADoodleDoo::STEPS_CV, 1, ComputerscareHorseADoodleDoo::STEPS_SPREAD); - addInputBlock("Density", 10, 200, module, 4, ComputerscareHorseADoodleDoo::DENSITY_CV, 0, ComputerscareHorseADoodleDoo::DENSITY_SPREAD); + addInputBlock("Length", 10, 150, module, 2, ComputerscareHorseADoodleDoo::STEPS_CV, 1, ComputerscareHorseADoodleDoo::STEPS_SPREAD, false); + addInputBlock("Density", 10, 200, module, 4, ComputerscareHorseADoodleDoo::DENSITY_CV, 0, ComputerscareHorseADoodleDoo::DENSITY_SPREAD, false); addParam(createParam<ScrambleSnapKnobNoRandom>(Vec(4, 234), module, ComputerscareHorseADoodleDoo::MODE_KNOB)); /*for (int i = 0; i < 1; i++) { @@ -710,7 +756,7 @@ struct ComputerscareHorseADoodleDooWidget : ModuleWidget { } - void addInputBlock(std::string label, int x, int y, ComputerscareHorseADoodleDoo *module, int knobIndex, int inputIndex, int knobType, int scrambleIndex) { + void addInputBlock(std::string label, int x, int y, ComputerscareHorseADoodleDoo *module, int knobIndex, int inputIndex, int knobType, int scrambleIndex, bool allowScrambleRandom = true) { smallLetterDisplay = new SmallLetterDisplay(); smallLetterDisplay->box.size = Vec(5, 10); @@ -748,7 +794,13 @@ struct ComputerscareHorseADoodleDooWidget : ModuleWidget { } addParam(createParam<SmallKnob>(Vec(x + 32, y + 5), module, knobIndex + 1)); addInput(createInput<TinyJack>(Vec(x + 54, y + 6), module, inputIndex)); - addParam(createParam<ScrambleKnob>(Vec(x + 55, y - 15), module, scrambleIndex)); + if (allowScrambleRandom) { + addParam(createParam<ScrambleKnob>(Vec(x + 55, y - 15), module, scrambleIndex)); + } + else { + addParam(createParam<ScrambleKnobNoRandom>(Vec(x + 55, y - 15), module, scrambleIndex)); + } + } void appendContextMenu(Menu* menu) override {