Skip to content

Commit ec206fe

Browse files
committed
Working on crossover setup
1 parent 43c4e15 commit ec206fe

10 files changed

Lines changed: 350 additions & 53 deletions

File tree

include/private/meta/deesser.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,17 @@ namespace lsp
7878
static constexpr float REACT_TIME_DFL = 0.200f;
7979
static constexpr float REACT_TIME_STEP = 0.001f;
8080

81+
static constexpr float SPLIT_FREQ_MIN = 500.0f;
82+
static constexpr float SPLIT_FREQ_MAX = 4000.0f;
83+
static constexpr float SPLIT_FREQ_DFL = 1000.0f;
84+
static constexpr float SPLIT_FREQ_STEP = 0.002f;
85+
8186
static constexpr size_t FFT_MESH_POINTS = 640;
82-
static constexpr size_t FFT_RANK = 13;
83-
static constexpr size_t FFT_ITEMS = 1 << FFT_RANK;
87+
static constexpr size_t FFT_ANALYSIS_RANK = 13;
88+
static constexpr size_t FFT_ANALYSIS_ITEMS = 1 << FFT_ANALYSIS_RANK;
8489
static constexpr size_t REFRESH_RATE = 20;
90+
static constexpr size_t FFT_XOVER_RANK_MIN = 12;
91+
static constexpr size_t FFT_XOVER_FREQ_MIN = 44100;
8592
} deesser;
8693

8794
// Plugin type metadata

include/private/plugins/deesser.h

Lines changed: 72 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,12 @@
2323
#define PRIVATE_PLUGINS_DEESSER_H_
2424

2525
#include <lsp-plug.in/dsp-units/ctl/Bypass.h>
26+
#include <lsp-plug.in/dsp-units/filters/DynamicFilters.h>
2627
#include <lsp-plug.in/dsp-units/filters/Equalizer.h>
2728
#include <lsp-plug.in/dsp-units/util/Analyzer.h>
29+
#include <lsp-plug.in/dsp-units/util/Crossover.h>
2830
#include <lsp-plug.in/dsp-units/util/Delay.h>
31+
#include <lsp-plug.in/dsp-units/util/FFTCrossover.h>
2932
#include <lsp-plug.in/plug-fw/plug.h>
3033
#include <private/meta/deesser.h>
3134

@@ -56,6 +59,13 @@ namespace lsp
5659
SCM_SYNC_ALL = (SCM_OUT_MESH << 1) - 1
5760
};
5861

62+
enum sc_xover_mode_t
63+
{
64+
XOVER_NONE,
65+
XOVER_CLASSIC,
66+
XOVER_MODERN,
67+
XOVER_LINEAR_PHASE
68+
};
5969

6070
typedef struct premix_t
6171
{
@@ -83,6 +93,22 @@ namespace lsp
8393
plug::IPort *pScToLink; // Sidechain -> Link mix
8494
} premix_t;
8595

96+
typedef struct crossover_t
97+
{
98+
uint32_t nMode; // Work mode
99+
uint32_t nSlope; // Slope
100+
float fFreq; // Split frequency
101+
102+
float *vLoBand; // Characteristics of the low band
103+
float *vHiBand; // Characteristics of the high band
104+
105+
plug::IPort *pMode; // Crossover mode
106+
plug::IPort *pSlope; // Crossover slope
107+
plug::IPort *pFreq; // Crossover frequency
108+
plug::IPort *pLink; // Crossover split linkage
109+
plug::IPort *pMesh; // Transfer function
110+
} crossover_t;
111+
86112
typedef struct preeq_t
87113
{
88114
uint32_t nSyncMesh; // Synchronize mesh
@@ -118,50 +144,59 @@ namespace lsp
118144
typedef struct channel_t
119145
{
120146
// DSP processing modules
121-
dspu::Bypass sBypass; // Bypass
122-
dspu::Equalizer sSCEq; // Sidechain equalizer
147+
dspu::Bypass sBypass; // Bypass
148+
dspu::Equalizer sSCEq; // Sidechain equalizer
149+
dspu::Crossover sXOver; // Crossover
150+
dspu::FFTCrossover sFFTXOver; // FFT crossover
151+
152+
float *vIn; // Input signal
153+
float *vOut; // Output signal
154+
float *vScIn; // Sidechain signal
155+
float *vShmIn; // Shared memory link signal
123156

124-
float *vIn; // Input signal
125-
float *vOut; // Output signal
126-
float *vScIn; // Sidechain signal
127-
float *vShmIn; // Shared memory link signal
157+
float *vBuffer; // Buffer for data
128158

129159
// Input ports
130-
plug::IPort *pIn; // Input port
131-
plug::IPort *pOut; // Output port
132-
plug::IPort *pScIn; // Sidechain port
133-
plug::IPort *pShmIn; // Shared memory link input
160+
plug::IPort *pIn; // Input port
161+
plug::IPort *pOut; // Output port
162+
plug::IPort *pScIn; // Sidechain port
163+
plug::IPort *pShmIn; // Shared memory link input
134164
} channel_t;
135165

136166
protected:
137-
size_t nChannels; // Number of channels
138-
channel_t *vChannels; // Delay channels
139-
float *vBuffer; // Temporary buffer for audio processing
140-
bool bSidechain; // Sidechain version
167+
size_t nChannels; // Number of channels
168+
channel_t *vChannels; // Delay channels
169+
float *vBuffer; // Temporary buffer for audio processing
170+
bool bSidechain; // Sidechain version
141171

142-
dspu::Analyzer sAnalyzer; // Analyzer
172+
dspu::DynamicFilters sFilters; // Dynamic filters
173+
dspu::Analyzer sAnalyzer; // Analyzer
143174

144-
premix_t sPremix; // Premix settings
145-
analysis_t sAnalysis; // Analyzer parameters
146-
preeq_t sPreEq; // Pre-equalization settings
175+
premix_t sPremix; // Premix settings
176+
analysis_t sAnalysis; // Analyzer parameters
177+
crossover_t sXOver; // Crossover settings
178+
preeq_t sPreEq; // Pre-equalization settings
147179

148-
plug::IPort *pBypass; // Bypass
149-
plug::IPort *pGainIn; // Input gain
150-
plug::IPort *pGainOut; // Output gain
180+
plug::IPort *pBypass; // Bypass
181+
plug::IPort *pGainIn; // Input gain
182+
plug::IPort *pGainOut; // Output gain
151183

152-
uint8_t *pData; // Allocated data
184+
uint8_t *pData; // Allocated data
153185

154186
protected:
155-
static bool set_filter_params(dspu::Equalizer * eq, uint32_t index, const dspu::filter_params_t * fp);
187+
static bool set_filter_params(dspu::Equalizer * eq, uint32_t index, const dspu::filter_params_t * fp);
188+
static void process_band(void *object, void *subject, size_t band, const float *data, size_t sample, size_t count);
189+
static size_t select_fft_rank(size_t sample_rate);
156190

157191
protected:
158-
void do_destroy();
159-
void update_premix();
160-
void update_analyzer();
161-
void update_preeq();
162-
void bind_input_channels();
163-
void premix_channel(uint32_t channel, size_t count);
164-
void output_preeq_meshes();
192+
void do_destroy();
193+
void update_premix();
194+
void update_analyzer();
195+
void update_preeq();
196+
void update_xover();
197+
void bind_input_channels();
198+
void premix_channel(uint32_t channel, size_t count);
199+
void output_preeq_meshes();
165200

166201
public:
167202
explicit deesser(const meta::plugin_t *meta);
@@ -172,15 +207,15 @@ namespace lsp
172207
deesser & operator = (const deesser &) = delete;
173208
deesser & operator = (deesser &&) = delete;
174209

175-
virtual void init(plug::IWrapper *wrapper, plug::IPort **ports) override;
176-
virtual void destroy() override;
210+
virtual void init(plug::IWrapper *wrapper, plug::IPort **ports) override;
211+
virtual void destroy() override;
177212

178213
public:
179-
virtual void update_sample_rate(long sr) override;
180-
virtual void update_settings() override;
181-
virtual void process(size_t samples) override;
182-
virtual void ui_activated() override;
183-
virtual void dump(dspu::IStateDumper *v) const override;
214+
virtual void update_sample_rate(long sr) override;
215+
virtual void update_settings() override;
216+
virtual void process(size_t samples) override;
217+
virtual void ui_activated() override;
218+
virtual void dump(dspu::IStateDumper *v) const override;
184219
};
185220

186221
} /* namespace plugins */

res/main/i18n/default/bundles.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
{
22
"deesser": {
3-
"name": "Plugin Template",
4-
"description": "TODO: write description"
3+
"description": "TODO: write description",
4+
"name": "Deesser"
55
},
66

77
"launcher": {
88
"deesser_mono": "Mono",
9-
"deesser_stereo": "Stereo"
9+
"deesser_stereo": "Stereo",
10+
"sc_deesser_mono": "SC Mono",
11+
"sc_deesser_stereo": "SC Stereo"
1012
}
1113
}
1214

res/main/i18n/default/lists.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"deesser": {
3+
"modes": {
4+
"classic": "Classic",
5+
"linear_phase": "Linear Phase",
6+
"modern": "Modern",
7+
"off": "Off"
8+
},
9+
"slope": {
10+
"12dbo": "LR2 (12 dB/oct)",
11+
"24dbo": "LR4 (24 dB/oct)",
12+
"48dbo": "LR8 (48 dB/oct)"
13+
}
14+
}
15+
}

res/main/i18n/ru/bundles.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"deesser": {
3+
"description": "TODO: write description",
4+
"name": "Деэссер"
5+
},
6+
7+
"launcher": {
8+
"deesser_mono": "Моно",
9+
"deesser_stereo": "Стерео",
10+
"sc_deesser_mono": "БЦ Моно",
11+
"sc_deesser_stereo": "БЦ Стерео"
12+
}
13+
}
14+

