commit 230df78c9241b74592e60ea9bed1d51bd8ceba6b
parent 407a5484cdfccaec0fbfbb3b67214904abdb062c
Author: Matt Demanett <matt@demanett.net>
Date: Sun, 11 Mar 2018 00:49:02 -0500
FM, PM experiments.
Diffstat:
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