diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2017-12-01 00:24:32 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2017-12-01 00:24:32 +0000 |
| commit | 617af54c62f31a1238729e25f18cfc455944d005 (patch) | |
| tree | f7374dad0001dfe5ed0dd53e696045c79b96f0a4 /src | |
| download | vcvmods-617af54c62f31a1238729e25f18cfc455944d005.tar.gz vcvmods-617af54c62f31a1238729e25f18cfc455944d005.zip | |
initial commit
Diffstat (limited to 'src')
| -rw-r--r-- | src/CircleVCO.cpp | 71 | ||||
| -rw-r--r-- | src/Modulo.cpp | 56 | ||||
| -rw-r--r-- | src/WrapComp.cpp | 81 | ||||
| -rw-r--r-- | src/s-ol.cpp | 18 | ||||
| -rw-r--r-- | src/s-ol.hpp | 23 |
5 files changed, 249 insertions, 0 deletions
diff --git a/src/CircleVCO.cpp b/src/CircleVCO.cpp new file mode 100644 index 0000000..849d1e4 --- /dev/null +++ b/src/CircleVCO.cpp @@ -0,0 +1,71 @@ +#include "s-ol.hpp" + +struct CircleVCO : Module { + enum ParamIds { + PITCH_PARAM, + NUM_PARAMS + }; + enum InputIds { + PITCH_INPUT, + NUM_INPUTS + }; + enum OutputIds { + SIN_OUTPUT, + COS_OUTPUT, + PHS_OUTPUT, + NUM_OUTPUTS + }; + enum LightIds { + NUM_LIGHTS + }; + + float phase = 0.0; + + CircleVCO() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} + void step() override; +}; + + +void CircleVCO::step() { + float deltaTime = 1.0 / engineGetSampleRate(); + + float pitch = params[PITCH_PARAM].value; + pitch += inputs[PITCH_INPUT].value; + pitch = clampf(pitch, -4.0, 4.0); + float freq = 200 * (powf(2.0, pitch) - powf(2.0, -4.0)); + + phase += freq * deltaTime; + while (phase >= 1.0) + phase -= 1.0; + + float sine = sinf(2 * M_PI * phase); + float cosn = cosf(2 * M_PI * phase); + outputs[SIN_OUTPUT].value = sine * 5; + outputs[COS_OUTPUT].value = cosn * 5; + outputs[PHS_OUTPUT].value = phase * 5; +} + + +CircleVCOWidget::CircleVCOWidget() { + CircleVCO *module = new CircleVCO(); + setModule(module); + setPanel(SVG::load(assetPlugin(plugin, "res/CircleVCO.svg"))); + + addChild(createScrew<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); + addChild(createScrew<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); + addChild(createScrew<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); + addChild(createScrew<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); + + PJ301MPort p; + Davies1900hBlackKnob k; + Vec center = Vec(box.size.x, 0).minus(p.box.size).div(2); + Vec kcenter = Vec(box.size.x, 0).minus(k.box.size).div(2); + + addParam(createParam<Davies1900hBlackKnob>(kcenter.plus(Vec(0, 90)), module, CircleVCO::PITCH_PARAM, 0.0, 1.0, 0.0)); + + addInput(createInput<PJ301MPort>(center.plus(Vec(0, 180)), module, CircleVCO::PITCH_INPUT)); + + addOutput(createOutput<PJ301MPort>(center.plus(Vec(-18, 250)), module, CircleVCO::SIN_OUTPUT)); + addOutput(createOutput<PJ301MPort>(center.plus(Vec( 18, 250)), module, CircleVCO::COS_OUTPUT)); + addOutput(createOutput<PJ301MPort>(center.plus(Vec(0, 315)), module, CircleVCO::PHS_OUTPUT)); +} diff --git a/src/Modulo.cpp b/src/Modulo.cpp new file mode 100644 index 0000000..8b2cb6a --- /dev/null +++ b/src/Modulo.cpp @@ -0,0 +1,56 @@ +#include "s-ol.hpp" + +struct Modulo : Module { + enum ParamIds { + GAIN_PARAM, + NUM_PARAMS + }; + enum InputIds { + SIGNAL_INPUT, + NUM_INPUTS + }; + enum OutputIds { + STAIR_OUTPUT, + WRAP_OUTPUT, + NUM_OUTPUTS + }; + enum LightIds { + NUM_LIGHTS + }; + + Modulo() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} + void step() override; +}; + + +void Modulo::step() { + float gain = powf(2.0, params[GAIN_PARAM].value); + float val = inputs[SIGNAL_INPUT].value * gain; + float stair = floorf(val); + float wrap = val - stair; + + outputs[STAIR_OUTPUT].value = stair / gain;; + outputs[WRAP_OUTPUT].value = wrap * 5; +} + + +ModuloWidget::ModuloWidget() { + Modulo *module = new Modulo(); + setModule(module); + setPanel(SVG::load(assetPlugin(plugin, "res/Modulo.svg"))); + + addChild(createScrew<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); + addChild(createScrew<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); + + PJ301MPort p; + Davies1900hBlackKnob k; + Vec center = Vec(box.size.x, 0).minus(p.box.size).div(2); + Vec kcenter = Vec(box.size.x, 0).minus(k.box.size).div(2); + + addParam(createParam<Davies1900hBlackKnob>(kcenter.plus(Vec(0, 90)), module, Modulo::GAIN_PARAM, -3.0, 3.0, 0.0)); + + addInput(createInput<PJ301MPort>(center.plus(Vec(0, 145)), module, Modulo::SIGNAL_INPUT)); + + addOutput(createOutput<PJ301MPort>(center.plus(Vec(0, 275)), module, Modulo::STAIR_OUTPUT)); + addOutput(createOutput<PJ301MPort>(center.plus(Vec(0, 347)), module, Modulo::WRAP_OUTPUT)); +} diff --git a/src/WrapComp.cpp b/src/WrapComp.cpp new file mode 100644 index 0000000..f8240eb --- /dev/null +++ b/src/WrapComp.cpp @@ -0,0 +1,81 @@ +#include "s-ol.hpp" + +struct WrapComp : Module { + enum ParamIds { + A_OUT_PARAM, + B_OUT_PARAM, + OFFSET_PARAM, + RANGE_PARAM, + NUM_PARAMS + }; + enum InputIds { + SIGNAL_INPUT, + OFFSET_INPUT, + RANGE_INPUT, + NUM_INPUTS + }; + enum OutputIds { + MAIN_OUTPUT, + NUM_OUTPUTS + }; + enum LightIds { + A_LIGHT, + B_LIGHT, + NUM_LIGHTS + }; + + WrapComp() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} + void step() override; +}; + + +void WrapComp::step() { + float input = inputs[SIGNAL_INPUT].value + inputs[OFFSET_INPUT].normalize(0.0) + params[OFFSET_PARAM].value; + float width = clampf((inputs[RANGE_INPUT].normalize(0.0) + params[RANGE_PARAM].value) / 2.0, 0.0, 5.0); + + while (input > 5.0) + input -= 5.0; + while (input < 0.0) + input += 5.0; + + bool a = input < width || input > (5.0 - width); + + outputs[MAIN_OUTPUT].value = a ? params[A_OUT_PARAM].value : params[B_OUT_PARAM].value; + lights[A_LIGHT].value = a ? 1.0 : 0.0; + lights[B_LIGHT].value = a ? 0.0 : 1.0; +} + + +WrapCompWidget::WrapCompWidget() { + WrapComp *module = new WrapComp(); + setModule(module); + setPanel(SVG::load(assetPlugin(plugin, "res/WrapComp.svg"))); + + addChild(createScrew<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); + addChild(createScrew<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); + addChild(createScrew<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); + addChild(createScrew<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); + + PJ301MPort p; + Davies1900hBlackKnob k; + MediumLight<RedLight> l; + Vec center = Vec(box.size.x, 0).minus(p.box.size).div(2); + Vec kcenter = Vec(box.size.x, 0).minus(k.box.size).div(2); + Vec lcenter = Vec(box.size.x, 0).minus(l.box.size).div(2); + + addInput(createInput<PJ301MPort>(center.plus(Vec(0, 70)), module, WrapComp::SIGNAL_INPUT)); + + addParam(createParam<Davies1900hBlackKnob>(kcenter.plus(Vec(25, 135)), module, WrapComp::OFFSET_PARAM, -5.0, 5.0, 0.0)); + addInput(createInput<PJ301MPort>(center.plus(Vec(-25, 135)), module, WrapComp::OFFSET_INPUT)); + + addParam(createParam<Davies1900hBlackKnob>(kcenter.plus(Vec(25, 210)), module, WrapComp::RANGE_PARAM, -5.0, 5.0, 0.0)); + addInput(createInput<PJ301MPort>(center.plus(Vec(-25, 210)), module, WrapComp::RANGE_INPUT)); + + addChild(createLight<MediumLight<RedLight>>(lcenter.plus(Vec(-15, 255)), module, WrapComp::A_LIGHT)); + addChild(createLight<MediumLight<RedLight>>(lcenter.plus(Vec( 15, 255)), module, WrapComp::B_LIGHT)); + + addParam(createParam<Davies1900hBlackKnob>(kcenter.plus(Vec(-25, 280)), module, WrapComp::A_OUT_PARAM, -8.0, 8.0, 1.0)); + addParam(createParam<Davies1900hBlackKnob>(kcenter.plus(Vec( 25, 280)), module, WrapComp::B_OUT_PARAM, -8.0, 8.0, 0.0)); + + addOutput(createOutput<PJ301MPort>(center.plus(Vec(0, 315)), module, WrapComp::MAIN_OUTPUT)); +} diff --git a/src/s-ol.cpp b/src/s-ol.cpp new file mode 100644 index 0000000..3fd0f1e --- /dev/null +++ b/src/s-ol.cpp @@ -0,0 +1,18 @@ +#include "s-ol.hpp" + +Plugin *plugin; + +void init(rack::Plugin *p) { + plugin = p; + + p->slug = "s-ol"; +#ifdef VERSION + p->version = TOSTRING(VERSION); +#endif + p->website = "https://github.com/s-ol/vcvmods"; + p->manual = "https://github.com/s-ol/vcvmods"; + + p->addModel(createModel<CircleVCOWidget>("s-ol", "CircleVCO", "Circle VCO", OSCILLATOR_TAG, VISUAL_TAG)); + p->addModel(createModel<WrapCompWidget>("s-ol", "WrapComp", "Wrapping Comparator", LOGIC_TAG)); + p->addModel(createModel<ModuloWidget>("s-ol", "Modulo", "Modulo", LOGIC_TAG)); +} diff --git a/src/s-ol.hpp b/src/s-ol.hpp new file mode 100644 index 0000000..ceb4880 --- /dev/null +++ b/src/s-ol.hpp @@ -0,0 +1,23 @@ +#include "rack.hpp" + + +using namespace rack; + + +extern Plugin *plugin; + +//////////////////// +// module widgets +//////////////////// + +struct CircleVCOWidget : ModuleWidget { + CircleVCOWidget(); +}; + +struct WrapCompWidget : ModuleWidget { + WrapCompWidget(); +}; + +struct ModuloWidget : ModuleWidget { + ModuloWidget(); +}; |
