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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +