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:
M | src/Test.cpp | | | 81 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------- |
M | src/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