res/main/i18n/ru/lists.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"deesser": {
3+
"modes": {
4+
"classic": "Классический",
5+
"linear_phase": "Линейная фаза",
6+
"modern": "Современный",
7+
"off": "Выключен"
8+
},
9+
"slope": {
10+
"12dbo": "LR2 (12 dB/oct)",
11+
"24dbo": "LR4 (24 dB/oct)",
12+
"48dbo": "LR8 (48 dB/oct)"
13+
}
14+
}
15+
}

res/main/i18n/us/bundles.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
{
22
"deesser": {
3-
"name": "Plugin Template",
4-
"description": "TODO: write description"
3+
"description": "TODO: write description",
4+
"name": "Deesser"
55
},
66

77
"launcher": {
88
"deesser_mono": "Mono",
9-
"deesser_stereo": "Stereo"
9+
"deesser_stereo": "Stereo",
10+
"sc_deesser_mono": "SC Mono",
11+
"sc_deesser_stereo": "SC Stereo"
1012
}
1113
}
1214

res/main/i18n/us/lists.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"deesser": {
3+
"modes": {
4+
"classic": "Classic",
5+
"linear_phase": "Linear Phase",
6+
"modern": "Modern",
7+
"off": "Off"
8+
},
9+
"slope": {
10+
"12dbo": "LR2 (12 dB/oct)",
11+
"24dbo": "LR4 (24 dB/oct)",
12+
"48dbo": "LR8 (48 dB/oct)"
13+
}
14+
}
15+
}

src/main/meta/deesser.cpp

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,28 @@ namespace lsp
4343
// Plugin metadata
4444
static const port_item_t de_pf_filter_slope[] =
4545
{
46-
{ "off", "eq.slope.off" },
47-
{ "12 dB/oct", "eq.slope.12dbo" },
48-
{ "24 dB/oct", "eq.slope.24dbo" },
49-
{ "36 dB/oct", "eq.slope.36dbo" },
50-
{ "48 dB/oct", "eq.slope.48dbo" },
46+
{ "off", "eq.slope.off" },
47+
{ "12 dB/oct", "eq.slope.12dbo" },
48+
{ "24 dB/oct", "eq.slope.24dbo" },
49+
{ "36 dB/oct", "eq.slope.36dbo" },
50+
{ "48 dB/oct", "eq.slope.48dbo" },
51+
{ NULL, NULL }
52+
};
53+
54+
static const port_item_t de_split_modes[] =
55+
{
56+
{ "Classic", "deesser.modes.off" },
57+
{ "Classic", "deesser.modes.classic" },
58+
{ "Modern", "deesser.modes.modern" },
59+
{ "Linear Phase", "deesser.modes.linear_phase" },
60+
{ NULL, NULL }
61+
};
62+
63+
static const port_item_t de_slopes[] =
64+
{
65+
{ "LR2 (12 dB/oct)", "deesser.slope.12dbo" },
66+
{ "LR4 (24 dB/oct)", "deesser.slope.24dbo" },
67+
{ "LR8 (48 dB/oct)", "deesser.slope.48dbo" },
5168
{ NULL, NULL }
5269
};
5370

@@ -92,6 +109,13 @@ namespace lsp
92109
AMP_GAIN("shift", "Shift gain", "Shift", 1.0f, 100.0f), \
93110
MESH("fftg", "FFT analysis graph", 1 + channels*2, deesser::FFT_MESH_POINTS + 2)
94111

112+
#define DE_CROSSOVER(channels) \
113+
COMBO("split", "Enable frequency split", "Split", 2, de_split_modes), \
114+
COMBO("slope", "Frequency split slope", "Slope", 2, de_slopes), \
115+
LOG_CONTROL("split_f", "Split frequency", "Split freq", U_HZ, deesser::SPLIT_FREQ), \
116+
PERCENTS("xlink", "Crossover linkage", "Split link", 0.0f, 0.001f), \
117+
MESH("rgain", "Reduction gain chart", 1 + channels, deesser::FFT_MESH_POINTS + 4)
118+
95119
#define DE_COMMON \
96120
BYPASS, \
97121
IN_GAIN, \
@@ -106,6 +130,7 @@ namespace lsp
106130
DE_COMMON,
107131
DE_PREMIX,
108132
DE_ANALYSIS(1),
133+
DE_CROSSOVER(1),
109134
DE_FILTERS,
110135

111136
PORTS_END
@@ -118,6 +143,7 @@ namespace lsp
118143
DE_COMMON,
119144
DE_PREMIX,
120145
DE_ANALYSIS(2),
146+
DE_CROSSOVER(2),
121147
DE_FILTERS,
122148

123149
PORTS_END
@@ -131,6 +157,7 @@ namespace lsp
131157
DE_COMMON,
132158
DE_SC_PREMIX,
133159
DE_ANALYSIS(1),
160+
DE_CROSSOVER(1),
134161
DE_FILTERS,
135162

136163
PORTS_END
@@ -144,6 +171,7 @@ namespace lsp
144171
DE_COMMON,
145172
DE_SC_PREMIX,
146173
DE_ANALYSIS(2),
174+
DE_CROSSOVER(2),
147175
DE_FILTERS,
148176

149177
PORTS_END

0 commit comments

Comments
 (0)