commit e9cd6d844bef1a4a78857d949f244181c1abee9e
parent ee8cfbf5db9f008152d0cf37a5fd45e3a95aea08
Author: Matt Demanett <matt@demanett.net>
Date: Tue, 1 Oct 2019 22:26:24 -0400
POLY: MIX1.
Diffstat:
4 files changed, 60 insertions(+), 26 deletions(-)
diff --git a/src/Mix1.cpp b/src/Mix1.cpp
@@ -2,12 +2,52 @@
#include "Mix1.hpp"
void Mix1::sampleRateChange() {
- _channel->setSampleRate(APP->engine->getSampleRate());
+ float sr = APP->engine->getSampleRate();
+ for (int c = 0; c < _channels; ++c) {
+ _engines[c]->setSampleRate(sr);
+ }
+}
+
+bool Mix1::active() {
+ return outputs[OUT_OUTPUT].isConnected();
+}
+
+int Mix1::channels() {
+ return inputs[IN_INPUT].getChannels();
+}
+
+void Mix1::addEngine(int c) {
+ _engines[c] = new MixerChannel(
+ params[LEVEL_PARAM],
+ params[LEVEL_PARAM], // not used
+ params[MUTE_PARAM],
+ inputs[LEVEL_INPUT],
+ inputs[LEVEL_INPUT], // not used
+ 1000.0f,
+ &inputs[MUTE_INPUT]
+ );
+ _engines[c]->setSampleRate(APP->engine->getSampleRate());
+}
+
+void Mix1::removeEngine(int c) {
+ delete _engines[c];
+ _engines[c] = NULL;
+}
+
+void Mix1::always(const ProcessArgs& args) {
+ _rmsSum = 0.0f;
+}
+
+void Mix1::processChannel(const ProcessArgs& args, int c) {
+ MixerChannel& e = *_engines[c];
+ e.next(inputs[IN_INPUT].getVoltage(c), false, false, c);
+ _rmsSum += e.rms;
+ outputs[OUT_OUTPUT].setChannels(_channels);
+ outputs[OUT_OUTPUT].setVoltage(e.out, c);
}
-void Mix1::processChannel(const ProcessArgs& args, int _c) {
- _channel->next(inputs[IN_INPUT].getVoltageSum(), false, false);
- outputs[OUT_OUTPUT].setVoltage(_channel->out);
+void Mix1::postProcess(const ProcessArgs& args) {
+ _rms = _rmsSum / (float)_channels;
}
struct Mix1Widget : ModuleWidget {
@@ -41,7 +81,7 @@ struct Mix1Widget : ModuleWidget {
{
auto slider = createParam<VUSlider151>(levelParamPosition, module, Mix1::LEVEL_PARAM);
if (module) {
- dynamic_cast<VUSlider*>(slider)->setVULevel(&module->_channel->rms);
+ dynamic_cast<VUSlider*>(slider)->setVULevel(&module->_rms);
}
addParam(slider);
}
diff --git a/src/Mix1.hpp b/src/Mix1.hpp
@@ -33,30 +33,24 @@ struct Mix1 : BGModule {
NUM_LIGHTS
};
- MixerChannel* _channel = NULL;
+ MixerChannel* _engines[maxChannels] {};
+ float _rmsSum = 0.0f;
+ float _rms = 0.0f;
Mix1() {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
configParam(LEVEL_PARAM, 0.0f, 1.0f, fabsf(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels), "Level", "dB", 0.0f, MixerChannel::maxDecibels - MixerChannel::minDecibels, MixerChannel::minDecibels);
configParam(MUTE_PARAM, 0.0f, 1.0f, 0.0f, "Mute");
-
- _channel = new MixerChannel(
- params[LEVEL_PARAM],
- params[LEVEL_PARAM], // not used
- params[MUTE_PARAM],
- inputs[LEVEL_INPUT],
- inputs[LEVEL_INPUT], // not used
- 1000.0f,
- &inputs[MUTE_INPUT]
- );
- sampleRateChange();
- }
- virtual ~Mix1() {
- delete _channel;
}
void sampleRateChange() override;
- void processChannel(const ProcessArgs& args, int _c) override;
+ bool active() override;
+ int channels() override;
+ void addEngine(int c) override;
+ void removeEngine(int c) override;
+ void always(const ProcessArgs& args) override;
+ void processChannel(const ProcessArgs& args, int c) override;
+ void postProcess(const ProcessArgs& args) override;
};
} // namespace bogaudio
diff --git a/src/mixer.cpp b/src/mixer.cpp
@@ -12,10 +12,10 @@ void MixerChannel::setSampleRate(float sampleRate) {
_rms.setSampleRate(sampleRate);
}
-void MixerChannel::next(float sample, bool stereo, bool solo) {
+void MixerChannel::next(float sample, bool stereo, bool solo, int c) {
float mute = _muteParam.getValue();
if (_muteInput) {
- mute += clamp(_muteInput->getVoltage(), 0.0f, 10.0f);
+ mute += clamp(_muteInput->getPolyVoltage(c), 0.0f, 10.0f);
}
bool muted = solo ? mute < 2.0f : mute > 0.5f;
if (muted) {
@@ -24,7 +24,7 @@ void MixerChannel::next(float sample, bool stereo, bool solo) {
else {
float level = clamp(_levelParam.getValue(), 0.0f, 1.0f);
if (_levelInput.isConnected()) {
- level *= clamp(_levelInput.getVoltage() / 10.0f, 0.0f, 1.0f);
+ level *= clamp(_levelInput.getPolyVoltage(c) / 10.0f, 0.0f, 1.0f);
}
level *= maxDecibels - minDecibels;
level += minDecibels;
@@ -36,7 +36,7 @@ void MixerChannel::next(float sample, bool stereo, bool solo) {
if (stereo) {
float pan = clamp(_panParam.getValue(), -1.0f, 1.0f);
if (_panInput.isConnected()) {
- pan *= clamp(_panInput.getVoltage() / 5.0f, -1.0f, 1.0f);
+ pan *= clamp(_panInput.getPolyVoltage(c) / 5.0f, -1.0f, 1.0f);
}
_panner.setPan(_panSL.next(pan));
_panner.next(out, left, right);
diff --git a/src/mixer.hpp b/src/mixer.hpp
@@ -52,7 +52,7 @@ struct MixerChannel {
}
void setSampleRate(float sampleRate);
- void next(float sample, bool stereo, bool solo); // outputs on out, left, right, rms.
+ void next(float sample, bool stereo, bool solo, int c = 0); // outputs on out, left, right, rms.
};
struct MuteButton : ToggleButton {