diff --git a/plugins/community/repos/bsp/README.md b/plugins/community/repos/bsp/README.md index 60658493..c6eb727d 100644 --- a/plugins/community/repos/bsp/README.md +++ b/plugins/community/repos/bsp/README.md @@ -1,5 +1,5 @@ -bsp modules for VeeSeeVST Rack -- March 10th, 2019, v0.6.1 -========================================================== +bsp modules for VeeSeeVST Rack -- May 7th, 2019, v0.6.4 +======================================================= # AttenuMixer @@ -54,6 +54,20 @@ 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) +# BeatFreq + +Tuner + note independent beat frequency generator. + +This module can be used to detune incoming pitch CV signals by octaves, semitones, and cents. + +It can also generate note independent beat frequencies which are very useful in dual oscillator patches. +The beat frequency settings determines the "phasing speed". +Unlike regular detuning, the phasing speed remains contains for all notes. + +NOTE: The octave and semitone modulation ports are additive +NOTE: The cent and beatfreq modulation ports are multiplicative (useful for vibratos etc) + + # DownSampler diff --git a/plugins/community/repos/bsp/make.objects b/plugins/community/repos/bsp/make.objects index 34b9cb5b..f4a72b20 100644 --- a/plugins/community/repos/bsp/make.objects +++ b/plugins/community/repos/bsp/make.objects @@ -1,5 +1,6 @@ ALL_OBJ= \ src/AttenuMixer.o \ + src/BeatFreq.o \ src/Bias.o \ src/DownSampler.o \ src/bsp.o \ diff --git a/plugins/community/repos/bsp/res/BeatFreq.svg b/plugins/community/repos/bsp/res/BeatFreq.svg new file mode 100644 index 00000000..1911581a --- /dev/null +++ b/plugins/community/repos/bsp/res/BeatFreq.svg @@ -0,0 +1,533 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/community/repos/bsp/src/BeatFreq.cpp b/plugins/community/repos/bsp/src/BeatFreq.cpp new file mode 100644 index 00000000..b05299b8 --- /dev/null +++ b/plugins/community/repos/bsp/src/BeatFreq.cpp @@ -0,0 +1,183 @@ +/* +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" + +namespace rack_plugin_bsp { + +struct BeatFreq : Module { + enum ParamIds { + OCT_PARAM, + SEMI_PARAM, + CENT_PARAM, + BEATFREQ_PARAM, + NUM_PARAMS + }; + enum InputIds { + CV_INPUT, + OCT_INPUT, + SEMI_INPUT, + CENT_INPUT, + BEATFREQ_INPUT, + NUM_INPUTS + }; + enum OutputIds { + CV_OUTPUT, + NUM_OUTPUTS + }; + + BeatFreq() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) { + } + + void step() override; +}; + + +void BeatFreq::step() { + + float cv = inputs[CV_INPUT].value; + float f; + + // Octave shift (additive modulation) + int oct = int(params[OCT_PARAM].value); + if(inputs[OCT_INPUT].active) + { + f = inputs[OCT_INPUT].value * (4.0f / 5.0f); + if(f < 0.0f) + { + oct += int(f - 0.5f); + } + else + { + oct += int(f + 0.5f); + } + } + cv += oct; + + // Semitone shift (additive modulation) + int semi = int(params[SEMI_PARAM].value); + if(inputs[SEMI_INPUT].active) + { + f = inputs[SEMI_INPUT].value * (12.0f / 5.0f); + if(f < 0.0f) + { + semi += int(f - 0.5f); + } + else + { + semi += int(f + 0.5f); + } + } + cv += semi * (1.0f / 12.0f); + + // Cent shift (scaled modulation) + float cent = params[CENT_PARAM].value; + if(inputs[CENT_INPUT].active) + { + f = inputs[CENT_INPUT].value * (1.0f / 5.0f); + cent *= f; + } + cv += cent * (1.0f / 1200.0f); + + // Beat Frequency (scaled modulation) + sF32 beatFreq = params[BEATFREQ_PARAM].value; + if(inputs[BEATFREQ_INPUT].active) + { + f = inputs[BEATFREQ_INPUT].value * (1.0f / 5.0f); + beatFreq *= f; + } + + beatFreq *= (1.0f / 100.0f); // => -1..1 + beatFreq = beatFreq * beatFreq * beatFreq; // increase fine tuning precision (around 0) + beatFreq *= (1.0f / 12.0f); + cv += beatFreq / powf(2.0f, cv); + + outputs[CV_OUTPUT].value = cv; +} + + +struct BeatFreqWidget : ModuleWidget { + BeatFreqWidget(BeatFreq *module); +}; + +BeatFreqWidget::BeatFreqWidget(BeatFreq *module) : ModuleWidget(module) { + setPanel(SVG::load(assetPlugin(plugin, "res/BeatFreq.svg"))); + + addChild(Widget::create(Vec(15, 0))); + addChild(Widget::create(Vec(15, 365))); + + // CV input + addInput(Port::create(Vec(11.0f, 40.0f), Port::INPUT, module, BeatFreq::CV_INPUT)); + +#define STY_KNOB 27.0f +#define STY_PORT 35.0f + float cxk = 5.0f; + float cxp = 4.0f; + float cy = 73.0f; + + // Octave + addParam(ParamWidget::create(Vec(cxk, cy), module, BeatFreq::OCT_PARAM, -4.0f, 4.0f, 0.0f)); + cy += STY_KNOB; + + // Octave modulation + addInput(Port::create(Vec(cxp, cy), Port::INPUT, module, BeatFreq::OCT_INPUT)); + cy += STY_PORT; + + // Semitones + addParam(ParamWidget::create(Vec(cxk, cy), module, BeatFreq::SEMI_PARAM, -12.0f, 12.0f, 0.0f)); + cy += STY_KNOB; + + // Semitones modulation + addInput(Port::create(Vec(cxp, cy), Port::INPUT, module, BeatFreq::SEMI_INPUT)); + cy += STY_PORT; + + // Cents + addParam(ParamWidget::create(Vec(cxk, cy), module, BeatFreq::CENT_PARAM, -100.0f, 100.0f, 0.0f)); + cy += STY_KNOB; + + // Cents modulation + addInput(Port::create(Vec(cxp, cy), Port::INPUT, module, BeatFreq::CENT_INPUT)); + cy += STY_PORT; + + // BeatFreq + addParam(ParamWidget::create(Vec(cxk, cy), module, BeatFreq::BEATFREQ_PARAM, -100.0f, 100.0f, 0.0f)); + cy += STY_KNOB; + + // BeatFreq modulation + addInput(Port::create(Vec(cxp, cy), Port::INPUT, module, BeatFreq::BEATFREQ_INPUT)); + cy += STY_PORT; + + // CV Output + cy = 320.0f; + addOutput(Port::create(Vec(11, 325), Port::OUTPUT, module, BeatFreq::CV_OUTPUT)); +} + +} // namespace rack_plugin_bsp + +using namespace rack_plugin_bsp; + +RACK_PLUGIN_MODEL_INIT(bsp, BeatFreq) { + Model *modelBeatFreq = Model::create("bsp", "BeatFreq", "BeatFreq", TUNER_TAG); + return modelBeatFreq; +} diff --git a/plugins/community/repos/bsp/src/bsp.cpp b/plugins/community/repos/bsp/src/bsp.cpp index 56176b91..75560bf7 100644 --- a/plugins/community/repos/bsp/src/bsp.cpp +++ b/plugins/community/repos/bsp/src/bsp.cpp @@ -1,6 +1,7 @@ #include "bsp.hpp" RACK_PLUGIN_MODEL_DECLARE(bsp, AttenuMixer); +RACK_PLUGIN_MODEL_DECLARE(bsp, BeatFreq); RACK_PLUGIN_MODEL_DECLARE(bsp, Bias); RACK_PLUGIN_MODEL_DECLARE(bsp, DownSampler); RACK_PLUGIN_MODEL_DECLARE(bsp, Legato); @@ -13,10 +14,11 @@ RACK_PLUGIN_MODEL_DECLARE(bsp, TunedDelayLine); RACK_PLUGIN_INIT(bsp) { RACK_PLUGIN_INIT_ID(); - RACK_PLUGIN_INIT_VERSION("0.6.1"); + RACK_PLUGIN_INIT_VERSION("0.6.4"); 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, BeatFreq); RACK_PLUGIN_MODEL_ADD(bsp, Bias); RACK_PLUGIN_MODEL_ADD(bsp, DownSampler); RACK_PLUGIN_MODEL_ADD(bsp, Legato); diff --git a/vst2_bin/plugins/bsp/README.md b/vst2_bin/plugins/bsp/README.md index 60658493..c6eb727d 100644 --- a/vst2_bin/plugins/bsp/README.md +++ b/vst2_bin/plugins/bsp/README.md @@ -1,5 +1,5 @@ -bsp modules for VeeSeeVST Rack -- March 10th, 2019, v0.6.1 -========================================================== +bsp modules for VeeSeeVST Rack -- May 7th, 2019, v0.6.4 +======================================================= # AttenuMixer @@ -54,6 +54,20 @@ 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) +# BeatFreq + +Tuner + note independent beat frequency generator. + +This module can be used to detune incoming pitch CV signals by octaves, semitones, and cents. + +It can also generate note independent beat frequencies which are very useful in dual oscillator patches. +The beat frequency settings determines the "phasing speed". +Unlike regular detuning, the phasing speed remains contains for all notes. + +NOTE: The octave and semitone modulation ports are additive +NOTE: The cent and beatfreq modulation ports are multiplicative (useful for vibratos etc) + + # DownSampler diff --git a/vst2_bin/plugins/bsp/res/BeatFreq.svg b/vst2_bin/plugins/bsp/res/BeatFreq.svg new file mode 100644 index 00000000..1911581a --- /dev/null +++ b/vst2_bin/plugins/bsp/res/BeatFreq.svg @@ -0,0 +1,533 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +