Deluge Firmware
1.3.0
Build date: 2026.08.02
Toggle main menu visibility
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
16
namespace
deluge::gui::menu_item::audio_compressor {
17
18
class
CompressorValue
:
public
DecimalWithoutScrolling
{
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, 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
57
class
Attack
final :
public
CompressorValue
{
58
public
:
59
using
CompressorValue::CompressorValue;
60
uint64_t getCompressorValue()
override
{
61
return
(uint64_t)soundEditor.currentModControllable->compressor.getAttack();
62
}
63
void
setCompressorValue(q31_t value,
RMSFeedbackCompressor
* compressor)
override
{ compressor->
setAttack
(value); }
64
float
getDisplayValue()
override
{
return
soundEditor.currentModControllable->compressor.getAttackMS(); }
65
[[nodiscard]] RenderingStyle getRenderingStyle()
const override
{
return
ATTACK; }
66
void
getColumnLabel(
StringBuf
& label)
override
{ label.append(l10n::get(l10n::String::STRING_FOR_ATTACK_SHORT)); }
67
};
68
class
Release
final :
public
CompressorValue
{
69
public
:
70
using
CompressorValue::CompressorValue;
71
uint64_t getCompressorValue()
final
{
72
return
(uint64_t)soundEditor.currentModControllable->compressor.getRelease();
73
}
74
void
setCompressorValue(q31_t value,
RMSFeedbackCompressor
* compressor)
final
{ compressor->
setRelease
(value); }
75
float
getDisplayValue()
override
{
return
soundEditor.currentModControllable->compressor.getReleaseMS(); }
76
[[nodiscard]] int32_t getNumDecimalPlaces()
const override
{
return
1; }
77
[[nodiscard]] RenderingStyle getRenderingStyle()
const override
{
return
RELEASE; }
78
79
void
getColumnLabel(
StringBuf
& label)
override
{ label.append(l10n::get(l10n::String::STRING_FOR_RELEASE_SHORT)); }
80
};
81
class
Ratio
final :
public
CompressorValue
{
82
public
:
83
using
CompressorValue::CompressorValue;
84
uint64_t getCompressorValue()
override
{
85
return
(uint64_t)soundEditor.currentModControllable->compressor.getRatio();
86
}
87
void
setCompressorValue(q31_t value,
RMSFeedbackCompressor
* compressor)
override
{ compressor->
setRatio
(value); }
88
float
getDisplayValue()
override
{
return
soundEditor.currentModControllable->compressor.getRatioForDisplay(); }
89
const
char
* getUnit()
override
{
return
" : 1"
; }
90
};
91
class
SideHPF
final :
public
CompressorValue
{
92
public
:
93
using
CompressorValue::CompressorValue;
94
uint64_t getCompressorValue()
override
{
95
return
(uint64_t)soundEditor.currentModControllable->compressor.getSidechain();
96
}
97
void
setCompressorValue(q31_t value,
RMSFeedbackCompressor
* compressor)
override
{
98
compressor->
setSidechain
(value);
99
}
100
float
getDisplayValue()
override
{
return
soundEditor.currentModControllable->compressor.getSidechainForDisplay(); }
101
const
char
* getUnit()
override
{
return
"HZ"
; }
102
[[nodiscard]] RenderingStyle getRenderingStyle()
const override
{
return
HPF; }
103
};
104
class
Blend
final :
public
CompressorValue
{
105
public
:
106
using
CompressorValue::CompressorValue;
107
uint64_t getCompressorValue()
final
{
return
(uint64_t)soundEditor.currentModControllable->compressor.getBlend(); }
108
void
setCompressorValue(q31_t,
RMSFeedbackCompressor
* compressor)
final
{
109
auto
value = this->getValue();
110
111
q31_t knobPos;
112
if
(value < kMaxKnobPos) {
113
knobPos = lshiftAndSaturate<24>(value);
114
}
115
else
{
116
knobPos = ONE_Q31;
117
}
118
compressor->
setBlend
(knobPos);
119
}
120
121
float
getDisplayValue()
override
{
return
soundEditor.currentModControllable->compressor.getBlendForDisplay(); }
122
const
char
* getUnit()
override
{
return
" %"
; }
123
[[nodiscard]] int32_t getNumDecimalPlaces()
const override
{
return
0; }
124
[[nodiscard]] int32_t
getOccupiedSlots
()
const override
{
return
1; }
125
};
126
}
// namespace deluge::gui::menu_item::audio_compressor
Drum
Definition
drum.h:44
Kit
Definition
kit.h:34
RMSFeedbackCompressor
Definition
rms_feedback.h:26
RMSFeedbackCompressor::setAttack
constexpr int32_t setAttack(q31_t attack)
Definition
rms_feedback.h:78
RMSFeedbackCompressor::setSidechain
constexpr int32_t setSidechain(q31_t f)
Definition
rms_feedback.h:138
RMSFeedbackCompressor::setRatio
constexpr int32_t setRatio(q31_t rat)
Definition
rms_feedback.h:122
RMSFeedbackCompressor::setRelease
constexpr int32_t setRelease(q31_t release)
Definition
rms_feedback.h:95
RMSFeedbackCompressor::setBlend
constexpr int32_t setBlend(q31_t blend)
Definition
rms_feedback.h:156
SoundDrum
Definition
sound_drum.h:28
StringBuf
Definition
d_stringbuf.h:16
deluge::gui::menu_item::DecimalWithoutScrolling
Definition
decimal.h:51
deluge::gui::menu_item::audio_compressor::Attack
Definition
compressor_values.h:57
deluge::gui::menu_item::audio_compressor::Blend
Definition
compressor_values.h:104
deluge::gui::menu_item::audio_compressor::Blend::getOccupiedSlots
int32_t getOccupiedSlots() const override
Get the number of occupied slots in Horizontal menu.
Definition
compressor_values.h:124
deluge::gui::menu_item::audio_compressor::CompressorValue
Definition
compressor_values.h:18
deluge::gui::menu_item::audio_compressor::CompressorValue::readCurrentValue
void readCurrentValue() final
Like readValueAgain, but does not redraw.
Definition
compressor_values.h:20
deluge::gui::menu_item::audio_compressor::Ratio
Definition
compressor_values.h:81
deluge::gui::menu_item::audio_compressor::Release
Definition
compressor_values.h:68
deluge::gui::menu_item::audio_compressor::SideHPF
Definition
compressor_values.h:91