diff --git a/src/ParameterStore.cpp b/src/ParameterStore.cpp index 875d11f..b06c428 100644 --- a/src/ParameterStore.cpp +++ b/src/ParameterStore.cpp @@ -9,9 +9,10 @@ void ParameterStore::set(ParamId id, float value) { values_[static_cast(id)].store(value, std::memory_order_relaxed); } -void ParameterStore::set(EnvelopeId id, float a, float d, float s, float r) { +void ParameterStore::set(EnvelopeId id, float depth, float a, float d, float s, float r) { EnvelopeParam params = ENV_PARAMS[static_cast(id)]; + set(params.depth, depth); set(params.a, a); set(params.d, d); set(params.s, s); diff --git a/src/ParameterStore.h b/src/ParameterStore.h index 07eb532..30c1d40 100644 --- a/src/ParameterStore.h +++ b/src/ParameterStore.h @@ -9,17 +9,17 @@ enum class ParamId : uint16_t { Osc1Frequency, Osc1WaveSelector1, Osc1WaveSelector2, - Osc1Volume, + Osc1VolumeDepth, Osc1VolumeEnvA, Osc1VolumeEnvD, Osc1VolumeEnvS, Osc1VolumeEnvR, - FilterCutoff, + FilterCutoffDepth, FilterCutoffEnvA, FilterCutoffEnvD, FilterCutoffEnvS, FilterCutoffEnvR, - FilterResonance, + FilterResonanceDepth, FilterResonanceEnvA, FilterResonanceEnvD, FilterResonanceEnvS, @@ -39,6 +39,7 @@ enum class EnvelopeId : uint16_t { }; struct EnvelopeParam { + ParamId depth; ParamId a; ParamId d; ParamId s; @@ -46,11 +47,11 @@ struct EnvelopeParam { }; constexpr std::array(EnvelopeId::Count)> ENV_PARAMS {{ - { ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvD, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc1Volume - { ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvD, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc2Volume (not implemented) - { ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvD, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc3Volume (not implemented) - { ParamId::FilterCutoffEnvA, ParamId::FilterCutoffEnvD, ParamId::FilterCutoffEnvS, ParamId::FilterCutoffEnvR }, // FilterCutoff - { ParamId::FilterResonanceEnvA, ParamId::FilterResonanceEnvD, ParamId::FilterResonanceEnvS, ParamId::FilterResonanceEnvR }, // FilterResonance + { ParamId::Osc1VolumeDepth, ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvD, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc1Volume + { ParamId::Osc1VolumeDepth, ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvD, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc2Volume (not implemented) + { ParamId::Osc1VolumeDepth, ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvD, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc3Volume (not implemented) + { ParamId::FilterCutoffDepth, ParamId::FilterCutoffEnvA, ParamId::FilterCutoffEnvD, ParamId::FilterCutoffEnvS, ParamId::FilterCutoffEnvR }, // FilterCutoff + { ParamId::FilterResonanceDepth, ParamId::FilterResonanceEnvA, ParamId::FilterResonanceEnvD, ParamId::FilterResonanceEnvS, ParamId::FilterResonanceEnvR }, // FilterResonance }}; struct ParamDefault { @@ -65,17 +66,17 @@ constexpr std::array(ParamId::Count)> PARAM_DE { 100.0f, 20.0f, 600.0f}, // Osc1Freq { 0.0f, 0.0f, 0.0f}, // Osc1WaveSelector1 { 1.0f, 0.0f, 0.0f}, // Osc1WaveSelector2 - { 1.0f, 0.0f, 2.0f}, // Osc1Volume + { 1.0f, 0.0f, 2.0f}, // Osc1VolumeDepth { 0.05f, 0.0f, 2.0f}, // Osc1VolumeEnvA { 0.2f, 0.0f, 2.0f}, // Osc1VolumeEnvD { 0.7f, 0.0f, 1.0f}, // Osc1VolumeEnvS { 0.2f, 0.0f, 2.0f}, // Osc1VolumeEnvR - { 1.0f, 0.0f, 8.0f}, // FilterCutoff + { 1.0f, 0.0f, 8.0f}, // FilterCutoffDepth { 0.05f, 0.0f, 2.0f}, // FilterCutoffEnvA { 0.05f, 0.0f, 2.0f}, // FilterCutoffEnvD { 2.0f, 0.0f, 1.0f}, // FilterCutoffEnvS { 0.05f, 0.0f, 2.0f}, // FilterCutoffEnvR - { 1.414f, 0.0f, 8.0f}, // FilterResonance + { 1.414f, 0.0f, 8.0f}, // FilterResonanceDepth { 0.05f, 0.0f, 2.0f}, // FilterResonanceEnvA { 0.05f, 0.0f, 2.0f}, // FilterResonanceEnvD { 0.5f, 0.0f, 1.0f}, // FilterResonanceEnvS @@ -93,7 +94,7 @@ public: void set(ParamId id, float value); void set(ParamId id, int32_t value) { set(id, static_cast(value)); } - void set(EnvelopeId, float a, float d, float s, float r); + void set(EnvelopeId id, float depth, float a, float d, float s, float r); float get(ParamId id) const; int32_t getInt(ParamId id) const { return static_cast(get(id)); } void resetToDefaults(); diff --git a/src/synth/Synth.cpp b/src/synth/Synth.cpp index 8baf613..700c658 100644 --- a/src/synth/Synth.cpp +++ b/src/synth/Synth.cpp @@ -107,7 +107,7 @@ void Synth::process(float* out, uint32_t nFrames, uint32_t sampleRate) { float pitchOffset = 0.5f; float phaseInc = pitchOffset * 2.0f * M_PI * frequency_ / static_cast(sampleRate); - float gain = gainEnv * getParam(ParamId::Osc1Volume); + float gain = gainEnv * getParam(ParamId::Osc1VolumeDepth); // sample generation // TODO: wavetables @@ -135,8 +135,8 @@ void Synth::process(float* out, uint32_t nFrames, uint32_t sampleRate) { } // filter sample - float cutoffFreq = cutoffEnv * pow(2.0f, getParam(ParamId::FilterCutoff)) * frequency_; - filter_.setParams(Filter::Type::BiquadLowpass, cutoffFreq, resonanceEnv * getParam(ParamId::FilterResonance)); + float cutoffFreq = cutoffEnv * pow(2.0f, getParam(ParamId::FilterCutoffDepth)) * frequency_; + filter_.setParams(Filter::Type::BiquadLowpass, cutoffFreq, resonanceEnv * getParam(ParamId::FilterResonanceDepth)); sampleOut = filter_.biquadProcess(sampleOut); // write to buffer diff --git a/src/ui/MainWindow.cpp b/src/ui/MainWindow.cpp index 9b52f39..b382e0b 100644 --- a/src/ui/MainWindow.cpp +++ b/src/ui/MainWindow.cpp @@ -24,16 +24,16 @@ MainWindow::MainWindow(QWidget *parent) : // connect envelopeGenerators connect(ui_->envelopeOsc1Volume, &EnvelopeGenerator::envelopeChanged, - this, [this](float a, float d, float s, float r) { - audio_->parameters()->set(EnvelopeId::Osc1Volume, a, d, s, r); + this, [this](float depth, float a, float d, float s, float r) { + audio_->parameters()->set(EnvelopeId::Osc1Volume, depth, a, d, s, r); }); connect(ui_->envelopeFilterCutoff, &EnvelopeGenerator::envelopeChanged, - this, [this](float a, float d, float s, float r) { - audio_->parameters()->set(EnvelopeId::FilterCutoff, a, d, s, r); + this, [this](float depth, float a, float d, float s, float r) { + audio_->parameters()->set(EnvelopeId::FilterCutoff, depth, a, d, s, r); }); connect(ui_->envelopeFilterResonance, &EnvelopeGenerator::envelopeChanged, - this, [this](float a, float d, float s, float r) { - audio_->parameters()->set(EnvelopeId::FilterResonance, a, d, s, r); + this, [this](float depth, float a, float d, float s, float r) { + audio_->parameters()->set(EnvelopeId::FilterResonance, depth, a, d, s, r); }); // this should be easy enough to put into a for each envelopeGenerator loop, each ui element just needs an EnvelopeId specifiers @@ -47,16 +47,6 @@ MainWindow::MainWindow(QWidget *parent) : audio_->parameters()->set(ParamId::Osc1WaveSelector2, index); }); - connect(ui_->sliderOsc1Volume, &SmartSlider::valueChanged, this, [this](float v) { - audio_->parameters()->set(ParamId::Osc1Volume, v); - }); - connect(ui_->sliderFilterCutoff, &SmartSlider::valueChanged, this, [this](float v) { - audio_->parameters()->set(ParamId::FilterCutoff, v); - }); - connect(ui_->sliderFilterResonance, &SmartSlider::valueChanged, this, [this](float v) { - audio_->parameters()->set(ParamId::FilterResonance, v); - }); - // synth business audio_->start(); @@ -87,11 +77,4 @@ void MainWindow::onResetClicked() { ui_->comboOsc1WaveSelector1->setCurrentIndex(static_cast(PARAM_DEFS[static_cast(ParamId::Osc1WaveSelector1)].def)); ui_->comboOsc1WaveSelector2->setCurrentIndex(static_cast(PARAM_DEFS[static_cast(ParamId::Osc1WaveSelector2)].def)); - // misc sliders - ui_->sliderOsc1Volume->setRange(PARAM_DEFS[static_cast(ParamId::Osc1Volume)].min, PARAM_DEFS[static_cast(ParamId::Osc1Volume)].max); - ui_->sliderFilterCutoff->setRange(PARAM_DEFS[static_cast(ParamId::FilterCutoff)].min, PARAM_DEFS[static_cast(ParamId::FilterCutoff)].max); - ui_->sliderFilterResonance->setRange(PARAM_DEFS[static_cast(ParamId::FilterResonance)].min, PARAM_DEFS[static_cast(ParamId::FilterResonance)].max); - ui_->sliderOsc1Volume->setValue(PARAM_DEFS[static_cast(ParamId::Osc1Volume)].def); - ui_->sliderFilterCutoff->setValue(PARAM_DEFS[static_cast(ParamId::FilterCutoff)].def); - ui_->sliderFilterResonance->setValue(PARAM_DEFS[static_cast(ParamId::FilterResonance)].def); } diff --git a/src/ui/MainWindow.ui b/src/ui/MainWindow.ui index 7eaa169..b6f703b 100644 --- a/src/ui/MainWindow.ui +++ b/src/ui/MainWindow.ui @@ -6,8 +6,8 @@ 0 0 - 940 - 658 + 1102 + 564 @@ -39,8 +39,8 @@ 20 - 360 - 300 + 260 + 350 300 @@ -54,7 +54,7 @@ - 270 + 360 20 400 200 @@ -67,9 +67,9 @@ - 320 - 360 - 300 + 380 + 260 + 350 300 @@ -83,9 +83,9 @@ - 620 - 360 - 300 + 740 + 260 + 350 300 @@ -99,8 +99,8 @@ - 110 - 330 + 140 + 230 101 16 @@ -120,8 +120,8 @@ - 420 - 330 + 500 + 230 101 16 @@ -141,8 +141,8 @@ - 710 - 330 + 860 + 230 121 16 @@ -261,108 +261,6 @@ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - 770 - 30 - 65 - 280 - - - - true - - - - - - 700 - 30 - 65 - 280 - - - - true - - - - - - 840 - 30 - 65 - 280 - - - - true - - - - - - 690 - 10 - 91 - 16 - - - - - 8 - - - - Volume - - - Qt::AlignmentFlag::AlignCenter - - - - - - 760 - 10 - 81 - 16 - - - - - 8 - - - - Cutoff - - - Qt::AlignmentFlag::AlignCenter - - - - - - 830 - 10 - 81 - 16 - - - - - 8 - - - - Resonance - - - Qt::AlignmentFlag::AlignCenter - - @@ -372,12 +270,6 @@
EnvelopeGenerator/EnvelopeGenerator.h
1 - - SmartSlider - QWidget -
SmartSlider/SmartSlider.h
- 1 -
Scope QWidget diff --git a/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.cpp b/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.cpp index 7d6577d..21ec020 100644 --- a/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.cpp +++ b/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.cpp @@ -15,6 +15,7 @@ EnvelopeGenerator::EnvelopeGenerator(QWidget* parent) : QWidget(parent), ui_(new this, &EnvelopeGenerator::emitEnvelope); }; + connectSlider(ui_->sliderDepth); connectSlider(ui_->sliderAttack); connectSlider(ui_->sliderDecay); connectSlider(ui_->sliderSustain); @@ -26,6 +27,10 @@ EnvelopeGenerator::~EnvelopeGenerator() { } // getters are here to separate ui from header +float EnvelopeGenerator::depth() const { + return ui_->sliderDepth->value(); +} + float EnvelopeGenerator::attack() const { return ui_->sliderAttack->value(); } @@ -42,6 +47,10 @@ float EnvelopeGenerator::release() const { return ui_->sliderRelease->value(); } +void EnvelopeGenerator::setDepth(float v) { + ui_->sliderDepth->setValue(v); +} + void EnvelopeGenerator::setAttack(float v) { ui_->sliderAttack->setValue(v); } @@ -60,6 +69,7 @@ void EnvelopeGenerator::setRelease(float v) { void EnvelopeGenerator::emitEnvelope() { emit envelopeChanged( + depth(), attack(), decay(), sustain(), @@ -71,11 +81,13 @@ void EnvelopeGenerator::init(EnvelopeId id) { EnvelopeParam params = ENV_PARAMS[static_cast(id)]; + ui_->sliderDepth->setRange(PARAM_DEFS[static_cast(params.depth)].min, PARAM_DEFS[static_cast(params.depth)].max); ui_->sliderAttack->setRange(PARAM_DEFS[static_cast(params.a)].min, PARAM_DEFS[static_cast(params.a)].max); ui_->sliderDecay->setRange(PARAM_DEFS[static_cast(params.d)].min, PARAM_DEFS[static_cast(params.d)].max); ui_->sliderSustain->setRange(PARAM_DEFS[static_cast(params.s)].min, PARAM_DEFS[static_cast(params.s)].max); ui_->sliderRelease->setRange(PARAM_DEFS[static_cast(params.r)].min, PARAM_DEFS[static_cast(params.r)].max); + setDepth(PARAM_DEFS[static_cast(params.depth)].def); setAttack(PARAM_DEFS[static_cast(params.a)].def); setDecay(PARAM_DEFS[static_cast(params.d)].def); setSustain(PARAM_DEFS[static_cast(params.s)].def); diff --git a/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.h b/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.h index 33af889..a412c62 100644 --- a/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.h +++ b/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.h @@ -20,19 +20,21 @@ public: void init(EnvelopeId id); // setters + void setDepth(float v); void setAttack(float v); void setDecay(float v); void setSustain(float v); void setRelease(float v); // getters + float depth() const; float attack() const; float decay() const; float sustain() const; float release() const; signals: - void envelopeChanged(double a, double d, double s, double r); + void envelopeChanged(double depth, double a, double d, double s, double r); private: diff --git a/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.ui b/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.ui index 794d3a4..f8781ac 100644 --- a/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.ui +++ b/src/ui/widgets/EnvelopeGenerator/EnvelopeGenerator.ui @@ -6,8 +6,8 @@ 0 0 - 300 - 300 + 347 + 302
@@ -22,7 +22,7 @@ - 80 + 140 20 65 280 @@ -35,7 +35,7 @@ - 220 + 280 20 65 280 @@ -48,7 +48,7 @@ - 150 + 210 20 65 280 @@ -61,7 +61,7 @@ - 10 + 70 20 65 280 @@ -71,36 +71,10 @@ true - - - - 0 - 290 - 291 - 20 - - - - Qt::Orientation::Horizontal - - - - - - 0 - 10 - 291 - 20 - - - - Qt::Orientation::Horizontal - - - 30 + 90 -10 21 31 @@ -121,7 +95,7 @@ - 100 + 160 -10 21 31 @@ -142,7 +116,7 @@ - 170 + 230 -10 20 31 @@ -163,7 +137,7 @@ - 240 + 300 -10 20 31 @@ -181,6 +155,66 @@ Qt::AlignmentFlag::AlignCenter + + + + 0 + 20 + 65 + 280 + + + + true + + + + + + 0 + 10 + 346 + 20 + + + + Qt::Orientation::Horizontal + + + + + + 0 + 290 + 346 + 20 + + + + Qt::Orientation::Horizontal + + + + + + 0 + -10 + 71 + 31 + + + + + 12 + + + + Depth + + + Qt::AlignmentFlag::AlignCenter + +