aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2017-12-01 00:24:32 +0000
committers-ol <s-ol@users.noreply.github.com>2017-12-01 00:24:32 +0000
commit617af54c62f31a1238729e25f18cfc455944d005 (patch)
treef7374dad0001dfe5ed0dd53e696045c79b96f0a4 /src
downloadvcvmods-617af54c62f31a1238729e25f18cfc455944d005.tar.gz
vcvmods-617af54c62f31a1238729e25f18cfc455944d005.zip
initial commit
Diffstat (limited to 'src')
-rw-r--r--src/CircleVCO.cpp71
-rw-r--r--src/Modulo.cpp56
-rw-r--r--src/WrapComp.cpp81
-rw-r--r--src/s-ol.cpp18
-rw-r--r--src/s-ol.hpp23
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();
+};