BogaudioModules

BogaudioModules for VCV Rack
Log | Files | Refs | README | LICENSE

commit 230df78c9241b74592e60ea9bed1d51bd8ceba6b
parent 407a5484cdfccaec0fbfbb3b67214904abdb062c
Author: Matt Demanett <matt@demanett.net>
Date:   Sun, 11 Mar 2018 00:49:02 -0500

FM, PM experiments.

Diffstat:
Mres-src/Test-src.svg | 30+++++++++++++++++++++---------
Mres/Test.svg | 0
Msrc/Test.cpp | 57+++++++++++++++++++++++++++++++++++++++++++++++++++------
Msrc/Test.hpp | 26++++++++++++++++++++++++--
4 files changed, 96 insertions(+), 17 deletions(-)

diff --git a/res-src/Test-src.svg b/res-src/Test-src.svg @@ -102,13 +102,12 @@ </g> </g> - <g transform="translate(0 25)"> - <text font-size="6pt" letter-spacing="2px" transform="translate(5.5 0)">P1</text> + <g transform="translate(0 10)"> + <!-- <text font-size="6pt" letter-spacing="2px" transform="translate(5.5 0)">P1</text> --> <use id="PARAM1_PARAM" xlink:href="#knob" transform="translate(0 -6)" /> <use xlink:href="#knobguide" transform="translate(0 -6)" /> </g> - - <g transform="translate(0 63)"> + <g transform="translate(0 50)"> <g transform="translate(5.5 0)"> <rect width="34" height="38" rx="5" fill="#fafafa" /> <use id="CV1_INPUT" xlink:href="#input" transform="translate(5 3)" /> @@ -116,20 +115,33 @@ </g> </g> - <g transform="translate(0 125)"> - <text font-size="6pt" letter-spacing="2px" transform="translate(5.5 0)">P2</text> + <g transform="translate(0 95)"> + <!-- <text font-size="6pt" letter-spacing="2px" transform="translate(5.5 0)">P2</text> --> <use id="PARAM2_PARAM" xlink:href="#knob" transform="translate(0 -6)" /> <use xlink:href="#knobguide" transform="translate(0 -6)" /> </g> - - <g transform="translate(0 165)"> + <g transform="translate(0 135)"> <g transform="translate(5.5 0)"> <rect width="34" height="38" rx="5" fill="#fafafa" /> <use id="CV2_INPUT" xlink:href="#input" transform="translate(5 3)" /> <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 35)">CV</text> </g> </g> - <g transform="translate(0 255)"> + + <g transform="translate(0 180)"> + <!-- <text font-size="6pt" letter-spacing="2px" transform="translate(5.5 0)">P3</text> --> + <use id="PARAM3_PARAM" xlink:href="#knob" transform="translate(0 -6)" /> + <use xlink:href="#knobguide" transform="translate(0 -6)" /> + </g> + <g transform="translate(0 220)"> + <g transform="translate(5.5 0)"> + <rect width="34" height="38" rx="5" fill="#fafafa" /> + <use id="CV3_INPUT" xlink:href="#input" transform="translate(5 3)" /> + <text font-size="5pt" letter-spacing="2px" transform="translate(12.5 35)">CV</text> + </g> + </g> + + <g transform="translate(0 265)"> <g transform="translate(5.5 0)"> <rect width="34" height="10" fill="#fafafa" transform="translate(0 63)" /> <rect width="34" height="70" rx="5" fill="#fafafa" /> diff --git a/res/Test.svg b/res/Test.svg Binary files differ. diff --git a/src/Test.cpp b/src/Test.cpp @@ -92,6 +92,40 @@ void Test::step() { // s = _saw2.next(); } outputs[OUT2_OUTPUT].value = s * 5.0; + +#elif FM + _modulator.setSampleRate(engineGetSampleRate()); + _modulator.setFrequency(oscillatorPitch2()); + float index = params[PARAM3_PARAM].value; + if (inputs[CV3_INPUT].active) { + index *= clamp(inputs[CV3_INPUT].value, 0.0f, 10.0f) / 10.0f; + } + float hz = _modulator.next() * index * 10000.0f; + _carrier.setSampleRate(engineGetSampleRate()); + _carrier.setFrequency(oscillatorPitch() + hz); + float v1 = _carrier.next() * 5.0f; + outputs[OUT_OUTPUT].value = v1; + +#elif PM + _carrier.setSampleRate(engineGetSampleRate()); + _carrier.setFrequency(oscillatorPitch()); + _modulator.setSampleRate(engineGetSampleRate()); + _modulator.setFrequency(oscillatorPitch2()); + // _carrierOutput.setSampleRate(engineGetSampleRate()); + float index = params[PARAM3_PARAM].value; + if (inputs[CV3_INPUT].active) { + index *= clamp(inputs[CV3_INPUT].value, 0.0f, 10.0f) / 10.0f; + } + float hz = _modulator.next() * index * 10000.0f; + _carrier.next(); + _carrier._phase += Phasor::maxPhase * (hz / _carrier._sampleRate); + if (_carrier._phase >= Phasor::maxPhase) { + _carrier._phase -= Phasor::maxPhase; + } + else if (_carrier._phase <= 0.0f) { + _carrier._phase += Phasor::maxPhase; + } + outputs[OUT_OUTPUT].value = _carrierOutput.nextFromPhasor(_carrier) * 5.0f; #endif } @@ -102,6 +136,13 @@ float Test::oscillatorPitch() { return 10000.0 * powf(params[PARAM1_PARAM].value, 2.0); } +float Test::oscillatorPitch2() { + if (inputs[CV2_INPUT].active) { + return cvToFrequency(inputs[CV2_INPUT].value); + } + return 10000.0 * powf(params[PARAM2_PARAM].value, 2.0); +} + struct TestWidget : ModuleWidget { TestWidget(Test* module) : ModuleWidget(module) { @@ -118,22 +159,26 @@ struct TestWidget : ModuleWidget { addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365))); // generated by svg_widgets.rb - auto param1ParamPosition = Vec(9.5, 28.5); - auto param2ParamPosition = Vec(9.5, 128.5); + auto param1ParamPosition = Vec(9.5, 13.5); + auto param2ParamPosition = Vec(9.5, 98.5); + auto param3ParamPosition = Vec(9.5, 183.5); - auto cv1InputPosition = Vec(10.5, 66.0); - auto cv2InputPosition = Vec(10.5, 168.0); - auto inInputPosition = Vec(10.5, 258.0); + auto cv1InputPosition = Vec(10.5, 53.0); + auto cv2InputPosition = Vec(10.5, 138.0); + auto cv3InputPosition = Vec(10.5, 223.0); + auto inInputPosition = Vec(10.5, 268.0); - auto outOutputPosition = Vec(10.5, 296.0); + auto outOutputPosition = Vec(10.5, 306.0); auto out2OutputPosition = Vec(20.5, 316.0); // end generated by svg_widgets.rb addParam(ParamWidget::create<Knob26>(param1ParamPosition, module, Test::PARAM1_PARAM, 0.0, 1.0, 0.5)); addParam(ParamWidget::create<Knob26>(param2ParamPosition, module, Test::PARAM2_PARAM, 0.0, 1.0, 0.5)); + addParam(ParamWidget::create<Knob26>(param3ParamPosition, module, Test::PARAM3_PARAM, 0.0, 1.0, 0.5)); addInput(Port::create<Port24>(cv1InputPosition, Port::INPUT, module, Test::CV1_INPUT)); addInput(Port::create<Port24>(cv2InputPosition, Port::INPUT, module, Test::CV2_INPUT)); + addInput(Port::create<Port24>(cv3InputPosition, Port::INPUT, module, Test::CV3_INPUT)); addInput(Port::create<Port24>(inInputPosition, Port::INPUT, module, Test::IN_INPUT)); addOutput(Port::create<Port24>(outOutputPosition, Port::OUTPUT, module, Test::OUT_OUTPUT)); diff --git a/src/Test.hpp b/src/Test.hpp @@ -6,12 +6,14 @@ extern Model* modelTest; // #define LPF 1 // #define LPFNOISE 1 -#define SINE 1 +// #define SINE 1 // #define SQUARE 1 // #define SAW 1 // #define TRIANGLE 1 // #define SINEBANK 1 // #define OVERSAMPLING 1 +#define FM 1 +// #define PM 1 #include "pitch.hpp" #ifdef LPF @@ -34,6 +36,10 @@ extern Model* modelTest; #include "dsp/decimator.hpp" // rack #include "dsp/filter.hpp" #define OVERSAMPLEN 16 +#elif FM +#include "dsp/oscillator.hpp" +#elif PM +#include "dsp/oscillator.hpp" #else #error what #endif @@ -42,17 +48,18 @@ using namespace bogaudio::dsp; namespace bogaudio { - struct Test : Module { enum ParamsIds { PARAM1_PARAM, PARAM2_PARAM, + PARAM3_PARAM, NUM_PARAMS }; enum InputsIds { CV1_INPUT, CV2_INPUT, + CV3_INPUT, IN_INPUT, NUM_INPUTS }; @@ -89,6 +96,13 @@ struct Test : Module { SawOscillator _saw2; LowPassFilter _lpf; LowPassFilter _lpf2; +#elif FM + SineTableOscillator _modulator; + SineTableOscillator _carrier; +#elif PM + SineTableOscillator _modulator; + Phasor _carrier; + SineTableOscillator _carrierOutput; #endif Test() @@ -113,6 +127,13 @@ struct Test : Module { , _saw2(44100.0, 1000.0, 1.0) , _lpf(44100.0, 1000.0, 1.0) , _lpf2(44100.0, 1000.0, 1.0) +#elif FM + , _modulator(44100.0, 1000.0, 1.0) + , _carrier(44100.0, 1000.0, 1.0) +#elif PM + , _modulator(44100.0, 1000.0, 1.0) + , _carrier(44100.0, 1000.0) + , _carrierOutput(44100.0, 1000.0) #endif { onReset(); @@ -184,6 +205,7 @@ struct Test : Module { virtual void onReset() override; virtual void step() override; float oscillatorPitch(); + float oscillatorPitch2(); }; } // namespace bogaudio