BogaudioModules

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

commit e82a6928862f79feb2553473fcdfa889a8ac09e6
parent 9f4967fded1c4a7a721339e38172eafbb7ecbecc
Author: Matt Demanett <matt@demanett.net>
Date:   Wed, 14 Mar 2018 23:53:17 -0400

FM/PM experiments: improvements, feedback.

Diffstat:
Msrc/Test.cpp | 81++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
Msrc/Test.hpp | 14+++++++++++++-
2 files changed, 71 insertions(+), 24 deletions(-)

diff --git a/src/Test.cpp b/src/Test.cpp @@ -94,38 +94,54 @@ void Test::step() { outputs[OUT2_OUTPUT].value = s * 5.0; #elif FM + float baseHz = oscillatorPitch(); + float ratio = ratio2(); _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; + _modulator.setFrequency(baseHz * ratio2()); + float hz = _modulator.next() * index3() * ratio * baseHz; _carrier.setSampleRate(engineGetSampleRate()); - _carrier.setFrequency(oscillatorPitch() + hz); - float v1 = _carrier.next() * 5.0f; - outputs[OUT_OUTPUT].value = v1; + _carrier.setFrequency(baseHz + hz); + outputs[OUT_OUTPUT].value = _carrier.next() * 5.0f; + + _carrier2.setSampleRate(engineGetSampleRate()); + _carrier2.setFrequency(oscillatorPitch()); + _modulator2.setSampleRate(engineGetSampleRate()); + _modulator2.setFrequency(_carrier2._frequency * ratio); + _carrier2.next(); + outputs[OUT2_OUTPUT].value = _carrierOutput2.nextFromPhasor(_carrier2, Phasor::radiansToPhase(index3() * _modulator2.next())) * 5.0f; #elif PM _carrier.setSampleRate(engineGetSampleRate()); _carrier.setFrequency(oscillatorPitch()); _modulator.setSampleRate(engineGetSampleRate()); - _modulator.setFrequency(oscillatorPitch2()); + _modulator.setFrequency(_carrier._frequency * ratio2()); // _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, Phasor::radiansToPhase(index3() * _modulator.next())) * 5.0f; + +#elif FEEDBACK_PM + _carrier.setSampleRate(engineGetSampleRate()); + _carrier.setFrequency(oscillatorPitch()); + float feedback = params[PARAM3_PARAM].value; + if (inputs[CV3_INPUT].active) { + feedback *= clamp(inputs[CV3_INPUT].value, 0.0f, 10.0f) / 10.0f; } - outputs[OUT_OUTPUT].value = _carrierOutput.nextFromPhasor(_carrier) * 5.0f; + // feedback *= 10.0f; + + // no delay: + feedback *= _carrier.next(); + + // // 1 sample: + // feedback *= _carrier.current(); + // _carrier.next(); + + // // 2 samples averaged: + // float feedbackSample = _carrier.current(); + // _carrier.next(); + // feedback *= (_feedbackSample + feedbackSample) / 2.0f; + // _feedbackSample = feedbackSample; + + outputs[OUT_OUTPUT].value = _carrierOutput.nextFromPhasor(_carrier, Phasor::radiansToPhase(feedback)) * 5.0f; #elif EG _envelope.setAttack(params[PARAM1_PARAM].value); @@ -133,7 +149,7 @@ void Test::step() { _envelope.setSustain(params[PARAM3_PARAM].value); _envelope.setRelease(params[PARAM2_PARAM].value); _envelope.setGate(inputs[CV1_INPUT].value > 0.1f); - outputs[OUT_OUTPUT].value = _envelope.next(); + outputs[OUT_OUTPUT].value = _envelope.next() * 10.0f; #endif } @@ -151,6 +167,25 @@ float Test::oscillatorPitch2() { return 10000.0 * powf(params[PARAM2_PARAM].value, 2.0); } +float Test::ratio2() { + float ratio = (params[PARAM2_PARAM].value * 2.0f) - 1.0f; + if (inputs[CV2_INPUT].active) { + ratio *= clamp(inputs[CV2_INPUT].value / 5.0f, -1.0f, 1.0f); + } + if (ratio < 0.0f) { + return 1.0f + ratio; + } + return 1.0f + 9.0f*ratio; +} + +float Test::index3() { + float index = params[PARAM3_PARAM].value; + if (inputs[CV3_INPUT].active) { + index *= clamp(inputs[CV3_INPUT].value, 0.0f, 10.0f) / 10.0f; + } + return index * 10.0f; +} + struct TestWidget : ModuleWidget { TestWidget(Test* module) : ModuleWidget(module) { diff --git a/src/Test.hpp b/src/Test.hpp @@ -14,7 +14,8 @@ extern Model* modelTest; // #define OVERSAMPLING 1 // #define FM 1 // #define PM 1 -#define EG 1 +#define FEEDBACK_PM 1 +// #define EG 1 #include "pitch.hpp" #ifdef LPF @@ -41,6 +42,8 @@ extern Model* modelTest; #include "dsp/oscillator.hpp" #elif PM #include "dsp/oscillator.hpp" +#elif FEEDBACK_PM +#include "dsp/oscillator.hpp" #elif EG #include "dsp/envelope.hpp" #else @@ -106,6 +109,10 @@ struct Test : Module { SineTableOscillator _modulator; Phasor _carrier; SineTableOscillator _carrierOutput; +#elif FEEDBACK_PM + Phasor _carrier; + SineTableOscillator _carrierOutput; + float _feedbackSample = 0.0f; #elif EG ADSR _envelope; #endif @@ -139,6 +146,9 @@ struct Test : Module { , _modulator(44100.0, 1000.0, 1.0) , _carrier(44100.0, 1000.0) , _carrierOutput(44100.0, 1000.0) +#elif FEEDBACK_PM + , _carrier(44100.0, 1000.0) + , _carrierOutput(44100.0, 1000.0) #elif EG , _envelope(44100.0) #endif @@ -213,6 +223,8 @@ struct Test : Module { virtual void step() override; float oscillatorPitch(); float oscillatorPitch2(); + float ratio2(); + float index3(); }; } // namespace bogaudio