commit 05483153c17d079e001cac77b2f64025ebdcc69a
parent 0da5f6e41f2cdbc0cc10af9c10ef5733a2ea0a4a
Author: Matt Demanett <matt@demanett.net>
Date: Thu, 12 Sep 2019 21:49:00 -0400
Poly: S&H.
Diffstat:
2 files changed, 32 insertions(+), 24 deletions(-)
diff --git a/src/SampleHold.cpp b/src/SampleHold.cpp
@@ -6,10 +6,12 @@
#define RANGE_SCALE "range_scale"
void SampleHold::reset() {
- _trigger1.reset();
- _value1 = 0.0f;
- _trigger2.reset();
- _value2 = 0.0f;
+ for (int i = 0; i < maxChannels; ++i) {
+ _trigger1[i].reset();
+ _value1[i] = 0.0f;
+ _trigger2[i].reset();
+ _value2[i] = 0.0f;
+ }
}
json_t* SampleHold::dataToJson() {
@@ -37,7 +39,9 @@ void SampleHold::dataFromJson(json_t* root) {
}
}
-void SampleHold::processChannel(const ProcessArgs& args, int _c) {
+void SampleHold::processChannel(const ProcessArgs& args, int c) {
+ assert(c == 0);
+
processChannel(
lights[TRACK1_LIGHT],
params[TRACK1_PARAM],
@@ -63,24 +67,29 @@ void SampleHold::processChannel(const ProcessArgs& args, int _c) {
void SampleHold::processChannel(
Light& trackLight,
Param& trackParam,
- Trigger& trigger,
+ Trigger* trigger,
Param& triggerParam,
Input& triggerInput,
Input& in,
- float& value,
+ float* value,
Output& out
) {
trackLight.value = trackParam.getValue();
- bool triggered = trigger.process(triggerParam.getValue() + triggerInput.getVoltage());
- if (trackParam.getValue() > 0.5f ? trigger.isHigh() : triggered) {
- if (in.isConnected()) {
- value = in.getVoltageSum();
- }
- else {
- value = (noise() + _rangeOffset) * _rangeScale;
+
+ int n = std::max(1, std::max(triggerInput.getChannels(), in.getChannels()));
+ out.setChannels(n);
+ for (int i = 0; i < n; ++i) {
+ bool triggered = trigger[i].process(triggerParam.getValue() + triggerInput.getPolyVoltage(i));
+ if (trackParam.getValue() > 0.5f ? trigger[i].isHigh() : triggered) {
+ if (in.isConnected()) {
+ value[i] = in.getPolyVoltage(i);
+ }
+ else {
+ value[i] = (noise() + _rangeOffset) * _rangeScale;
+ }
}
+ out.setVoltage(value[i], i);
}
- out.setVoltage(value);
}
float SampleHold::noise() {
diff --git a/src/SampleHold.hpp b/src/SampleHold.hpp
@@ -45,8 +45,10 @@ struct SampleHold : BGModule {
RED_NOISE_TYPE
};
- Trigger _trigger1, _trigger2;
- float _value1, _value2;
+ Trigger _trigger1[maxChannels];
+ Trigger _trigger2[maxChannels];
+ float _value1[maxChannels] {};
+ float _value2[maxChannels] {};
BlueNoiseGenerator _blue;
WhiteNoiseGenerator _white;
PinkNoiseGenerator _pink;
@@ -55,10 +57,7 @@ struct SampleHold : BGModule {
float _rangeOffset = 1.0f;
float _rangeScale = 5.0f;
- SampleHold()
- : _value1(0.0f)
- , _value2(0.0f)
- {
+ SampleHold() {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
configParam(TRIGGER1_PARAM, 0.0f, 10.0f, 0.0f, "Trigger 1");
configParam(TRIGGER2_PARAM, 0.0f, 10.0f, 0.0f, "Trigger 2");
@@ -71,15 +70,15 @@ struct SampleHold : BGModule {
void reset() override;
json_t* dataToJson() override;
void dataFromJson(json_t* root) override;
- void processChannel(const ProcessArgs& args, int _c) override;
+ void processChannel(const ProcessArgs& args, int c) override;
void processChannel(
Light& trackLight,
Param& trackParam,
- Trigger& trigger,
+ Trigger* trigger,
Param& triggerParam,
Input& triggerInput,
Input& in,
- float& value,
+ float* value,
Output& out
);
float noise();