BogaudioModules

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

commit 05483153c17d079e001cac77b2f64025ebdcc69a
parent 0da5f6e41f2cdbc0cc10af9c10ef5733a2ea0a4a
Author: Matt Demanett <matt@demanett.net>
Date:   Thu, 12 Sep 2019 21:49:00 -0400

Poly: S&H.

Diffstat:
Msrc/SampleHold.cpp | 39++++++++++++++++++++++++---------------
Msrc/SampleHold.hpp | 17++++++++---------
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();