diff --git a/plugins/community/repos/bsp/README.md b/plugins/community/repos/bsp/README.md
index b37bb61d..3e8bb4fe 100644
--- a/plugins/community/repos/bsp/README.md
+++ b/plugins/community/repos/bsp/README.md
@@ -9,12 +9,34 @@ The default scaling factor of input 2 is calibrated to +-24 semitones (e.g. MPE
Inputs 3 and 4 use default scaling factors of 0.5 and 0.25, respectively.
-The switch at the top is used to enabled bipolar scaling (-1..1).
+The right switch at the top is used to enabled bipolar scaling (-1..1).
+
+The left switch enables fine offset scaling (e.g. for precise detuning).
Suggested applications:
- Mix pitch voltages, e.g. base pitch + pitchbend + vibrato.
- Mix filter cutoff voltages, e.g. ADSR + LFO + modwheel
+ - Mix audio signals
+
+
+
+# Bias
+
+Rescales incoming signals.
+
+Values below the "CTR" point are scaled by the "NEG" param, values above the "CTR" point are scaled by the "POS" param.
+
+Suggested application: Filter keyboard tracking.
+
+Example:
+- Connect MIDI-1 CV output to the input
+- Connect the output to a filter's frequency input
+- Adjust center and scale values to taste
+
+NOTE: This can also be used as a simple asymmetric waveshaper for audio signals
+
+NOTE: For use as an amplifier, set "CTR" to -10, then use "POS" to set the amplification (-4..4) (negative values flip the phase)
@@ -53,6 +75,33 @@ An adaption of Filatov Vadim's excellent Ob-Xd filter. Distributed under terms o
+# Rescaler
+
+Clips the input signal to the "IN" min/max range (min=upper knob, max=lower knob), normalizes it, and scales it to the "OUT" min/max range.
+
+If the lower scale input jack is connected, the output value is scaled by the scale input's current value.
+
+Suggest application: Finetune velocity responses.
+
+Example:
+- Connect the MIDI-1 velocity output to the main input
+- Connect the output of an envelope generator to the scale input
+- Connect the module's output to the frequency modulation input of a filter
+- Adjust the min/max knobs to taste
+
+NOTE: This module can also be used as a clipper
+
+
+# RMS
+
+A Root-Mean-Square based envelope follower, coupled with a slew limiter.
+
+The rise and fall rates can be configured separately.
+
+The module can be used to derive envelopes from audio signals, e.g. to implement compressor effects.
+
+
+
# Scanner
A mixer that can seamlessly blend up to 16 input channels.
@@ -78,16 +127,6 @@ NOTE: try modulating the position with the post output (feedback).
-# RMS
-
-A Root-Mean-Square based envelope follower, coupled with a slew limiter.
-
-The rise and fall rates can be configured separately.
-
-The module can be used to derive envelopes from audio signals, e.g. to implement compressor effects.
-
-
-
# Sway
A kind of slew-filtered noise generator, mainly designed for randomizing control voltages.
diff --git a/plugins/community/repos/bsp/make.objects b/plugins/community/repos/bsp/make.objects
index e641b3e8..34b9cb5b 100644
--- a/plugins/community/repos/bsp/make.objects
+++ b/plugins/community/repos/bsp/make.objects
@@ -1,9 +1,11 @@
ALL_OBJ= \
src/AttenuMixer.o \
+ src/Bias.o \
src/DownSampler.o \
src/bsp.o \
src/Legato.o \
src/Obxd_VCF.o \
+ src/Rescaler.o \
src/RMS.o \
src/Scanner.o \
src/Sway.o \
diff --git a/plugins/community/repos/bsp/res/Bias.svg b/plugins/community/repos/bsp/res/Bias.svg
new file mode 100644
index 00000000..31521300
--- /dev/null
+++ b/plugins/community/repos/bsp/res/Bias.svg
@@ -0,0 +1,483 @@
+
+
+
+
diff --git a/plugins/community/repos/bsp/res/Rescaler.svg b/plugins/community/repos/bsp/res/Rescaler.svg
new file mode 100644
index 00000000..512235c3
--- /dev/null
+++ b/plugins/community/repos/bsp/res/Rescaler.svg
@@ -0,0 +1,494 @@
+
+
+
+
diff --git a/plugins/community/repos/bsp/src/Bias.cpp b/plugins/community/repos/bsp/src/Bias.cpp
new file mode 100644
index 00000000..b33a0445
--- /dev/null
+++ b/plugins/community/repos/bsp/src/Bias.cpp
@@ -0,0 +1,124 @@
+/*
+Copyright (c) 2019 bsp
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#include
+
+#include "bsp.hpp"
+#include "dsp/digital.hpp"
+
+namespace rack_plugin_bsp {
+
+struct Bias : Module {
+ enum ParamIds {
+ CTR_PARAM,
+ NEG_PARAM,
+ POS_PARAM,
+ NUM_PARAMS
+ };
+ enum InputIds {
+ CTL_INPUT,
+ NUM_INPUTS
+ };
+ enum OutputIds {
+ CTL_OUTPUT,
+ NUM_OUTPUTS
+ };
+
+ Bias() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {
+ }
+
+ void step() override;
+};
+
+
+void Bias::step() {
+
+ // Read ctl input
+ float inVal = inputs[CTL_INPUT].value;
+ float ctrVal = params[CTR_PARAM].value;
+ float outVal;
+
+ if(inVal < ctrVal)
+ {
+ outVal = inVal - ctrVal;
+ outVal *= params[NEG_PARAM].value;
+ outVal += ctrVal;
+ }
+ else
+ {
+ outVal = inVal - ctrVal;
+ outVal *= params[POS_PARAM].value;
+ outVal += ctrVal;
+ }
+
+ outputs[CTL_OUTPUT].value = outVal;
+
+#if 0
+ static int xxx = 0;
+ if(0 == (++xxx & 32767))
+ {
+ printf("xxx outVal=%f\n", outVal);
+ }
+#endif
+}
+
+
+struct BiasWidget : ModuleWidget {
+ BiasWidget(Bias *module);
+};
+
+BiasWidget::BiasWidget(Bias *module) : ModuleWidget(module) {
+ setPanel(SVG::load(assetPlugin(plugin, "res/Bias.svg")));
+
+ addChild(Widget::create(Vec(15, 0)));
+ addChild(Widget::create(Vec(15, 365)));
+
+ float cx;
+ float cy;
+
+#define STY 30.0f
+ cx = 12.0f;
+ cy = 50.0f;
+ addInput(Port::create(Vec(11.0f, cy), Port::INPUT, module, Bias::CTL_INPUT));
+ cy += STY;
+#undef STY
+
+ cy = 115.0f;
+ addParam(ParamWidget::create(Vec(cx, cy), module, Bias::CTR_PARAM, -10.0f, 10.0f, 0.0f));
+
+ cy = 175.0f;
+ addParam(ParamWidget::create(Vec(cx, cy), module, Bias::NEG_PARAM, -4.0f, 4.0f, 1.0f));
+
+ cy = 235.0f;
+ addParam(ParamWidget::create(Vec(cx, cy), module, Bias::POS_PARAM, -4.0f, 4.0f, 1.0f));
+
+ addOutput(Port::create(Vec(11, 325), Port::OUTPUT, module, Bias::CTL_OUTPUT));
+}
+
+} // namespace rack_plugin_bsp
+
+using namespace rack_plugin_bsp;
+
+RACK_PLUGIN_MODEL_INIT(bsp, Bias) {
+ Model *modelBias = Model::create("bsp", "Bias", "Bias", UTILITY_TAG);
+ return modelBias;
+}
diff --git a/plugins/community/repos/bsp/src/Rescaler.cpp b/plugins/community/repos/bsp/src/Rescaler.cpp
new file mode 100644
index 00000000..9d70a35a
--- /dev/null
+++ b/plugins/community/repos/bsp/src/Rescaler.cpp
@@ -0,0 +1,164 @@
+/*
+Copyright (c) 2019 bsp
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#include
+
+#include "bsp.hpp"
+#include "dsp/digital.hpp"
+
+namespace rack_plugin_bsp {
+
+struct Rescaler : Module {
+ enum ParamIds {
+ IN_MIN_PARAM,
+ IN_MAX_PARAM,
+ OUT_MIN_PARAM,
+ OUT_MAX_PARAM,
+ NUM_PARAMS
+ };
+ enum InputIds {
+ CTL_INPUT,
+ SCALE_INPUT,
+ NUM_INPUTS
+ };
+ enum OutputIds {
+ CTL_OUTPUT,
+ NUM_OUTPUTS
+ };
+
+ Rescaler() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {
+ }
+
+ void step() override;
+};
+
+
+void Rescaler::step() {
+
+ // Read ctl input
+ float inVal = inputs[CTL_INPUT].value;
+
+ float t;
+ float inMin = params[IN_MIN_PARAM].value;
+ float inMax = params[IN_MAX_PARAM].value;
+ if(inMin > inMax)
+ {
+ t = inMin;
+ inMin = inMax;
+ inMax = t;
+ }
+
+ float outMin = params[OUT_MIN_PARAM].value;
+ float outMax = params[OUT_MAX_PARAM].value;
+ if(outMin > outMax)
+ {
+ t = outMin;
+ outMin = outMax;
+ outMax = t;
+ }
+
+ // Clip input to min..max range
+ if(inVal < inMin)
+ inVal = inMin;
+ else if(inVal > inMax)
+ inVal = inMax;
+
+ float outVal;
+
+ if((inMax > inMin) && (outMax > outMin))
+ {
+ // Rescale to output range
+ outVal = (inVal - inMin) / (inMax - inMin);
+ outVal = (outVal * (outMax - outMin)) + outMin;
+ }
+ else
+ {
+ // In or out range is zero
+ outVal = outMin;
+ }
+
+ // Scale by secondary input (if connected)
+ if(inputs[SCALE_INPUT].active)
+ {
+ outVal *= inputs[SCALE_INPUT].value;
+ }
+
+ outputs[CTL_OUTPUT].value = outVal;
+
+#if 0
+ static int xxx = 0;
+ if(0 == (++xxx & 32767))
+ {
+ printf("xxx outVal=%f\n", outVal);
+ }
+#endif
+}
+
+
+struct RescalerWidget : ModuleWidget {
+ RescalerWidget(Rescaler *module);
+};
+
+RescalerWidget::RescalerWidget(Rescaler *module) : ModuleWidget(module) {
+ setPanel(SVG::load(assetPlugin(plugin, "res/Rescaler.svg")));
+
+ addChild(Widget::create(Vec(15, 0)));
+ addChild(Widget::create(Vec(15, 365)));
+
+ float cx;
+ float cy;
+
+#define STY 30.0f
+ cx = 12.0f;
+ cy = 50.0f;
+ addInput(Port::create(Vec(11.0f, cy), Port::INPUT, module, Rescaler::CTL_INPUT));
+ cy += STY;
+#undef STY
+
+#define STY 30.0f
+ cx = 12.0f;
+ cy = 110.0f;
+ addParam(ParamWidget::create(Vec(cx, cy), module, Rescaler::IN_MIN_PARAM, -10.0f, 10.0f, 0.0f));
+ cy += STY;
+ addParam(ParamWidget::create(Vec(cx, cy), module, Rescaler::IN_MAX_PARAM, -10.0f, 10.0f, 10.0f));
+
+ cy = 195.0f;
+ addParam(ParamWidget::create(Vec(cx, cy), module, Rescaler::OUT_MIN_PARAM, -10.0f, 10.0f, 0.0f));
+ cy += STY;
+ addParam(ParamWidget::create(Vec(cx, cy), module, Rescaler::OUT_MAX_PARAM, -10.0f, 10.0f, 10.0f));
+#undef STX
+#undef STY
+
+ cy = 280.0f;
+ addInput(Port::create(Vec(11.0f, cy), Port::INPUT, module, Rescaler::SCALE_INPUT));
+
+ addOutput(Port::create(Vec(11, 325), Port::OUTPUT, module, Rescaler::CTL_OUTPUT));
+}
+
+} // namespace rack_plugin_bsp
+
+using namespace rack_plugin_bsp;
+
+RACK_PLUGIN_MODEL_INIT(bsp, Rescaler) {
+ Model *modelRescaler = Model::create("bsp", "Rescaler", "Rescaler", UTILITY_TAG);
+ return modelRescaler;
+}
diff --git a/plugins/community/repos/bsp/src/bsp.cpp b/plugins/community/repos/bsp/src/bsp.cpp
index 5e225c80..56176b91 100644
--- a/plugins/community/repos/bsp/src/bsp.cpp
+++ b/plugins/community/repos/bsp/src/bsp.cpp
@@ -1,9 +1,11 @@
#include "bsp.hpp"
RACK_PLUGIN_MODEL_DECLARE(bsp, AttenuMixer);
+RACK_PLUGIN_MODEL_DECLARE(bsp, Bias);
RACK_PLUGIN_MODEL_DECLARE(bsp, DownSampler);
RACK_PLUGIN_MODEL_DECLARE(bsp, Legato);
RACK_PLUGIN_MODEL_DECLARE(bsp, Obxd_VCF);
+RACK_PLUGIN_MODEL_DECLARE(bsp, Rescaler);
RACK_PLUGIN_MODEL_DECLARE(bsp, RMS);
RACK_PLUGIN_MODEL_DECLARE(bsp, Scanner);
RACK_PLUGIN_MODEL_DECLARE(bsp, Sway);
@@ -11,13 +13,15 @@ RACK_PLUGIN_MODEL_DECLARE(bsp, TunedDelayLine);
RACK_PLUGIN_INIT(bsp) {
RACK_PLUGIN_INIT_ID();
-
+ RACK_PLUGIN_INIT_VERSION("0.6.1");
RACK_PLUGIN_INIT_WEBSITE("https://github.com/bsp2/VeeSeeVSTRack/tree/v0.6/plugins/community/repos/bsp");
RACK_PLUGIN_MODEL_ADD(bsp, AttenuMixer);
+ RACK_PLUGIN_MODEL_ADD(bsp, Bias);
RACK_PLUGIN_MODEL_ADD(bsp, DownSampler);
RACK_PLUGIN_MODEL_ADD(bsp, Legato);
RACK_PLUGIN_MODEL_ADD(bsp, Obxd_VCF);
+ RACK_PLUGIN_MODEL_ADD(bsp, Rescaler);
RACK_PLUGIN_MODEL_ADD(bsp, RMS);
RACK_PLUGIN_MODEL_ADD(bsp, Scanner);
RACK_PLUGIN_MODEL_ADD(bsp, Sway);
diff --git a/todo.txt b/todo.txt
index 383f1e37..6cf3ced5 100644
--- a/todo.txt
+++ b/todo.txt
@@ -168,7 +168,27 @@
------------------------------------------------------------------------
+ REI: fix noise burst issue in pitchshifter (out of bounds read)
++ implement channel aftertouch
++ add "fixDenorm" option (fix denormalized floats in plugin output and clamp to [-4, 4] range)
+ + Toolbar editing
+ + save/restore to/from settings.json
++ bsp.Rescaler (input => [a..b])
+ + input (e.g. velocity)
+ + in min (clip) (-10..10)
+ + in max (clip) (-10..10)
+ + out min (-10..10)
+ + out max (-10..10)
+ + scale input (optional, def=1.0) (e.g. for env output)
+ + output
++ bsp.idea: Bias / KeyFollow
+ + input
+ + center / break point (0=c-5) (-10..10)
+ + bias neg (-10..10)
+ + bias pos (-10..10)
+ + output
+
+- fix save/save as keyboard shortcuts
diff --git a/vst2_bin/CHANGELOG_VST.txt b/vst2_bin/CHANGELOG_VST.txt
index 53badbc5..c78c875f 100644
--- a/vst2_bin/CHANGELOG_VST.txt
+++ b/vst2_bin/CHANGELOG_VST.txt
@@ -1,4 +1,14 @@
+** March 10th, 2019
+- implement MIDI channel aftertouch
+- add "fixDenorm" global setting (settings.json) (also editable via Toolbar)
+- fix "Save as" (Ctrl+Shift+S) and "Revert" (Ctrl+Shift+O) keyboard shortcuts
+- update ImpromptuModular.* 0.6.16 => 0.6.17pre
+- add module bsp.Bias
+- add module bsp.Rescaler
+- update patches
+
+
** March 9th, 2019
- fix loud noise burst issue in Bidoo.REI module
- add patch collection (see vst2_bin/patches/bsp/, 90 patches)
diff --git a/vst2_bin/README_vst2.txt b/vst2_bin/README_vst2.txt
index 0f67d5b9..15c868da 100644
--- a/vst2_bin/README_vst2.txt
+++ b/vst2_bin/README_vst2.txt
@@ -1,5 +1,5 @@
-VeeSeeVST Rack VST 2.4 Plugin -- March 8th, 2019
-================================================
+VeeSeeVST Rack VST 2.4 Plugin -- March 10th, 2019
+=================================================
!!!------------------------------------------------------------------------------
!!! ***** THIS IS NOT AN OFFICIAL VCV RACK RELEASE ***** !!!
@@ -25,7 +25,7 @@ This is a quick'n'dirty adaption of VCV Rack 0.6.1 for the VST2 format.
- offline rendering uses separate settings (highest quality by default)
+ supports idle-detection
- wake up on MIDI note on or audio input
-+ comes with 825 prebuilt modules
++ comes with 827 prebuilt modules
Here's a demo video of it: https://vimeo.com/277703414
@@ -48,11 +48,13 @@ Linux version tested in:
- according to users: works in Qtractor 0.9.2
-The binary distribution contains the following (32) dynamically loaded add-on modules:
+The binary distribution contains the following (34) dynamically loaded add-on modules:
- bsp.AttenuMixer
+ - bsp.Bias
- bsp.DownSampler
- bsp.Legato
- bsp.Obxd_VCF
+ - bsp.Rescaler
- bsp.RMS
- bsp.Scanner
- bsp.Sway
diff --git a/vst2_bin/plugins/bsp/README.md b/vst2_bin/plugins/bsp/README.md
index b37bb61d..3e8bb4fe 100644
--- a/vst2_bin/plugins/bsp/README.md
+++ b/vst2_bin/plugins/bsp/README.md
@@ -9,12 +9,34 @@ The default scaling factor of input 2 is calibrated to +-24 semitones (e.g. MPE
Inputs 3 and 4 use default scaling factors of 0.5 and 0.25, respectively.
-The switch at the top is used to enabled bipolar scaling (-1..1).
+The right switch at the top is used to enabled bipolar scaling (-1..1).
+
+The left switch enables fine offset scaling (e.g. for precise detuning).
Suggested applications:
- Mix pitch voltages, e.g. base pitch + pitchbend + vibrato.
- Mix filter cutoff voltages, e.g. ADSR + LFO + modwheel
+ - Mix audio signals
+
+
+
+# Bias
+
+Rescales incoming signals.
+
+Values below the "CTR" point are scaled by the "NEG" param, values above the "CTR" point are scaled by the "POS" param.
+
+Suggested application: Filter keyboard tracking.
+
+Example:
+- Connect MIDI-1 CV output to the input
+- Connect the output to a filter's frequency input
+- Adjust center and scale values to taste
+
+NOTE: This can also be used as a simple asymmetric waveshaper for audio signals
+
+NOTE: For use as an amplifier, set "CTR" to -10, then use "POS" to set the amplification (-4..4) (negative values flip the phase)
@@ -53,6 +75,33 @@ An adaption of Filatov Vadim's excellent Ob-Xd filter. Distributed under terms o
+# Rescaler
+
+Clips the input signal to the "IN" min/max range (min=upper knob, max=lower knob), normalizes it, and scales it to the "OUT" min/max range.
+
+If the lower scale input jack is connected, the output value is scaled by the scale input's current value.
+
+Suggest application: Finetune velocity responses.
+
+Example:
+- Connect the MIDI-1 velocity output to the main input
+- Connect the output of an envelope generator to the scale input
+- Connect the module's output to the frequency modulation input of a filter
+- Adjust the min/max knobs to taste
+
+NOTE: This module can also be used as a clipper
+
+
+# RMS
+
+A Root-Mean-Square based envelope follower, coupled with a slew limiter.
+
+The rise and fall rates can be configured separately.
+
+The module can be used to derive envelopes from audio signals, e.g. to implement compressor effects.
+
+
+
# Scanner
A mixer that can seamlessly blend up to 16 input channels.
@@ -78,16 +127,6 @@ NOTE: try modulating the position with the post output (feedback).
-# RMS
-
-A Root-Mean-Square based envelope follower, coupled with a slew limiter.
-
-The rise and fall rates can be configured separately.
-
-The module can be used to derive envelopes from audio signals, e.g. to implement compressor effects.
-
-
-
# Sway
A kind of slew-filtered noise generator, mainly designed for randomizing control voltages.
diff --git a/vst2_bin/plugins/bsp/res/Bias.svg b/vst2_bin/plugins/bsp/res/Bias.svg
new file mode 100644
index 00000000..31521300
--- /dev/null
+++ b/vst2_bin/plugins/bsp/res/Bias.svg
@@ -0,0 +1,483 @@
+
+
+
+
diff --git a/vst2_bin/plugins/bsp/res/Rescaler.svg b/vst2_bin/plugins/bsp/res/Rescaler.svg
new file mode 100644
index 00000000..512235c3
--- /dev/null
+++ b/vst2_bin/plugins/bsp/res/Rescaler.svg
@@ -0,0 +1,494 @@
+
+
+
+