Deluge Firmware 1.3.0
Build date: 2025.10.27
Loading...
Searching...
No Matches
compressor_values.h
1#pragma once
2#include "definitions_cxx.hpp"
3#include "dsp/compressor/rms_feedback.h"
4#include "gui/menu_item/decimal.h"
5#include "gui/menu_item/integer.h"
6#include "gui/ui/sound_editor.h"
7#include "model/drum/drum.h"
8#include "model/instrument/kit.h"
9#include "model/mod_controllable/mod_controllable_audio.h"
10#include "model/song/song.h"
11#include "modulation/params/param_set.h"
12#include "processing/sound/sound.h"
13#include "processing/sound/sound_drum.h"
14#include "util/fixedpoint.h"
15
16namespace deluge::gui::menu_item::audio_compressor {
17
19 using DecimalWithoutScrolling::DecimalWithoutScrolling;
20 void readCurrentValue() final {
21 uint64_t value = getCompressorValue();
22 this->setValue(value >> 24);
23 }
24 void writeCurrentValue() final {
25 auto value = this->getValue();
26 if (value >= kMaxKnobPos) {
27 value = kMaxKnobPos - 1;
28 }
29 q31_t knobPos = lshiftAndSaturate<24>(value);
30
31 // If affect-entire button held, do whole kit
32 if (currentUIMode == UI_MODE_HOLDING_AFFECT_ENTIRE_IN_SOUND_EDITOR && soundEditor.editingKitRow()) {
33
34 Kit* kit = getCurrentKit();
35
36 for (Drum* thisDrum = kit->firstDrum; thisDrum != nullptr; thisDrum = thisDrum->next) {
37 if (thisDrum->type == DrumType::SOUND) {
38 auto* soundDrum = static_cast<SoundDrum*>(thisDrum);
39
40 setCompressorValue(knobPos, &soundDrum->compressor);
41 }
42 }
43 }
44 // Or, the normal case of just one sound
45 else {
46 setCompressorValue(knobPos, &soundEditor.currentModControllable->compressor);
47 }
48 }
49 virtual uint64_t getCompressorValue() = 0;
50 virtual void setCompressorValue(q31_t value, deluge::dsp::RMSFeedbackCompressor* compressor) = 0;
51 [[nodiscard]] int32_t getMaxValue() const final { return kMaxKnobPos; }
52 [[nodiscard]] int32_t getNumDecimalPlaces() const override { return 2; }
53 const char* getUnit() override { return "MS"; }
54 [[nodiscard]] RenderingStyle getRenderingStyle() const override { return KNOB; }
55};
56
57class Attack final : public CompressorValue {
58public:
59 using CompressorValue::CompressorValue;
60 uint64_t getCompressorValue() override {
61 return (uint64_t)soundEditor.currentModControllable->compressor.getAttack();
62 }
63 void setCompressorValue(q31_t value, deluge::dsp::RMSFeedbackCompressor* compressor) override {
64 compressor->setAttack(value);
65 }
66 float getDisplayValue() override { return soundEditor.currentModControllable->compressor.getAttackMS(); }
67 [[nodiscard]] RenderingStyle getRenderingStyle() const override { return ATTACK; }
68 void getColumnLabel(StringBuf& label) override { label.append(l10n::get(l10n::String::STRING_FOR_ATTACK_SHORT)); }
69};
70class Release final : public CompressorValue {
71public:
72 using CompressorValue::CompressorValue;
73 uint64_t getCompressorValue() final {
74 return (uint64_t)soundEditor.currentModControllable->compressor.getRelease();
75 }
76 void setCompressorValue(q31_t value, deluge::dsp::RMSFeedbackCompressor* compressor) final {
77 compressor->setRelease(value);
78 }
79 float getDisplayValue() override { return soundEditor.currentModControllable->compressor.getReleaseMS(); }
80 [[nodiscard]] int32_t getNumDecimalPlaces() const override { return 1; }
81 [[nodiscard]] RenderingStyle getRenderingStyle() const override { return RELEASE; }
82
83 void getColumnLabel(StringBuf& label) override { label.append(l10n::get(l10n::String::STRING_FOR_RELEASE_SHORT)); }
84};
85class Ratio final : public CompressorValue {
86public:
87 using CompressorValue::CompressorValue;
88 uint64_t getCompressorValue() override {
89 return (uint64_t)soundEditor.currentModControllable->compressor.getRatio();
90 }
91 void setCompressorValue(q31_t value, deluge::dsp::RMSFeedbackCompressor* compressor) override {
92 compressor->setRatio(value);
93 }
94 float getDisplayValue() override { return soundEditor.currentModControllable->compressor.getRatioForDisplay(); }
95 const char* getUnit() override { return " : 1"; }
96};
97class SideHPF final : public CompressorValue {
98public:
99 using CompressorValue::CompressorValue;
100 uint64_t getCompressorValue() override {
101 return (uint64_t)soundEditor.currentModControllable->compressor.getSidechain();
102 }
103 void setCompressorValue(q31_t value, deluge::dsp::RMSFeedbackCompressor* compressor) override {
104 compressor->setSidechain(value);
105 }
106 float getDisplayValue() override { return soundEditor.currentModControllable->compressor.getSidechainForDisplay(); }
107 const char* getUnit() override { return "HZ"; }
108 [[nodiscard]] RenderingStyle getRenderingStyle() const override { return HPF; }
109};
110class Blend final : public CompressorValue {
111public:
112 using CompressorValue::CompressorValue;
113 uint64_t getCompressorValue() override {
114 return (uint64_t)soundEditor.currentModControllable->compressor.getBlend().raw();
115 }
116 void setCompressorValue(q31_t, dsp::RMSFeedbackCompressor* compressor) override {
117 auto value = this->getValue();
118
119 FixedPoint<31> knobPos = 1.f;
120 if (value < kMaxKnobPos) {
121 knobPos.raw() = lshiftAndSaturate<24>(value);
122 }
123 compressor->setBlend(knobPos);
124 }
125
126 float getDisplayValue() override { return soundEditor.currentModControllable->compressor.getBlendForDisplay(); }
127 const char* getUnit() override { return " %"; }
128 [[nodiscard]] int32_t getNumDecimalPlaces() const override { return 0; }
129 [[nodiscard]] int32_t getColumnSpan() const override { return 1; }
130};
131} // namespace deluge::gui::menu_item::audio_compressor
Definition drum.h:44
Fixed point number with a configurable number of fractional bits.
Definition fixedpoint.h:47
constexpr BaseType raw() const noexcept
Get the internal value.
Definition fixedpoint.h:232
Definition kit.h:34
Definition sound_drum.h:28
Definition d_stringbuf.h:16
Definition rms_feedback.h:27
constexpr int32_t setBlend(FixedPoint< 31 > blend)
Definition rms_feedback.h:158
constexpr int32_t setAttack(q31_t attack)
Definition rms_feedback.h:79
constexpr int32_t setRelease(q31_t release)
Definition rms_feedback.h:96
constexpr int32_t setSidechain(q31_t f)
Definition rms_feedback.h:139
constexpr int32_t setRatio(q31_t rat)
Definition rms_feedback.h:123
Definition compressor_values.h:57
Definition compressor_values.h:110
int32_t getColumnSpan() const override
Get the number of occupied virtual columns in Horizontal menu.
Definition compressor_values.h:129
void readCurrentValue() final
Like readValueAgain, but does not redraw.
Definition compressor_values.h:20
Definition compressor_values.h:85
Definition compressor_values.h:70
Definition compressor_values.h:97