computerscare-vcv-modules

computerscare modules for VCV Rack
Log | Files | Refs

commit 05cc6f471faf715b378ab3e996bcd7320c25fc50
parent 784f868e2b5835164be0f2f8cf3e8353dc2a011d
Author: Adam M <aemalone@gmail.com>
Date:   Mon, 11 May 2020 23:49:02 -0500

Penerator displai boi

Diffstat:
Msrc/ComputerscareDrolyPaw.cpp | 77++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/ComputerscareGolyPenerator.cpp | 45+++++++++++++++++++++++++++++++++++++++++++++
Msrc/ComputerscareHorseADoodleDoo.cpp | 30++++++++++++++++++++++++------
Msrc/ComputerscareResizableHandle.hpp | 7++++++-
Msrc/drawFunctions.hpp | 2+-
5 files changed, 114 insertions(+), 47 deletions(-)

diff --git a/src/ComputerscareDrolyPaw.cpp b/src/ComputerscareDrolyPaw.cpp @@ -51,7 +51,7 @@ struct DrolyPaw : Module { int cnt = 0; int interiorCounter = 9000; bool clearArmed = false; - bool drawArmed=false; + bool drawArmed = false; float lastScramble = 0; rack::dsp::SchmittTrigger globalManualClockTrigger; @@ -131,9 +131,9 @@ struct DrolyPaw : Module { int frameCount = (int) std::ceil(deltaTime * args.sampleRate); bool clearGateHigh = inputs[CLEAR_GATE].isConnected() && inputs[CLEAR_GATE].getVoltage() >= 1.f; - bool drawGateHigh = inputs[DRAW_GATE].isConnected() && inputs[DRAW_GATE].getVoltage()>=1.f; + bool drawGateHigh = inputs[DRAW_GATE].isConnected() && inputs[DRAW_GATE].getVoltage() >= 1.f; - if(inputs[CLEAR_GATE].isConnected()) { + if (inputs[CLEAR_GATE].isConnected()) { if (inputs[CLEAR_GATE].getVoltage() >= 1.f || globalManualResetTrigger.process(params[CLEAR_BUTTON].getValue()) ) { armClear(); } @@ -143,17 +143,17 @@ struct DrolyPaw : Module { armClear(); } } - if(inputs[DRAW_GATE].isConnected()) { - if(inputs[DRAW_GATE].getVoltage() >= 1.f) { - drawArmed=true; + if (inputs[DRAW_GATE].isConnected()) { + if (inputs[DRAW_GATE].getVoltage() >= 1.f) { + drawArmed = true; } } else { - if(params[DRAW_EVERY_FRAME].getValue() || drawTrigger.process(inputs[DRAW_TRIGGER].getVoltage())) { - drawArmed=true; + if (params[DRAW_EVERY_FRAME].getValue() || drawTrigger.process(inputs[DRAW_TRIGGER].getVoltage())) { + drawArmed = true; } } - + // Set channels @@ -195,7 +195,7 @@ struct DrolyPaw : Module { } else { for (int c = 0; c < 16; c++) { - bufferX[c][bufferIndex] = trimVal*5*sin((float)interiorCounter / 100000 * (c + 1)) + offsetVal; // t is an integer type + bufferX[c][bufferIndex] = trimVal * 5 * sin((float)interiorCounter / 100000 * (c + 1)) + offsetVal; // t is an integer type //bufferX[c][bufferIndex] = offsetVal + 99 + (1071 * cmap[c]) % 19; @@ -294,25 +294,25 @@ struct NoClearWidget : FramebufferWidget { struct DrolyPawDisplay : FramebufferWidget { DrolyPaw *module; - float containerWidth=195; + float containerWidth = 195; void step() override { dirty = true; - - if(module) { + + if (module) { containerWidth = module->params[DrolyPaw::MODULE_WIDTH].getValue(); } box.size.x = containerWidth; FramebufferWidget::step(); - + } /*DrolyPawDisplay() { FramebufferWidget(); }*/ - void drawThingie(const DrawArgs &args, float buffer[16][BUFFER_SIZE], float paramsBuffer[16][BUFFER_SIZE], int mode, float width,float height=380) { + void drawThingie(const DrawArgs &args, float buffer[16][BUFFER_SIZE], float paramsBuffer[16][BUFFER_SIZE], int mode, float width, float height = 380) { DrawHelper draw = DrawHelper(args.vg); Points pts = Points(); - nvgTranslate(args.vg, width/2, 190); + nvgTranslate(args.vg, width / 2, 190); if (mode == 0) { for (int i = 0; i < 4; i++) { @@ -322,11 +322,10 @@ struct DrolyPawDisplay : FramebufferWidget { } } else if (mode == 1) { - float scale=width/2/(1+expf(-paramsBuffer[0][0])); + float scale = width * expf(paramsBuffer[0][0] / 3) / 20; pts.spray(100); pts.scale(Vec(scale, scale)); - draw.drawField(pts.get(), draw.sincolor(buffer[3][0] + buffer[4][0]*random::uniform()), paramsBuffer[1][0]); - //draw.drawDots(pts.get(), draw.sincolor(random::uniform()), 2.f); + draw.drawField(pts.get(), draw.sincolor(paramsBuffer[2][0] + paramsBuffer[3][0]*random::uniform(), {paramsBuffer[4][0], paramsBuffer[5][0], paramsBuffer[6][0]}, {paramsBuffer[7][0], paramsBuffer[8][0], paramsBuffer[9][0]}), expf(paramsBuffer[1][0] / 2)); } else if (mode == 2) { //16 horizontal lines @@ -339,7 +338,7 @@ struct DrolyPawDisplay : FramebufferWidget { std::vector<Vec> thicknesses; for (int i = 0; i < 16; i++) { - polyVals.push_back(Vec(buffer[i][0] * width/4, 0.f)); + polyVals.push_back(Vec(buffer[i][0] * width / 4, 0.f)); colors.push_back(draw.sincolor(paramsBuffer[0][0] + 2 + paramsBuffer[2][0]*i)); thicknesses.push_back(Vec(expf(paramsBuffer[1][0] * 2 + 2) + 0.5, 0)); @@ -351,7 +350,7 @@ struct DrolyPawDisplay : FramebufferWidget { //number,-dTHickness,dAngle,dColor (passed to sincolor) draw.drawLines(fmin(65, std::floor(exp(40 * buffer[0][1]) + 2)), buffer[1][0], buffer[2][0] / 4, buffer[3][0] * 2); } - else if(mode==4) { + else if (mode == 4) { int nx = (mode * 17) % 10; int ny = (mode * 11 + 3) % 10; pts.grid(nx, ny, Vec(buffer[2][0] * 10, buffer[1][0] * 10)); @@ -366,15 +365,15 @@ struct DrolyPawDisplay : FramebufferWidget { void drawThingie(const DrawArgs &args) { float bx[16][BUFFER_SIZE]; float by[16][BUFFER_SIZE]; - for(int i = 0; i<BUFFER_SIZE; i++) { - for(int j = 0; j < 16; j++) { - bx[j][i]=random::uniform()*10; - by[j][i]=random::uniform()*10; + for (int i = 0; i < BUFFER_SIZE; i++) { + for (int j = 0; j < 16; j++) { + bx[j][i] = random::normal() * 2; + by[j][i] = random::uniform() * 1; } } int mode = 2; - int width=195; - drawThingie(args,bx,by,mode,width); + int width = 195; + drawThingie(args, bx, by, mode, width); } void drawFramebuffer() override { @@ -400,8 +399,8 @@ struct DrolyPawDisplay : FramebufferWidget { if (module->drawArmed) { float myWidth = module->params[DrolyPaw::MODULE_WIDTH].getValue(); int mode = module->params[DrolyPaw::DRAW_MODE].getValue(); - drawThingie(args, module->bufferX, module->bufferY,mode,myWidth); - module->drawArmed=false; + drawThingie(args, module->bufferX, module->bufferY, mode, myWidth); + module->drawArmed = false; } } @@ -486,8 +485,8 @@ struct DrolyPawWidget : ModuleWidget { ComputerscareResizeHandle *rightHandle = new ComputerscareResizeHandle(); rightHandle->right = true; - leftHandle->box.size.y=RACK_GRID_HEIGHT*0.9; - + leftHandle->box.size.y = RACK_GRID_HEIGHT * 0.9; + this->rightHandle = rightHandle; addChild(leftHandle); addChild(rightHandle); @@ -496,13 +495,13 @@ struct DrolyPawWidget : ModuleWidget { } void draw(const DrawArgs &args) override { - if(!module) { + ModuleWidget::draw(args); + if (!module) { display->drawThingie(args); } else { } - ModuleWidget::draw(args); } void step() override { @@ -516,21 +515,21 @@ struct DrolyPawWidget : ModuleWidget { drolyPawModule->manualSetWidth=false; }*/ //else { - DEBUG("%f",width); - bgPanel->box.size.x=box.size.x; - module->params[DrolyPaw::MODULE_WIDTH].setValue(box.size.x); + DEBUG("%f", width); + bgPanel->box.size.x = box.size.x; + module->params[DrolyPaw::MODULE_WIDTH].setValue(box.size.x); //} } rightHandle->box.pos.x = box.size.x - rightHandle->box.size.x; - + ModuleWidget::step(); } }; void resizeEverything() { float width = drolyPawModule->params[DrolyPaw::MODULE_WIDTH].getValue(); - box.size.x=width; - bgPanel->box.size.x=width; + box.size.x = width; + bgPanel->box.size.x = width; } void fromJson(json_t* rootJ) override { diff --git a/src/ComputerscareGolyPenerator.cpp b/src/ComputerscareGolyPenerator.cpp @@ -82,7 +82,44 @@ struct ComputerscareGolyPenerator : ComputerscarePolyModule { } }; +struct PeneratorDisplay : TransparentWidget { + ComputerscareGolyPenerator *module; + PeneratorDisplay() { + + } + void draw(const DrawArgs &args) override { + float valsToDraw[16] = {1.f}; + int ch = 16; + if (module) { + ch = module->polyChannels; + for (int i = 0; i < ch; i++) { + valsToDraw[i] = module->goly.currentValues[i]; + } + } + else { + for (int i = 0; i < ch; i++) { + valsToDraw[i] = random::uniform() * 10; + } + } + DrawHelper draw = DrawHelper(args.vg); + Points pts = Points(); + + nvgTranslate(args.vg, box.size.x / 2, box.size.y/2); + pts.linear(16, Vec(0, 0), Vec(0, 40)); + std::vector<Vec> polyVals; + std::vector<NVGcolor> colors; + std::vector<Vec> thicknesses; + + for (int i = 0; i < 16; i++) { + polyVals.push_back(Vec(valsToDraw[i] * 2,0.f)); + colors.push_back(draw.sincolor(valsToDraw[i])); + + thicknesses.push_back(Vec(3.f, 0)); + } + draw.drawLines(pts.get(), polyVals, colors, thicknesses); + } +}; struct ComputerscareGolyPeneratorWidget : ModuleWidget { ComputerscareGolyPeneratorWidget(ComputerscareGolyPenerator *module) { @@ -99,6 +136,14 @@ struct ComputerscareGolyPeneratorWidget : ModuleWidget { addChild(panel); } + + PeneratorDisplay *display = new PeneratorDisplay(); + display->module = module; + display->box.pos = Vec(0, 30); + display->box.size = Vec(box.size.x, 120); + //display->sizex + addChild(display); + float xx; float yy; // ParamWidget* stepsKnob = createParam<LrgKnob>(Vec(108, 30), module, ComputerscarePatchSequencer::STEPS_PARAM); diff --git a/src/ComputerscareHorseADoodleDoo.cpp b/src/ComputerscareHorseADoodleDoo.cpp @@ -92,8 +92,8 @@ struct HorseSequencer { pendingDensity = density; } void change(float patt, int steps, float dens) { - numSteps = steps; - density = dens; + numSteps = std::max(1,steps); + density = std::fmax(0,dens); pattern = patt; currentStep = 0; makeAbsolute(); @@ -140,6 +140,9 @@ struct ComputerscareHorseADoodleDoo : ComputerscarePolyModule { POLY_KNOB, MODE_KNOB, MANUAL_RESET_BUTTON, + PATTERN_SPREAD, + STEPS_SPREAD, + DENSITY_SPREAD, NUM_PARAMS }; @@ -197,6 +200,11 @@ struct ComputerscareHorseADoodleDoo : ComputerscarePolyModule { configParam(STEPS_TRIM, -1.f, 1.f, 0.f, "Steps CV Trim"); configParam(DENSITY_TRIM, -1.f, 1.f, 0.f, "Density CV Trim"); + + configParam(PATTERN_SPREAD, 0.f, 1.f, 0.f, "Pattern Spread","%",0,100); + configParam(STEPS_SPREAD, -1.f, 1.f, 0.f, "Steps Spread","%",0,100); + configParam(DENSITY_SPREAD, -1.f, 1.f, 0.f, "Density Spread","%",0,100); + configParam<AutoParamQuantity>(POLY_KNOB, 0.f, 16.f, 0.f, "Polyphony"); configParam(MODE_KNOB,1.f,16.f,1.f,"Mode"); @@ -223,6 +231,7 @@ struct ComputerscareHorseADoodleDoo : ComputerscarePolyModule { int resetNum = inputs[RESET_INPUT].getChannels(); + int mode = params[MODE_KNOB].getValue(); lastStepsKnob = std::floor(params[STEPS_KNOB].getValue()); lastPolyKnob = std::floor(params[POLY_KNOB].getValue()); @@ -241,6 +250,11 @@ struct ComputerscareHorseADoodleDoo : ComputerscarePolyModule { float patternVal = params[PATTERN_KNOB].getValue() + params[PATTERN_TRIM].getValue() * inputs[PATTERN_CV].getVoltage(fmin(i, pattNum)); int stepsVal = std::floor(params[STEPS_KNOB].getValue() + params[STEPS_TRIM].getValue() * inputs[STEPS_CV].getVoltage(fmin(i, stepsNum))); float densityVal = params[DENSITY_KNOB].getValue() + params[DENSITY_TRIM].getValue() * inputs[DENSITY_CV].getVoltage(fmin(i, densityNum)) / 10; + + patternVal+=i*params[PATTERN_SPREAD].getValue(); + stepsVal+=std::floor(params[STEPS_SPREAD].getValue()*i*i); + densityVal+=params[DENSITY_SPREAD].getValue()*i/10; + seq[i].checkAndArm(patternVal, stepsVal, densityVal); } } @@ -462,9 +476,9 @@ struct ComputerscareHorseADoodleDooWidget : ModuleWidget { } - addInputBlock("Pattern", 0, 100, module, 0, ComputerscareHorseADoodleDoo::PATTERN_CV, 0); - addInputBlock("Length", 0, 150, module, 2, ComputerscareHorseADoodleDoo::STEPS_CV, 1); - addInputBlock("Density", 0, 200, module, 4, ComputerscareHorseADoodleDoo::DENSITY_CV, 0); + addInputBlock("Pattern", 0, 100, module, 0, ComputerscareHorseADoodleDoo::PATTERN_CV, 0,ComputerscareHorseADoodleDoo::PATTERN_SPREAD); + addInputBlock("Length", 0, 150, module, 2, ComputerscareHorseADoodleDoo::STEPS_CV, 1,ComputerscareHorseADoodleDoo::STEPS_SPREAD); + addInputBlock("Density", 0, 200, module, 4, ComputerscareHorseADoodleDoo::DENSITY_CV, 0,ComputerscareHorseADoodleDoo::DENSITY_SPREAD); addParam(createParam<MediumDotSnapKnob>(Vec(30,240), module, ComputerscareHorseADoodleDoo::MODE_KNOB)); @@ -504,7 +518,7 @@ struct ComputerscareHorseADoodleDooWidget : ModuleWidget { } - void addInputBlock(std::string label, int x, int y, ComputerscareHorseADoodleDoo *module, int knobIndex, int inputIndex, int knobType) { + void addInputBlock(std::string label, int x, int y, ComputerscareHorseADoodleDoo *module, int knobIndex, int inputIndex, int knobType,int scrambleIndex) { background = new InputBlockBackground(); background->box.pos = Vec(0, y / 2 - 9); @@ -526,6 +540,8 @@ struct ComputerscareHorseADoodleDooWidget : ModuleWidget { //trim knob addParam(createParam<SmallKnob>(Vec(x + 30, y), module, knobIndex + 1)); addInput(createInput<TinyJack>(Vec(x + 40, y), module, inputIndex)); + addParam(createParam<ScrambleKnob>(Vec(x+30, y+20), module, scrambleIndex)); + } else if (knobType == 1 || knobType == 2) { numStepsKnob = new NumStepsOverKnobDisplay(knobType); @@ -542,6 +558,8 @@ struct ComputerscareHorseADoodleDooWidget : ModuleWidget { //trim knob addParam(createParam<SmallKnob>(Vec(x + 30, y), module, knobIndex + 1)); addInput(createInput<TinyJack>(Vec(x + 40, y), module, inputIndex)); + addParam(createParam<ScrambleKnob>(Vec(x+30, y+20), module, scrambleIndex)); + } } diff --git a/src/ComputerscareResizableHandle.hpp b/src/ComputerscareResizableHandle.hpp @@ -45,7 +45,12 @@ struct ComputerscareResizeHandle : OpaqueWidget { ComputerscareResizeHandle() { box.size = Vec(RACK_GRID_WIDTH * 1, RACK_GRID_HEIGHT); } - + void onEnter(const event::Enter& e) override { + OpaqueWidget::onEnter(e); + } + void onLeave(const event::Leave& e) override { + OpaqueWidget::onLeave(e); + } void onDragStart(const event::DragStart &e) override { if (e.button != GLFW_MOUSE_BUTTON_LEFT) return; diff --git a/src/drawFunctions.hpp b/src/drawFunctions.hpp @@ -152,7 +152,7 @@ struct DrawHelper { nvgStroke(vg); nvgRestore(vg); } - NVGcolor sincolor(float t,std::vector<int> omega={1,2,3},std::vector<float> phi={0.f,5.f,9.f}) { + NVGcolor sincolor(float t,std::vector<float> omega={1,2,3},std::vector<float> phi={0.f,5.f,9.f}) { return nvgRGB(127*(1+sin(t*omega[0]+phi[0])),127*(1+sin(t*omega[1]+phi[1])),127*(1+sin(t*omega[2]+phi[2]))); }