From ea0c6c1c7bafb74c11051a0884ff943cb9b43f51 Mon Sep 17 00:00:00 2001 From: Markus Schmidt Date: Tue, 27 Oct 2009 06:29:27 +0100 Subject: [PATCH] Sidechain compressor bugs/settings, 3 equalizer (cherry picked from commit 657a80ae2f423cb7f21b8fadcc2bc9cbd8e2c55f) --- plugins/ladspa_effect/calf/calf/metadata.h | 55 +- plugins/ladspa_effect/calf/calf/modulelist.h | 5 +- plugins/ladspa_effect/calf/calf/modules.h | 223 +++- plugins/ladspa_effect/calf/src/modules.cpp | 329 +++-- .../ladspa_effect/calf/src/modules_dsp.cpp | 1133 ++++++++++++++++- 5 files changed, 1553 insertions(+), 192 deletions(-) diff --git a/plugins/ladspa_effect/calf/calf/metadata.h b/plugins/ladspa_effect/calf/calf/metadata.h index 79d440140..6ba14fbf8 100644 --- a/plugins/ladspa_effect/calf/calf/metadata.h +++ b/plugins/ladspa_effect/calf/calf/metadata.h @@ -126,7 +126,7 @@ struct monosynth_metadata: public plugin_metadata }; PLUGIN_NAME_ID_LABEL("monosynth", "monosynth", "Monosynth") }; - + /// Thor's compressor - metadata struct compressor_metadata: public plugin_metadata { @@ -168,6 +168,59 @@ struct multibandcompressor_metadata: public plugin_metadata +{ + enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true }; + enum { param_bypass, param_level_in, param_level_out, param_meter_in, + param_meter_out, param_clip_in, param_clip_out, + param_ls_active, param_ls_level, param_ls_freq, + param_hs_active, param_hs_level, param_hs_freq, + param_p1_active, param_p1_level, param_p1_freq, param_p1_q, + param_p2_active, param_p2_level, param_p2_freq, param_p2_q, + param_p3_active, param_p3_level, param_p3_freq, param_p3_q, + param_count }; + PLUGIN_NAME_ID_LABEL("equalizer5band", "equalizer5band", "Equalizer 5 Band") +}; +/// Markus's 8-band EQ - metadata +struct equalizer8band_metadata: public plugin_metadata +{ + enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true }; + enum { param_bypass, param_level_in, param_level_out, param_meter_inL, param_meter_inR, + param_meter_outL, param_meter_outR, param_clip_inL, param_clip_inR, param_clip_outL, param_clip_outR, + param_hp_active, param_hp_freq, param_hp_mode, + param_lp_active, param_lp_freq, param_lp_mode, + param_ls_active, param_ls_level, param_ls_freq, + param_hs_active, param_hs_level, param_hs_freq, + param_p1_active, param_p1_level, param_p1_freq, param_p1_q, + param_p2_active, param_p2_level, param_p2_freq, param_p2_q, + param_p3_active, param_p3_level, param_p3_freq, param_p3_q, + param_p4_active, param_p4_level, param_p4_freq, param_p4_q, + param_count }; + PLUGIN_NAME_ID_LABEL("equalizer8band", "equalizer8band", "Equalizer 8 Band") +}; +/// Markus's 12-band EQ - metadata +struct equalizer12band_metadata: public plugin_metadata +{ + enum { in_count = 2, out_count = 2, support_midi = false, require_midi = false, rt_capable = true }; + enum { param_bypass, param_level_in, param_level_out, param_meter_inL, param_meter_inR, + param_meter_outL, param_meter_outR, param_clip_inL, param_clip_inR, param_clip_outL, param_clip_outR, + param_hp_active, param_hp_freq, param_hp_mode, + param_lp_active, param_lp_freq, param_lp_mode, + param_ls_active, param_ls_level, param_ls_freq, + param_hs_active, param_hs_level, param_hs_freq, + param_p1_active, param_p1_level, param_p1_freq, param_p1_q, + param_p2_active, param_p2_level, param_p2_freq, param_p2_q, + param_p3_active, param_p3_level, param_p3_freq, param_p3_q, + param_p4_active, param_p4_level, param_p4_freq, param_p4_q, + param_p5_active, param_p5_level, param_p5_freq, param_p5_q, + param_p6_active, param_p6_level, param_p6_freq, param_p6_q, + param_p7_active, param_p7_level, param_p7_freq, param_p7_q, + param_p8_active, param_p8_level, param_p8_freq, param_p8_q, + param_count }; + PLUGIN_NAME_ID_LABEL("equalizer12band", "equalizer12band", "Equalizer 12 Band") +}; + /// Organ - enums for parameter IDs etc. (this mess is caused by organ split between plugin and generic class - which was /// a bad design decision and should be sorted out some day) XXXKF @todo struct organ_enums diff --git a/plugins/ladspa_effect/calf/calf/modulelist.h b/plugins/ladspa_effect/calf/calf/modulelist.h index 904e1b3ba..2fba14b3e 100644 --- a/plugins/ladspa_effect/calf/calf/modulelist.h +++ b/plugins/ladspa_effect/calf/calf/modulelist.h @@ -10,8 +10,11 @@ PER_MODULE_ITEM(phaser, false, "phaser") PER_MODULE_ITEM(multichorus, false, "multichorus") PER_MODULE_ITEM(compressor, false, "compressor") - PER_MODULE_ITEM(multibandcompressor, false, "multibandcompressor") PER_MODULE_ITEM(sidechaincompressor, false, "sidechaincompressor") + PER_MODULE_ITEM(multibandcompressor, false, "multibandcompressor") + PER_MODULE_ITEM(equalizer5band, false, "equalizer5band") + PER_MODULE_ITEM(equalizer8band, false, "equalizer8band") + PER_MODULE_ITEM(equalizer12band, false, "equalizer12band") #ifdef ENABLE_EXPERIMENTAL PER_MODULE_ITEM(fluidsynth, true, "fluidsynth") PER_MODULE_ITEM(wavetable, true, "wavetable") diff --git a/plugins/ladspa_effect/calf/calf/modules.h b/plugins/ladspa_effect/calf/calf/modules.h index f80e6836c..5ba9ffff2 100644 --- a/plugins/ladspa_effect/calf/calf/modules.h +++ b/plugins/ladspa_effect/calf/calf/modules.h @@ -949,7 +949,6 @@ public: virtual int get_changed_offsets(int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline); }; - /// Sidecain Compressor by Markus Schmidt (based on Thor's compressor and Krzysztof's filters) class sidechaincompressor_audio_module: public audio_module, public frequency_response_line_graph { private: @@ -1053,6 +1052,228 @@ public: virtual int get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline); }; +/// Equalizer 12 Band by Markus Schmidt (based on Krzysztof's filters) +class equalizer12band_audio_module: public audio_module, public frequency_response_line_graph { +private: + float hp_mode_old, hp_freq_old; + float lp_mode_old, lp_freq_old; + float ls_level_old, ls_freq_old; + float hs_level_old, hs_freq_old; + float p_level_old[8], p_freq_old[8], p_q_old[8]; + float hp_mode_old1, hp_freq_old1, hp_active_old1; + float lp_mode_old1, lp_freq_old1, lp_active_old1; + float ls_level_old1, ls_freq_old1, ls_active_old1; + float hs_level_old1, hs_freq_old1, hs_active_old1; + float p_level_old1[8], p_freq_old1[8], p_q_old1[8], p_active_old1[8]; + enum CalfEqModes { + MODE12DB, + MODE24DB, + MODE36DB + }; + CalfEqModes eq_mode, eq_mode_old1[2]; + uint32_t clip_inL, clip_outL, clip_inR, clip_outR; + float meter_inL, meter_outL, meter_inR, meter_outR; + biquad_d2 hpL[3], hpR[3], lpL[3], lpR[3]; + biquad_d2 lsL, lsR, hsL, hsR; + biquad_d2 pL[8], pR[8]; +public: + typedef std::complex cfloat; + float *ins[in_count]; + float *outs[out_count]; + float *params[param_count]; + uint32_t srate; + bool is_active; + volatile int last_generation, last_calculated_generation; + equalizer12band_audio_module(); + void activate(); + void deactivate(); + void params_changed(); + float freq_gain(int index, double freq, uint32_t sr) + { + float ret = 1.f; + if(*params[param_hp_active] > 0.f) { + switch((int)*params[param_hp_mode]) { + case MODE12DB: + ret *= hpL[0].freq_gain(freq, sr); + ret *= hpR[0].freq_gain(freq, sr); + break; + case MODE24DB: + ret *= hpL[0].freq_gain(freq, sr) * hpL[0].freq_gain(freq, sr); + ret *= hpR[0].freq_gain(freq, sr) * hpR[0].freq_gain(freq, sr); + break; + case MODE36DB: + ret *= hpL[0].freq_gain(freq, sr) * hpL[0].freq_gain(freq, sr) * hpL[0].freq_gain(freq, sr); + ret *= hpR[0].freq_gain(freq, sr) * hpR[0].freq_gain(freq, sr) * hpR[0].freq_gain(freq, sr); + break; + } + } + if(*params[param_lp_active] > 0.f) { + switch((int)*params[param_lp_mode]) { + case MODE12DB: + ret *= lpL[0].freq_gain(freq, sr); + ret *= lpR[0].freq_gain(freq, sr); + break; + case MODE24DB: + ret *= lpL[0].freq_gain(freq, sr) * lpL[0].freq_gain(freq, sr); + ret *= lpR[0].freq_gain(freq, sr) * lpR[0].freq_gain(freq, sr); + break; + case MODE36DB: + ret *= lpL[0].freq_gain(freq, sr) * lpL[0].freq_gain(freq, sr) * lpL[0].freq_gain(freq, sr); + ret *= lpR[0].freq_gain(freq, sr) * lpR[0].freq_gain(freq, sr) * lpR[0].freq_gain(freq, sr); + break; + } + } + ret *= (*params[param_ls_active] > 0.f) ? lsL.freq_gain(freq, sr) : 1; + ret *= (*params[param_hs_active] > 0.f) ? hsL.freq_gain(freq, sr) : 1; + ret *= (*params[param_p1_active] > 0.f) ? pL[0].freq_gain(freq, sr) : 1; + ret *= (*params[param_p2_active] > 0.f) ? pL[1].freq_gain(freq, sr) : 1; + ret *= (*params[param_p3_active] > 0.f) ? pL[2].freq_gain(freq, sr) : 1; + ret *= (*params[param_p4_active] > 0.f) ? pL[3].freq_gain(freq, sr) : 1; + ret *= (*params[param_p5_active] > 0.f) ? pL[4].freq_gain(freq, sr) : 1; + ret *= (*params[param_p6_active] > 0.f) ? pL[5].freq_gain(freq, sr) : 1; + ret *= (*params[param_p7_active] > 0.f) ? pL[6].freq_gain(freq, sr) : 1; + ret *= (*params[param_p8_active] > 0.f) ? pL[7].freq_gain(freq, sr) : 1; + return ret; + } + void set_sample_rate(uint32_t sr); + uint32_t process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask); + bool get_graph(int index, int subindex, float *data, int points, cairo_iface *context); + bool get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context); + int get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline); +}; + +/// Equalizer 8 Band by Markus Schmidt (based on Krzysztof's filters) +class equalizer8band_audio_module: public audio_module, public frequency_response_line_graph { +private: + float hp_mode_old, hp_freq_old; + float lp_mode_old, lp_freq_old; + float ls_level_old, ls_freq_old; + float hs_level_old, hs_freq_old; + float p_level_old[4], p_freq_old[4], p_q_old[4]; + float hp_mode_old1, hp_freq_old1, hp_active_old1; + float lp_mode_old1, lp_freq_old1, lp_active_old1; + float ls_level_old1, ls_freq_old1, ls_active_old1; + float hs_level_old1, hs_freq_old1, hs_active_old1; + float p_level_old1[4], p_freq_old1[4], p_q_old1[4], p_active_old1[4]; + enum CalfEqModes { + MODE12DB, + MODE24DB, + MODE36DB + }; + CalfEqModes eq_mode, eq_mode_old1[2]; + uint32_t clip_inL, clip_outL, clip_inR, clip_outR; + float meter_inL, meter_outL, meter_inR, meter_outR; + biquad_d2 hpL[3], hpR[3], lpL[3], lpR[3]; + biquad_d2 lsL, lsR, hsL, hsR; + biquad_d2 pL[4], pR[4]; +public: + typedef std::complex cfloat; + float *ins[in_count]; + float *outs[out_count]; + float *params[param_count]; + uint32_t srate; + bool is_active; + volatile int last_generation, last_calculated_generation; + equalizer8band_audio_module(); + void activate(); + void deactivate(); + void params_changed(); + float freq_gain(int index, double freq, uint32_t sr) + { + float ret = 1.f; + if(*params[param_hp_active] > 0.f) { + switch((int)*params[param_hp_mode]) { + case MODE12DB: + ret *= hpL[0].freq_gain(freq, sr); + ret *= hpR[0].freq_gain(freq, sr); + break; + case MODE24DB: + ret *= hpL[0].freq_gain(freq, sr) * hpL[0].freq_gain(freq, sr); + ret *= hpR[0].freq_gain(freq, sr) * hpR[0].freq_gain(freq, sr); + break; + case MODE36DB: + ret *= hpL[0].freq_gain(freq, sr) * hpL[0].freq_gain(freq, sr) * hpL[0].freq_gain(freq, sr); + ret *= hpR[0].freq_gain(freq, sr) * hpR[0].freq_gain(freq, sr) * hpR[0].freq_gain(freq, sr); + break; + } + } + if(*params[param_lp_active] > 0.f) { + switch((int)*params[param_lp_mode]) { + case MODE12DB: + ret *= lpL[0].freq_gain(freq, sr); + ret *= lpR[0].freq_gain(freq, sr); + break; + case MODE24DB: + ret *= lpL[0].freq_gain(freq, sr) * lpL[0].freq_gain(freq, sr); + ret *= lpR[0].freq_gain(freq, sr) * lpR[0].freq_gain(freq, sr); + break; + case MODE36DB: + ret *= lpL[0].freq_gain(freq, sr) * lpL[0].freq_gain(freq, sr) * lpL[0].freq_gain(freq, sr); + ret *= lpR[0].freq_gain(freq, sr) * lpR[0].freq_gain(freq, sr) * lpR[0].freq_gain(freq, sr); + break; + } + } + ret *= (*params[param_ls_active] > 0.f) ? lsL.freq_gain(freq, sr) : 1; + ret *= (*params[param_hs_active] > 0.f) ? hsL.freq_gain(freq, sr) : 1; + ret *= (*params[param_p1_active] > 0.f) ? pL[0].freq_gain(freq, sr) : 1; + ret *= (*params[param_p2_active] > 0.f) ? pL[1].freq_gain(freq, sr) : 1; + ret *= (*params[param_p3_active] > 0.f) ? pL[2].freq_gain(freq, sr) : 1; + ret *= (*params[param_p4_active] > 0.f) ? pL[3].freq_gain(freq, sr) : 1; + return ret; + } + void set_sample_rate(uint32_t sr); + uint32_t process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask); + bool get_graph(int index, int subindex, float *data, int points, cairo_iface *context); + bool get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context); + int get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline); +}; + +/// Equalizer 5 Band by Markus Schmidt (based on Krzysztof's filters) +class equalizer5band_audio_module: public audio_module, public frequency_response_line_graph { +private: + float hp_mode_old, hp_freq_old; + float lp_mode_old, lp_freq_old; + float ls_level_old, ls_freq_old; + float hs_level_old, hs_freq_old; + float p_level_old[3], p_freq_old[3], p_q_old[3]; + float hp_mode_old1, hp_freq_old1, hp_active_old1; + float lp_mode_old1, lp_freq_old1, lp_active_old1; + float ls_level_old1, ls_freq_old1, ls_active_old1; + float hs_level_old1, hs_freq_old1, hs_active_old1; + float p_level_old1[3], p_freq_old1[3], p_q_old1[3], p_active_old1[3]; + uint32_t clip_in, clip_out; + float meter_in, meter_out; + biquad_d2 lsL, lsR, hsL, hsR; + biquad_d2 pL[3], pR[3]; +public: + typedef std::complex cfloat; + float *ins[in_count]; + float *outs[out_count]; + float *params[param_count]; + uint32_t srate; + bool is_active; + volatile int last_generation, last_calculated_generation; + equalizer5band_audio_module(); + void activate(); + void deactivate(); + void params_changed(); + float freq_gain(int index, double freq, uint32_t sr) + { + float ret = 1.f; + ret *= (*params[param_ls_active] > 0.f) ? lsL.freq_gain(freq, sr) : 1; + ret *= (*params[param_hs_active] > 0.f) ? hsL.freq_gain(freq, sr) : 1; + ret *= (*params[param_p1_active] > 0.f) ? pL[0].freq_gain(freq, sr) : 1; + ret *= (*params[param_p2_active] > 0.f) ? pL[1].freq_gain(freq, sr) : 1; + ret *= (*params[param_p3_active] > 0.f) ? pL[2].freq_gain(freq, sr) : 1; + return ret; + } + void set_sample_rate(uint32_t sr); + uint32_t process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask); + bool get_graph(int index, int subindex, float *data, int points, cairo_iface *context); + bool get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context); + int get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline); +}; + /// Filterclavier --- MIDI controlled filter by Hans Baier class filterclavier_audio_module: public audio_module, diff --git a/plugins/ladspa_effect/calf/src/modules.cpp b/plugins/ladspa_effect/calf/src/modules.cpp index 81f577e7a..9b1dc7b6c 100644 --- a/plugins/ladspa_effect/calf/src/modules.cpp +++ b/plugins/ladspa_effect/calf/src/modules.cpp @@ -211,171 +211,6 @@ CALF_PLUGIN_INFO(multichorus) = { 0x8501, "MultiChorus", "Calf MultiChorus", "Kr //////////////////////////////////////////////////////////////////////////// -CALF_PORT_NAMES(equalizer5band) = {"In L", "In R", "Out L", "Out R"}; -const char *rolloff_mode_names[] = {"12dB", "24dB", "36dB"}; - -CALF_PORT_PROPS(equalizer5band) = { - { 1, 0, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_in", "Input" }, - { 1, 0, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_out", "Output" }, - { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_in", "Input" }, - { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_out", "Output" }, - { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_in", "0dB" }, - { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_out", "0dB" }, - - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "ls_level", "Level" }, - { 200, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "ls_freq", "Freq" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" }, - - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "hs_level", "Level" }, - { 4000, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "hs_freq", "Freq" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" }, - - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p1_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p1_level", "Level" }, - { 60, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p1_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p1_q", "Q" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p2_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p2_level", "Level" }, - { 120, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p2_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p2_q", "Q" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p3_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p3_level", "Level" }, - { 250, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p3_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p3_q", "Q" }, -}; - -CALF_PLUGIN_INFO(equalizer5band) = { 0x8501, "Equalizer5Band", "Calf Equalizer 5 Band", "Markus Schmidt", calf_plugins::calf_copyright_info, "EqualizerPlugin" }; - -//////////////////////////////////////////////////////////////////////////// - -CALF_PORT_NAMES(equalizer8band) = {"In L", "In R", "Out L", "Out R"}; -const char *rolloff_mode_names[] = {"12dB", "24dB", "36dB"}; - -CALF_PORT_PROPS(equalizer8band) = { - { 1, 0, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_in", "Input" }, - { 1, 0, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_out", "Output" }, - { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_inL", "Input L" }, - { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_inR", "Input R" }, - { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_outL", "Output L" }, - { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_outR", "Output R" }, - { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_inL", "0dB" }, - { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_inR", "0dB" }, - { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outL", "0dB" }, - { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outR", "0dB" }, - - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "hp_active", "active" }, - { 30, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "hp_freq", "Freq" }, - { 1, 0, 2, 0, PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "hf_rolloff", "Rolloff" }, - - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "lp_active", "active" }, - { 18000, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "lp_freq", "Freq" }, - { 1, 0, 2, 0, PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "lf_rolloff", "Rolloff" }, - - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "ls_level", "Level" }, - { 200, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "ls_freq", "Freq" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" }, - - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "hs_level", "Level" }, - { 4000, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "hs_freq", "Freq" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" }, - - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p1_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p1_level", "Level" }, - { 60, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p1_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p1_q", "Q" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p2_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p2_level", "Level" }, - { 120, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p2_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p2_q", "Q" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p3_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p3_level", "Level" }, - { 250, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p3_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p3_q", "Q" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p4_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p4_level", "Level" }, - { 500, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p4_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p4_q", "Q" }, -}; - -CALF_PLUGIN_INFO(equalizer8band) = { 0x8501, "Equalizer8Band", "Calf Equalizer 8 Band", "Markus Schmidt", calf_plugins::calf_copyright_info, "EqualizerPlugin" }; - -//////////////////////////////////////////////////////////////////////////// - -CALF_PORT_NAMES(equalizer12band) = {"In L", "In R", "Out L", "Out R"}; -const char *rolloff_mode_names[] = {"12dB", "24dB", "36dB"}; - -CALF_PORT_PROPS(equalizer12band) = { - { 1, 0, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_in", "Input" }, - { 1, 0, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_out", "Output" }, - { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_inL", "Input L" }, - { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_inR", "Input R" }, - { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_outL", "Output L" }, - { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_outR", "Output R" }, - { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_inL", "0dB" }, - { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_inR", "0dB" }, - { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outL", "0dB" }, - { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outR", "0dB" }, - - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "hp_active", "active" }, - { 30, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "hp_freq", "Freq" }, - { 1, 0, 2, 0, PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "hf_rolloff", "Rolloff" }, - - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "lp_active", "active" }, - { 18000, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "lp_freq", "Freq" }, - { 1, 0, 2, 0, PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "lf_rolloff", "Rolloff" }, - - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "ls_level", "Level" }, - { 200, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "ls_freq", "Freq" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" }, - - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "hs_level", "Level" }, - { 4000, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "hs_freq", "Freq" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" }, - - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p1_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p1_level", "Level" }, - { 60, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p1_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p1_q", "Q" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p2_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p2_level", "Level" }, - { 120, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p2_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p2_q", "Q" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p3_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p3_level", "Level" }, - { 250, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p3_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p3_q", "Q" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p4_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p4_level", "Level" }, - { 500, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p4_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p4_q", "Q" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p5_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p5_level", "Level" }, - { 1000, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p5_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p5_q", "Q" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p6_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p6_level", "Level" }, - { 2500, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p6_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p6_q", "Q" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p7_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p7_level", "Level" }, - { 4000, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p7_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p7_q", "Q" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p8_active", "active" }, - { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p8_level", "Level" }, - { 6000, 0, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p8_freq", "Freq" }, - { 1, 0, 100, 1, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p8_q", "Q" }, -}; - -CALF_PLUGIN_INFO(equalizer12band) = { 0x8501, "Equalizer12Band", "Calf Equalizer 12 Band", "Markus Schmidt", calf_plugins::calf_copyright_info, "EqualizerPlugin" }; - -//////////////////////////////////////////////////////////////////////////// - CALF_PORT_NAMES(compressor) = {"In L", "In R", "Out L", "Out R"}; const char *compressor_detection_names[] = { "RMS", "Peak" }; @@ -439,8 +274,8 @@ CALF_PORT_PROPS(sidechaincompressor) = { { 0, 0, 1, 0, PF_ENUM | PF_CTL_COMBO, sidechaincompressor_stereo_link_names, "stereo_link", "Stereo Link" }, { 0, 0.03125, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_CTLO_REVERSE | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL| PF_PROP_GRAPH, NULL, "compression", "Gain Reduction" }, { 0, 0, 9, 0, PF_ENUM | PF_CTL_COMBO, sidechaincompressor_mode_names, "sc_mode", "Sidechain Mode" }, - { 250, 30,15000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "f1_freq", "Freq" }, - { 4500, 30,15000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "f2_freq", "Freq" }, + { 250, 10,18000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "f1_freq", "Freq" }, + { 4500, 10,18000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "f2_freq", "Freq" }, { 1, 0.0625, 16, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "f1_level", "Level" }, { 1, 0.0625, 16, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "f2_level", "Level" }, { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "sc_listen", "S/C-Listen" }, @@ -538,6 +373,166 @@ CALF_PLUGIN_INFO(multibandcompressor) = { 0x8502, "Multibandcompressor", "Calf M //////////////////////////////////////////////////////////////////////////// +CALF_PORT_NAMES(equalizer5band) = {"In L", "In R", "Out L", "Out R"}; + +CALF_PORT_PROPS(equalizer5band) = { + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass", "Bypass" }, + { 1, 0, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_in", "Input" }, + { 1, 0, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_out", "Output" }, + { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_in", "Input" }, + { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_out", "Output" }, + { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_in", "0dB" }, + { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_out", "0dB" }, + + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "ls_level", "Level" }, + { 200, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "ls_freq", "Freq" }, + + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "hs_level", "Level" }, + { 4000, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "hs_freq", "Freq" }, + + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p1_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p1_level", "Level 1" }, + { 250, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "p1_freq", "Freq 1" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p1_q", "Q 1" }, + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p2_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p2_level", "Level 2" }, + { 1000, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p2_freq", "Freq 2" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p2_q", "Q 2" }, + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p3_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p3_level", "Level 3" }, + { 2500, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p3_freq", "Freq 3" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p3_q", "Q 3" }, +}; + +CALF_PLUGIN_INFO(equalizer5band) = { 0x8501, "Equalizer5Band", "Calf Equalizer 5 Band", "Markus Schmidt", calf_plugins::calf_copyright_info, "EqualizerPlugin" }; + +////////////////////////////////////////////////////////////////////////////// + +CALF_PORT_NAMES(equalizer8band) = {"In L", "In R", "Out L", "Out R"}; +const char *rolloff_mode_names[] = {"12dB", "24dB", "36dB"}; + +CALF_PORT_PROPS(equalizer8band) = { + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass", "Bypass" }, + { 1, 0, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_in", "Input" }, + { 1, 0, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_out", "Output" }, + { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_inL", "L" }, + { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_inR", "R" }, + { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_outL", "L" }, + { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_outR", "R" }, + { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_inL", "0dB" }, + { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_inR", "0dB" }, + { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outL", "0dB" }, + { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outR", "0dB" }, + + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "hp_active", "active" }, + { 30, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "hp_freq", "Freq" }, + { 1, 0, 2, 0, PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "hp_mode", "Mode" }, + + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "lp_active", "active" }, + { 18000, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "lp_freq", "Freq" }, + { 1, 0, 2, 0, PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "lp_mode", "Mode" }, + + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "ls_level", "Level" }, + { 200, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "ls_freq", "Freq" }, + + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "hs_level", "Level" }, + { 4000, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "hs_freq", "Freq" }, + + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p1_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p1_level", "Level 1" }, + { 250, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "p1_freq", "Freq 1" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p1_q", "Q 1" }, + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p2_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p2_level", "Level 2" }, + { 1000, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p2_freq", "Freq 2" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p2_q", "Q 2" }, + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p3_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p3_level", "Level 3" }, + { 2500, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p3_freq", "Freq 3" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p3_q", "Q 3" }, + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p4_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p4_level", "Level 4" }, + { 5000, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p4_freq", "Freq 4" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p4_q", "Q 4" }, +}; + +CALF_PLUGIN_INFO(equalizer8band) = { 0x8501, "Equalizer8Band", "Calf Equalizer 8 Band", "Markus Schmidt", calf_plugins::calf_copyright_info, "EqualizerPlugin" }; + +//////////////////////////////////////////////////////////////////////////// + +CALF_PORT_NAMES(equalizer12band) = {"In L", "In R", "Out L", "Out R"}; + +CALF_PORT_PROPS(equalizer12band) = { + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass", "Bypass" }, + { 1, 0, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_in", "Input" }, + { 1, 0, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "level_out", "Output" }, + { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_inL", "L" }, + { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_inR", "R" }, + { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_outL", "L" }, + { 0, 0, 1, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_METER | PF_CTLO_LABEL | PF_UNIT_DB | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "meter_outR", "R" }, + { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_inL", "0dB" }, + { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_inR", "0dB" }, + { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outL", "0dB" }, + { 0, 0, 1, 0, PF_FLOAT | PF_CTL_LED | PF_PROP_OUTPUT | PF_PROP_OPTIONAL, NULL, "clip_outR", "0dB" }, + + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "hp_active", "active" }, + { 30, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "hp_freq", "Freq" }, + { 1, 0, 2, 0, PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "hp_mode", "Mode" }, + + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "lp_active", "active" }, + { 18000, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "lp_freq", "Freq" }, + { 1, 0, 2, 0, PF_ENUM | PF_CTL_COMBO, rolloff_mode_names, "lp_mode", "Mode" }, + + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "ls_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "ls_level", "Level" }, + { 200, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "ls_freq", "Freq" }, + + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "hs_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "hs_level", "Level" }, + { 4000, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "hs_freq", "Freq" }, + + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p1_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p1_level", "Level 1" }, + { 60, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ | PF_PROP_GRAPH, NULL, "p1_freq", "Freq 1" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p1_q", "Q 1" }, + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p2_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p2_level", "Level 2" }, + { 120, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p2_freq", "Freq 2" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p2_q", "Q 2" }, + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p3_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p3_level", "Level 3" }, + { 250, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p3_freq", "Freq 3" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p3_q", "Q 3" }, + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p4_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p4_level", "Level 4" }, + { 500, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p4_freq", "Freq 4" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p4_q", "Q 4" }, + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p5_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p5_level", "Level 5" }, + { 1000, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p5_freq", "Freq 5" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p5_q", "Q 5" }, + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p6_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p6_level", "Level 6" }, + { 2500, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p6_freq", "Freq 6" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p6_q", "Q 6" }, + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p7_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p7_level", "Level 7" }, + { 4000, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p7_freq", "Freq 7" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p7_q", "Q 7" }, + { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "p8_active", "active" }, + { 1, 0.015625, 64, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB, NULL, "p8_level", "Level 8" }, + { 6000, 10, 20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_HZ, NULL, "p8_freq", "Freq 8" }, + { 1, 0.1, 100, 1, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_COEF, NULL, "p8_q", "Q 8" }, +}; + +CALF_PLUGIN_INFO(equalizer12band) = { 0x8501, "Equalizer12Band", "Calf Equalizer 12 Band", "Markus Schmidt", calf_plugins::calf_copyright_info, "EqualizerPlugin" }; + +//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// CALF_PORT_NAMES(monosynth) = { diff --git a/plugins/ladspa_effect/calf/src/modules_dsp.cpp b/plugins/ladspa_effect/calf/src/modules_dsp.cpp index 7a2389b31..ca8922903 100644 --- a/plugins/ladspa_effect/calf/src/modules_dsp.cpp +++ b/plugins/ladspa_effect/calf/src/modules_dsp.cpp @@ -1099,36 +1099,36 @@ void sidechaincompressor_audio_module::params_changed() f2_active = 0.f; break; case DEESSER_WIDE: - f1L.set_hp_rbj((float)*params[param_f1_freq], q, (float)srate, *params[param_f1_level]); + f1L.set_peakeq_rbj((float)*params[param_f1_freq], q, *params[param_f1_level], (float)srate); + f1R.copy_coeffs(f1L); + f2L.set_hp_rbj((float)*params[param_f2_freq], q, (float)srate, *params[param_f2_level]); + f2R.copy_coeffs(f2L); + f1_active = 0.5f; + f2_active = 1.f; + break; + case DEESSER_SPLIT: + f1L.set_lp_rbj((float)*params[param_f1_freq] * (1 + 0.17), q, (float)srate); + f1R.copy_coeffs(f1L); + f2L.set_hp_rbj((float)*params[param_f2_freq] * (1 - 0.17), q, (float)srate, *params[param_f2_level]); + f2R.copy_coeffs(f2L); + f1_active = 0.f; + f2_active = 1.f; + break; + case DERUMBLER_WIDE: + f1L.set_lp_rbj((float)*params[param_f1_freq], q, (float)srate, *params[param_f1_level]); f1R.copy_coeffs(f1L); f2L.set_peakeq_rbj((float)*params[param_f2_freq], q, *params[param_f2_level], (float)srate); f2R.copy_coeffs(f2L); f1_active = 1.f; f2_active = 0.5f; break; - case DEESSER_SPLIT: - f2L.set_hp_rbj((float)*params[param_f2_freq] * (1 - 0.17), q, (float)srate, *params[param_f1_level]); - f2R.copy_coeffs(f1L); - f1L.set_lp_rbj((float)*params[param_f2_freq] * (1 + 0.17), q, (float)srate); - f1R.copy_coeffs(f2L); - f2_active = 1.f; - f1_active = 0.f; - break; - case DERUMBLER_WIDE: - f1L.set_peakeq_rbj((float)*params[param_f1_freq], q, *params[param_f1_level], (float)srate); - f1R.copy_coeffs(f1L); - f2L.set_lp_rbj((float)*params[param_f2_freq], q, (float)srate, *params[param_f2_level]); - f2R.copy_coeffs(f2L); - f1_active = 0.5f; - f2_active = 1.f; - break; case DERUMBLER_SPLIT: - f2L.set_hp_rbj((float)*params[param_f1_freq] * (1 - 0.17), q, (float)srate); - f2R.copy_coeffs(f1L); - f1L.set_lp_rbj((float)*params[param_f1_freq] * (1 + 0.17), q, (float)srate, *params[param_f2_level]); - f1R.copy_coeffs(f2L); - f2_active = 0.f; + f1L.set_lp_rbj((float)*params[param_f1_freq] * (1 + 0.17), q, (float)srate, *params[param_f1_level]); + f1R.copy_coeffs(f1L); + f2L.set_hp_rbj((float)*params[param_f2_freq] * (1 - 0.17), q, (float)srate); + f2R.copy_coeffs(f2L); f1_active = 1.f; + f2_active = 0.f; break; case WEIGHTED_1: f1L.set_lowshelf_rbj((float)*params[param_f1_freq], q, *params[param_f1_level], (float)srate); @@ -1630,3 +1630,1092 @@ int gain_reduction_audio_module::get_changed_offsets(int generation, int &subind subindex_graph = 2; return last_generation; } + +/// Equalizer 12 Band by Markus Schmidt +/// +/// This module is based on Krzysztof's filters. It provides a couple +/// of different chained filters. +/////////////////////////////////////////////////////////////////////////////////////////////// + +equalizer12band_audio_module::equalizer12band_audio_module() +{ + is_active = false; + srate = 0; + last_generation = 0; + clip_inL = 0.f; + clip_inR = 0.f; + clip_outL = 0.f; + clip_outR = 0.f; + meter_inL = 0.f; + meter_inR = 0.f; + meter_outL = 0.f; + meter_outR = 0.f; +} + +void equalizer12band_audio_module::activate() +{ + is_active = true; + // set all filters + params_changed(); +} +void equalizer12band_audio_module::deactivate() +{ + is_active = false; +} + +void equalizer12band_audio_module::params_changed() +{ + // set the params of all filters + if(*params[param_hp_freq] != hp_freq_old) { + hpL[0].set_hp_rbj(*params[param_hp_freq], 0.707, (float)srate, 1.0); + hpL[1].copy_coeffs(hpL[0]); + hpL[2].copy_coeffs(hpL[0]); + hpR[0].copy_coeffs(hpL[0]); + hpR[1].copy_coeffs(hpL[0]); + hpR[2].copy_coeffs(hpL[0]); + hp_freq_old = *params[param_hp_freq]; + } + if(*params[param_lp_freq] != lp_freq_old) { + lpL[0].set_lp_rbj(*params[param_lp_freq], 0.707, (float)srate, 1.0); + lpL[1].copy_coeffs(lpL[0]); + lpL[2].copy_coeffs(lpL[0]); + lpR[0].copy_coeffs(lpL[0]); + lpR[1].copy_coeffs(lpL[0]); + lpR[2].copy_coeffs(lpL[0]); + lp_freq_old = *params[param_lp_freq]; + } + if(*params[param_ls_freq] != ls_freq_old or *params[param_ls_level] != ls_level_old) { + lsL.set_lowshelf_rbj(*params[param_ls_freq], 0.707, *params[param_ls_level], (float)srate); + lsR.copy_coeffs(lsL); + ls_level_old = *params[param_ls_level]; + ls_freq_old = *params[param_ls_freq]; + } + if(*params[param_hs_freq] != hs_freq_old or *params[param_hs_level] != hs_level_old) { + hsL.set_highshelf_rbj(*params[param_hs_freq], 0.707, *params[param_hs_level], (float)srate); + hsR.copy_coeffs(hsL); + hs_level_old = *params[param_hs_level]; + hs_freq_old = *params[param_hs_freq]; + } + if(*params[param_p1_freq] != p_freq_old[0] or *params[param_p1_level] != p_level_old[0] or *params[param_p1_q] != p_q_old[0]) { + pL[0].set_peakeq_rbj((float)*params[param_p1_freq], *params[param_p1_q], *params[param_p1_level], (float)srate); + pR[0].copy_coeffs(pL[0]); + p_freq_old[0] = *params[param_p1_freq]; + p_level_old[0] = *params[param_p1_level]; + p_q_old[0] = *params[param_p1_q]; + } + if(*params[param_p2_freq] != p_freq_old[1] or *params[param_p2_level] != p_level_old[1] or *params[param_p2_q] != p_q_old[1]) { + pL[1].set_peakeq_rbj((float)*params[param_p2_freq], *params[param_p2_q], *params[param_p2_level], (float)srate); + pR[1].copy_coeffs(pL[1]); + p_freq_old[1] = *params[param_p2_freq]; + p_level_old[1] = *params[param_p2_level]; + p_q_old[1] = *params[param_p2_q]; + } + if(*params[param_p3_freq] != p_freq_old[2] or *params[param_p3_level] != p_level_old[2] or *params[param_p3_q] != p_q_old[2]) { + pL[2].set_peakeq_rbj((float)*params[param_p3_freq], *params[param_p3_q], *params[param_p3_level], (float)srate); + pR[2].copy_coeffs(pL[2]); + p_freq_old[2] = *params[param_p3_freq]; + p_level_old[2] = *params[param_p3_level]; + p_q_old[2] = *params[param_p3_q]; + } + if(*params[param_p4_freq] != p_freq_old[3] or *params[param_p4_level] != p_level_old[3] or *params[param_p4_q] != p_q_old[3]) { + pL[3].set_peakeq_rbj((float)*params[param_p4_freq], *params[param_p4_q], *params[param_p4_level], (float)srate); + pR[3].copy_coeffs(pL[3]); + p_freq_old[3] = *params[param_p4_freq]; + p_level_old[3] = *params[param_p4_level]; + p_q_old[3] = *params[param_p4_q]; + } + if(*params[param_p5_freq] != p_freq_old[4] or *params[param_p5_level] != p_level_old[4] or *params[param_p5_q] != p_q_old[4]) { + pL[4].set_peakeq_rbj((float)*params[param_p5_freq], *params[param_p5_q], *params[param_p5_level], (float)srate); + pR[4].copy_coeffs(pL[4]); + p_freq_old[4] = *params[param_p5_freq]; + p_level_old[4] = *params[param_p5_level]; + p_q_old[4] = *params[param_p5_q]; + } + if(*params[param_p6_freq] != p_freq_old[5] or *params[param_p6_level] != p_level_old[5] or *params[param_p6_q] != p_q_old[5]) { + pL[5].set_peakeq_rbj((float)*params[param_p6_freq], *params[param_p6_q], *params[param_p6_level], (float)srate); + pR[5].copy_coeffs(pL[5]); + p_freq_old[5] = *params[param_p6_freq]; + p_level_old[5] = *params[param_p6_level]; + p_q_old[5] = *params[param_p6_q]; + } + if(*params[param_p7_freq] != p_freq_old[6] or *params[param_p7_level] != p_level_old[6] or *params[param_p7_q] != p_q_old[6]) { + pL[6].set_peakeq_rbj((float)*params[param_p7_freq], *params[param_p7_q], *params[param_p7_level], (float)srate); + pR[6].copy_coeffs(pL[6]); + p_freq_old[6] = *params[param_p7_freq]; + p_level_old[6] = *params[param_p7_level]; + p_q_old[6] = *params[param_p7_q]; + } + if(*params[param_p8_freq] != p_freq_old[7] or *params[param_p8_level] != p_level_old[7] or *params[param_p8_q] != p_q_old[7]) { + pL[7].set_peakeq_rbj((float)*params[param_p8_freq], *params[param_p8_q], *params[param_p8_level], (float)srate); + pR[7].copy_coeffs(pL[7]); + p_freq_old[7] = *params[param_p8_freq]; + p_level_old[7] = *params[param_p8_level]; + p_q_old[7] = *params[param_p8_q]; + } +} + +void equalizer12band_audio_module::set_sample_rate(uint32_t sr) +{ + srate = sr; +} + +uint32_t equalizer12band_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask) +{ + bool bypass = *params[param_bypass] > 0.5f; + numsamples += offset; + if(bypass) { + // everything bypassed + while(offset < numsamples) { + outs[0][offset] = ins[0][offset]; + outs[1][offset] = ins[1][offset]; + ++offset; + } + // displays, too + clip_inL = 0.f; + clip_inR = 0.f; + clip_outL = 0.f; + clip_outR = 0.f; + meter_inL = 0.f; + meter_inR = 0.f; + meter_outL = 0.f; + meter_outR = 0.f; + } else { + + clip_inL -= std::min(clip_inL, numsamples); + clip_inR -= std::min(clip_inR, numsamples); + clip_outL -= std::min(clip_outL, numsamples); + clip_outR -= std::min(clip_outR, numsamples); + meter_inL = 0.f; + meter_inR = 0.f; + meter_outL = 0.f; + meter_outR = 0.f; + + // process + while(offset < numsamples) { + // cycle through samples + float outL = 0.f; + float outR = 0.f; + float inL = ins[0][offset]; + float inR = ins[1][offset]; + // in level + inR *= *params[param_level_in]; + inL *= *params[param_level_in]; + + float procL = inL; + float procR = inR; + + // all filters in chain + if(*params[param_hp_active] > 0.f) { + switch((int)*params[param_hp_mode]) { + case MODE12DB: + procL = hpL[0].process(procL); + procR = hpR[0].process(procR); + break; + case MODE24DB: + procL = hpL[1].process(hpL[0].process(procL)); + procR = hpR[1].process(hpR[0].process(procR)); + break; + case MODE36DB: + procL = hpL[2].process(hpL[1].process(hpL[0].process(procL))); + procR = hpR[2].process(hpR[1].process(hpR[0].process(procR))); + break; + } + } + if(*params[param_lp_active] > 0.f) { + switch((int)*params[param_lp_mode]) { + case MODE12DB: + procL = lpL[0].process(procL); + procR = lpR[0].process(procR); + break; + case MODE24DB: + procL = lpL[1].process(lpL[0].process(procL)); + procR = lpR[1].process(lpR[0].process(procR)); + break; + case MODE36DB: + procL = lpL[2].process(lpL[1].process(lpL[0].process(procL))); + procR = lpR[2].process(lpR[1].process(lpR[0].process(procR))); + break; + } + } + if(*params[param_ls_active] > 0.f) { + procL = lsL.process(procL); + procR = lsR.process(procR); + } + if(*params[param_hs_active] > 0.f) { + procL = hsL.process(procL); + procR = hsR.process(procR); + } + if(*params[param_p1_active] > 0.f) { + procL = pL[0].process(procL); + procR = pR[0].process(procR); + } + if(*params[param_p2_active] > 0.f) { + procL = pL[1].process(procL); + procR = pR[1].process(procR); + } + if(*params[param_p3_active] > 0.f) { + procL = pL[2].process(procL); + procR = pR[2].process(procR); + } + if(*params[param_p4_active] > 0.f) { + procL = pL[3].process(procL); + procR = pR[3].process(procR); + } + if(*params[param_p5_active] > 0.f) { + procL = pL[4].process(procL); + procR = pR[4].process(procR); + } + if(*params[param_p6_active] > 0.f) { + procL = pL[5].process(procL); + procR = pR[5].process(procR); + } + if(*params[param_p7_active] > 0.f) { + procL = pL[6].process(procL); + procR = pR[6].process(procR); + } + if(*params[param_p8_active] > 0.f) { + procL = pL[7].process(procL); + procR = pR[7].process(procR); + } + + outL = procL * *params[param_level_out]; + outR = procR * *params[param_level_out]; + + // send to output + outs[0][offset] = outL; + outs[1][offset] = outR; + + // clip LED's + if(inL > 1.f) { + clip_inL = srate >> 3; + } + if(inR > 1.f) { + clip_inR = srate >> 3; + } + if(outL > 1.f) { + clip_outL = srate >> 3; + } + if(outR > 1.f) { + clip_outR = srate >> 3; + } + // set up in / out meters + if(inL > meter_inL) { + meter_inL = inL; + } + if(inR > meter_inR) { + meter_inR = inR; + } + if(outL > meter_outL) { + meter_outL = outL; + } + if(outR > meter_outR) { + meter_outR = outR; + } + + // next sample + ++offset; + } // cycle trough samples + // clean up + for(int i = 0; i < 3; ++i) { + hpL[i].sanitize(); + hpR[i].sanitize(); + lpL[i].sanitize(); + lpR[i].sanitize(); + } + lsL.sanitize(); + hsR.sanitize(); + for(int i = 0; i < 8; ++i) { + pL[i].sanitize(); + pR[i].sanitize(); + } + } + // draw meters + if(params[param_clip_inL] != NULL) { + *params[param_clip_inL] = clip_inL; + } + if(params[param_clip_inR] != NULL) { + *params[param_clip_inR] = clip_inR; + } + if(params[param_clip_outL] != NULL) { + *params[param_clip_outL] = clip_outL; + } + if(params[param_clip_outR] != NULL) { + *params[param_clip_outR] = clip_outR; + } + + if(params[param_meter_inL] != NULL) { + *params[param_meter_inL] = meter_inL; + } + if(params[param_meter_inR] != NULL) { + *params[param_meter_inR] = meter_inR; + } + if(params[param_meter_outL] != NULL) { + *params[param_meter_outL] = meter_outL; + } + if(params[param_meter_outR] != NULL) { + *params[param_meter_outR] = meter_outR; + } + // whatever has to be returned x) + return outputs_mask; +} +bool equalizer12band_audio_module::get_graph(int index, int subindex, float *data, int points, cairo_iface *context) +{ + if (!is_active) + return false; + if (index == param_p1_freq && !subindex) { + context->set_line_width(1.5); + return ::get_graph(*this, subindex, data, points); + } + return false; +} + +bool equalizer12band_audio_module::get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context) +{ + if (!is_active) { + return false; + } else { + return get_freq_gridline(subindex, pos, vertical, legend, context); + } +} + +int equalizer12band_audio_module::get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline) +{ + if (!is_active) { + return false; + } else { + if (*params[param_hp_freq] != hp_freq_old1 + or *params[param_hp_mode] != hp_mode_old1 + or *params[param_lp_freq] != lp_freq_old1 + or *params[param_lp_mode] != lp_mode_old1 + + or *params[param_ls_freq] != ls_freq_old1 + or *params[param_ls_level] != ls_level_old1 + or *params[param_hs_freq] != hs_freq_old1 + or *params[param_hs_level] != hs_level_old1 + + or *params[param_p1_freq] != p_freq_old1[0] + or *params[param_p1_level] != p_level_old1[0] + or *params[param_p1_q] != p_q_old1[0] + + or *params[param_p2_freq] != p_freq_old1[1] + or *params[param_p2_level] != p_level_old1[1] + or *params[param_p2_q] != p_q_old1[1] + + or *params[param_p3_freq] != p_freq_old1[2] + or *params[param_p3_level] != p_level_old1[2] + or *params[param_p3_q] != p_q_old1[2] + + or *params[param_p4_freq] != p_freq_old1[3] + or *params[param_p4_level] != p_level_old1[3] + or *params[param_p4_q] != p_q_old1[3] + + or *params[param_p5_freq] != p_freq_old1[4] + or *params[param_p5_level] != p_level_old1[4] + or *params[param_p5_q] != p_q_old1[4] + + or *params[param_p6_freq] != p_freq_old1[5] + or *params[param_p6_level] != p_level_old1[5] + or *params[param_p6_q] != p_q_old1[5] + + or *params[param_p7_freq] != p_freq_old1[6] + or *params[param_p7_level] != p_level_old1[6] + or *params[param_p7_q] != p_q_old1[6] + + or *params[param_p8_freq] != p_freq_old1[7] + or *params[param_p8_level] != p_level_old1[7] + or *params[param_p8_q] != p_q_old1[7]) + { + + hp_freq_old1 = *params[param_hp_freq]; + hp_mode_old1 = *params[param_hp_mode]; + lp_freq_old1 = *params[param_lp_freq]; + lp_mode_old1 = *params[param_lp_mode]; + + ls_freq_old1 = *params[param_ls_freq]; + ls_level_old1 = *params[param_ls_level]; + hs_freq_old1 = *params[param_hs_freq]; + hs_level_old1 = *params[param_hs_level]; + + p_freq_old1[0] = *params[param_p1_freq]; + p_level_old1[0] = *params[param_p1_level]; + p_q_old1[0] = *params[param_p1_q]; + + p_freq_old1[1] = *params[param_p2_freq]; + p_level_old1[1] = *params[param_p2_level]; + p_q_old1[1] = *params[param_p2_q]; + + p_freq_old1[2] = *params[param_p3_freq]; + p_level_old1[2] = *params[param_p3_level]; + p_q_old1[2] = *params[param_p3_q]; + + p_freq_old1[3] = *params[param_p4_freq]; + p_level_old1[3] = *params[param_p4_level]; + p_q_old1[3] = *params[param_p4_q]; + + p_freq_old1[4] = *params[param_p5_freq]; + p_level_old1[4] = *params[param_p5_level]; + p_q_old1[4] = *params[param_p5_q]; + + p_freq_old1[5] = *params[param_p6_freq]; + p_level_old1[5] = *params[param_p6_level]; + p_q_old1[5] = *params[param_p6_q]; + + p_freq_old1[6] = *params[param_p7_freq]; + p_level_old1[6] = *params[param_p7_level]; + p_q_old1[6] = *params[param_p7_q]; + + p_freq_old1[7] = *params[param_p8_freq]; + p_level_old1[7] = *params[param_p8_level]; + p_q_old1[7] = *params[param_p8_q]; + + last_generation++; + subindex_graph = 0; + subindex_dot = INT_MAX; + subindex_gridline = INT_MAX; + } + else { + subindex_graph = 0; + subindex_dot = subindex_gridline = generation ? INT_MAX : 0; + } + if (generation == last_calculated_generation) + subindex_graph = INT_MAX; + return last_generation; + } + return false; +} + +/// Equalizer 8 Band by Markus Schmidt +/// +/// This module is based on Krzysztof's filters. It provides a couple +/// of different chained filters. +/////////////////////////////////////////////////////////////////////////////////////////////// + +equalizer8band_audio_module::equalizer8band_audio_module() +{ + is_active = false; + srate = 0; + last_generation = 0; + clip_inL = 0.f; + clip_inR = 0.f; + clip_outL = 0.f; + clip_outR = 0.f; + meter_inL = 0.f; + meter_inR = 0.f; + meter_outL = 0.f; + meter_outR = 0.f; +} + +void equalizer8band_audio_module::activate() +{ + is_active = true; + // set all filters + params_changed(); +} +void equalizer8band_audio_module::deactivate() +{ + is_active = false; +} + +void equalizer8band_audio_module::params_changed() +{ + // set the params of all filters + if(*params[param_hp_freq] != hp_freq_old) { + hpL[0].set_hp_rbj(*params[param_hp_freq], 0.707, (float)srate, 1.0); + hpL[1].copy_coeffs(hpL[0]); + hpL[2].copy_coeffs(hpL[0]); + hpR[0].copy_coeffs(hpL[0]); + hpR[1].copy_coeffs(hpL[0]); + hpR[2].copy_coeffs(hpL[0]); + hp_freq_old = *params[param_hp_freq]; + } + if(*params[param_lp_freq] != lp_freq_old) { + lpL[0].set_lp_rbj(*params[param_lp_freq], 0.707, (float)srate, 1.0); + lpL[1].copy_coeffs(lpL[0]); + lpL[2].copy_coeffs(lpL[0]); + lpR[0].copy_coeffs(lpL[0]); + lpR[1].copy_coeffs(lpL[0]); + lpR[2].copy_coeffs(lpL[0]); + lp_freq_old = *params[param_lp_freq]; + } + if(*params[param_ls_freq] != ls_freq_old or *params[param_ls_level] != ls_level_old) { + lsL.set_lowshelf_rbj(*params[param_ls_freq], 0.707, *params[param_ls_level], (float)srate); + lsR.copy_coeffs(lsL); + ls_level_old = *params[param_ls_level]; + ls_freq_old = *params[param_ls_freq]; + } + if(*params[param_hs_freq] != hs_freq_old or *params[param_hs_level] != hs_level_old) { + hsL.set_highshelf_rbj(*params[param_hs_freq], 0.707, *params[param_hs_level], (float)srate); + hsR.copy_coeffs(hsL); + hs_level_old = *params[param_hs_level]; + hs_freq_old = *params[param_hs_freq]; + } + if(*params[param_p1_freq] != p_freq_old[0] or *params[param_p1_level] != p_level_old[0] or *params[param_p1_q] != p_q_old[0]) { + pL[0].set_peakeq_rbj((float)*params[param_p1_freq], *params[param_p1_q], *params[param_p1_level], (float)srate); + pR[0].copy_coeffs(pL[0]); + p_freq_old[0] = *params[param_p1_freq]; + p_level_old[0] = *params[param_p1_level]; + p_q_old[0] = *params[param_p1_q]; + } + if(*params[param_p2_freq] != p_freq_old[1] or *params[param_p2_level] != p_level_old[1] or *params[param_p2_q] != p_q_old[1]) { + pL[1].set_peakeq_rbj((float)*params[param_p2_freq], *params[param_p2_q], *params[param_p2_level], (float)srate); + pR[1].copy_coeffs(pL[1]); + p_freq_old[1] = *params[param_p2_freq]; + p_level_old[1] = *params[param_p2_level]; + p_q_old[1] = *params[param_p2_q]; + } + if(*params[param_p3_freq] != p_freq_old[2] or *params[param_p3_level] != p_level_old[2] or *params[param_p3_q] != p_q_old[2]) { + pL[2].set_peakeq_rbj((float)*params[param_p3_freq], *params[param_p3_q], *params[param_p3_level], (float)srate); + pR[2].copy_coeffs(pL[2]); + p_freq_old[2] = *params[param_p3_freq]; + p_level_old[2] = *params[param_p3_level]; + p_q_old[2] = *params[param_p3_q]; + } + if(*params[param_p4_freq] != p_freq_old[3] or *params[param_p4_level] != p_level_old[3] or *params[param_p4_q] != p_q_old[3]) { + pL[3].set_peakeq_rbj((float)*params[param_p4_freq], *params[param_p4_q], *params[param_p4_level], (float)srate); + pR[3].copy_coeffs(pL[3]); + p_freq_old[3] = *params[param_p4_freq]; + p_level_old[3] = *params[param_p4_level]; + p_q_old[3] = *params[param_p4_q]; + } +} + +void equalizer8band_audio_module::set_sample_rate(uint32_t sr) +{ + srate = sr; +} + +uint32_t equalizer8band_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask) +{ + bool bypass = *params[param_bypass] > 0.5f; + numsamples += offset; + if(bypass) { + // everything bypassed + while(offset < numsamples) { + outs[0][offset] = ins[0][offset]; + outs[1][offset] = ins[1][offset]; + ++offset; + } + // displays, too + clip_inL = 0.f; + clip_inR = 0.f; + clip_outL = 0.f; + clip_outR = 0.f; + meter_inL = 0.f; + meter_inR = 0.f; + meter_outL = 0.f; + meter_outR = 0.f; + } else { + + clip_inL -= std::min(clip_inL, numsamples); + clip_inR -= std::min(clip_inR, numsamples); + clip_outL -= std::min(clip_outL, numsamples); + clip_outR -= std::min(clip_outR, numsamples); + meter_inL = 0.f; + meter_inR = 0.f; + meter_outL = 0.f; + meter_outR = 0.f; + + // process + while(offset < numsamples) { + // cycle through samples + float outL = 0.f; + float outR = 0.f; + float inL = ins[0][offset]; + float inR = ins[1][offset]; + // in level + inR *= *params[param_level_in]; + inL *= *params[param_level_in]; + + float procL = inL; + float procR = inR; + + // all filters in chain + if(*params[param_hp_active] > 0.f) { + switch((int)*params[param_hp_mode]) { + case MODE12DB: + procL = hpL[0].process(procL); + procR = hpR[0].process(procR); + break; + case MODE24DB: + procL = hpL[1].process(hpL[0].process(procL)); + procR = hpR[1].process(hpR[0].process(procR)); + break; + case MODE36DB: + procL = hpL[2].process(hpL[1].process(hpL[0].process(procL))); + procR = hpR[2].process(hpR[1].process(hpR[0].process(procR))); + break; + } + } + if(*params[param_lp_active] > 0.f) { + switch((int)*params[param_lp_mode]) { + case MODE12DB: + procL = lpL[0].process(procL); + procR = lpR[0].process(procR); + break; + case MODE24DB: + procL = lpL[1].process(lpL[0].process(procL)); + procR = lpR[1].process(lpR[0].process(procR)); + break; + case MODE36DB: + procL = lpL[2].process(lpL[1].process(lpL[0].process(procL))); + procR = lpR[2].process(lpR[1].process(lpR[0].process(procR))); + break; + } + } + if(*params[param_ls_active] > 0.f) { + procL = lsL.process(procL); + procR = lsR.process(procR); + } + if(*params[param_hs_active] > 0.f) { + procL = hsL.process(procL); + procR = hsR.process(procR); + } + if(*params[param_p1_active] > 0.f) { + procL = pL[0].process(procL); + procR = pR[0].process(procR); + } + if(*params[param_p2_active] > 0.f) { + procL = pL[1].process(procL); + procR = pR[1].process(procR); + } + if(*params[param_p3_active] > 0.f) { + procL = pL[2].process(procL); + procR = pR[2].process(procR); + } + if(*params[param_p4_active] > 0.f) { + procL = pL[3].process(procL); + procR = pR[3].process(procR); + } + + outL = procL * *params[param_level_out]; + outR = procR * *params[param_level_out]; + + // send to output + outs[0][offset] = outL; + outs[1][offset] = outR; + + // clip LED's + if(inL > 1.f) { + clip_inL = srate >> 3; + } + if(inR > 1.f) { + clip_inR = srate >> 3; + } + if(outL > 1.f) { + clip_outL = srate >> 3; + } + if(outR > 1.f) { + clip_outR = srate >> 3; + } + // set up in / out meters + if(inL > meter_inL) { + meter_inL = inL; + } + if(inR > meter_inR) { + meter_inR = inR; + } + if(outL > meter_outL) { + meter_outL = outL; + } + if(outR > meter_outR) { + meter_outR = outR; + } + + // next sample + ++offset; + } // cycle trough samples + // clean up + for(int i = 0; i < 3; ++i) { + hpL[i].sanitize(); + hpR[i].sanitize(); + lpL[i].sanitize(); + lpR[i].sanitize(); + } + lsL.sanitize(); + hsR.sanitize(); + for(int i = 0; i < 4; ++i) { + pL[i].sanitize(); + pR[i].sanitize(); + } + } + // draw meters + if(params[param_clip_inL] != NULL) { + *params[param_clip_inL] = clip_inL; + } + if(params[param_clip_inR] != NULL) { + *params[param_clip_inR] = clip_inR; + } + if(params[param_clip_outL] != NULL) { + *params[param_clip_outL] = clip_outL; + } + if(params[param_clip_outR] != NULL) { + *params[param_clip_outR] = clip_outR; + } + + if(params[param_meter_inL] != NULL) { + *params[param_meter_inL] = meter_inL; + } + if(params[param_meter_inR] != NULL) { + *params[param_meter_inR] = meter_inR; + } + if(params[param_meter_outL] != NULL) { + *params[param_meter_outL] = meter_outL; + } + if(params[param_meter_outR] != NULL) { + *params[param_meter_outR] = meter_outR; + } + // whatever has to be returned x) + return outputs_mask; +} +bool equalizer8band_audio_module::get_graph(int index, int subindex, float *data, int points, cairo_iface *context) +{ + if (!is_active) + return false; + if (index == param_p1_freq && !subindex) { + context->set_line_width(1.5); + return ::get_graph(*this, subindex, data, points); + } + return false; +} + +bool equalizer8band_audio_module::get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context) +{ + if (!is_active) { + return false; + } else { + return get_freq_gridline(subindex, pos, vertical, legend, context); + } +} + +int equalizer8band_audio_module::get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline) +{ + if (!is_active) { + return false; + } else { + if (*params[param_hp_freq] != hp_freq_old1 + or *params[param_hp_mode] != hp_mode_old1 + or *params[param_lp_freq] != lp_freq_old1 + or *params[param_lp_mode] != lp_mode_old1 + + or *params[param_ls_freq] != ls_freq_old1 + or *params[param_ls_level] != ls_level_old1 + or *params[param_hs_freq] != hs_freq_old1 + or *params[param_hs_level] != hs_level_old1 + + or *params[param_p1_freq] != p_freq_old1[0] + or *params[param_p1_level] != p_level_old1[0] + or *params[param_p1_q] != p_q_old1[0] + + or *params[param_p2_freq] != p_freq_old1[1] + or *params[param_p2_level] != p_level_old1[1] + or *params[param_p2_q] != p_q_old1[1] + + or *params[param_p3_freq] != p_freq_old1[2] + or *params[param_p3_level] != p_level_old1[2] + or *params[param_p3_q] != p_q_old1[2] + + or *params[param_p4_freq] != p_freq_old1[3] + or *params[param_p4_level] != p_level_old1[3] + or *params[param_p4_q] != p_q_old1[3]) + { + + hp_freq_old1 = *params[param_hp_freq]; + hp_mode_old1 = *params[param_hp_mode]; + lp_freq_old1 = *params[param_lp_freq]; + lp_mode_old1 = *params[param_lp_mode]; + + ls_freq_old1 = *params[param_ls_freq]; + ls_level_old1 = *params[param_ls_level]; + hs_freq_old1 = *params[param_hs_freq]; + hs_level_old1 = *params[param_hs_level]; + + p_freq_old1[0] = *params[param_p1_freq]; + p_level_old1[0] = *params[param_p1_level]; + p_q_old1[0] = *params[param_p1_q]; + + p_freq_old1[1] = *params[param_p2_freq]; + p_level_old1[1] = *params[param_p2_level]; + p_q_old1[1] = *params[param_p2_q]; + + p_freq_old1[2] = *params[param_p3_freq]; + p_level_old1[2] = *params[param_p3_level]; + p_q_old1[2] = *params[param_p3_q]; + + p_freq_old1[3] = *params[param_p4_freq]; + p_level_old1[3] = *params[param_p4_level]; + p_q_old1[3] = *params[param_p4_q]; + + last_generation++; + subindex_graph = 0; + subindex_dot = INT_MAX; + subindex_gridline = INT_MAX; + } + else { + subindex_graph = 0; + subindex_dot = subindex_gridline = generation ? INT_MAX : 0; + } + if (generation == last_calculated_generation) + subindex_graph = INT_MAX; + return last_generation; + } + return false; +} + +/// Equalizer 5 Band by Markus Schmidt +/// +/// This module is based on Krzysztof's filters. It provides a couple +/// of different chained filters. +/////////////////////////////////////////////////////////////////////////////////////////////// + +equalizer5band_audio_module::equalizer5band_audio_module() +{ + is_active = false; + srate = 0; + last_generation = 0; + clip_in = 0.f; + clip_out = 0.f; + meter_in = 0.f; + meter_out = 0.f; +} + +void equalizer5band_audio_module::activate() +{ + is_active = true; + // set all filters + params_changed(); +} +void equalizer5band_audio_module::deactivate() +{ + is_active = false; +} + +void equalizer5band_audio_module::params_changed() +{ + // set the params of all filters + if(*params[param_ls_freq] != ls_freq_old or *params[param_ls_level] != ls_level_old) { + lsL.set_lowshelf_rbj(*params[param_ls_freq], 0.707, *params[param_ls_level], (float)srate); + lsR.copy_coeffs(lsL); + ls_level_old = *params[param_ls_level]; + ls_freq_old = *params[param_ls_freq]; + } + if(*params[param_hs_freq] != hs_freq_old or *params[param_hs_level] != hs_level_old) { + hsL.set_highshelf_rbj(*params[param_hs_freq], 0.707, *params[param_hs_level], (float)srate); + hsR.copy_coeffs(hsL); + hs_level_old = *params[param_hs_level]; + hs_freq_old = *params[param_hs_freq]; + } + if(*params[param_p1_freq] != p_freq_old[0] or *params[param_p1_level] != p_level_old[0] or *params[param_p1_q] != p_q_old[0]) { + pL[0].set_peakeq_rbj((float)*params[param_p1_freq], *params[param_p1_q], *params[param_p1_level], (float)srate); + pR[0].copy_coeffs(pL[0]); + p_freq_old[0] = *params[param_p1_freq]; + p_level_old[0] = *params[param_p1_level]; + p_q_old[0] = *params[param_p1_q]; + } + if(*params[param_p2_freq] != p_freq_old[1] or *params[param_p2_level] != p_level_old[1] or *params[param_p2_q] != p_q_old[1]) { + pL[1].set_peakeq_rbj((float)*params[param_p2_freq], *params[param_p2_q], *params[param_p2_level], (float)srate); + pR[1].copy_coeffs(pL[1]); + p_freq_old[1] = *params[param_p2_freq]; + p_level_old[1] = *params[param_p2_level]; + p_q_old[1] = *params[param_p2_q]; + } + if(*params[param_p3_freq] != p_freq_old[2] or *params[param_p3_level] != p_level_old[2] or *params[param_p3_q] != p_q_old[2]) { + pL[2].set_peakeq_rbj((float)*params[param_p3_freq], *params[param_p3_q], *params[param_p3_level], (float)srate); + pR[2].copy_coeffs(pL[2]); + p_freq_old[2] = *params[param_p3_freq]; + p_level_old[2] = *params[param_p3_level]; + p_q_old[2] = *params[param_p3_q]; + } +} + +void equalizer5band_audio_module::set_sample_rate(uint32_t sr) +{ + srate = sr; +} + +uint32_t equalizer5band_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask) +{ + bool bypass = *params[param_bypass] > 0.5f; + numsamples += offset; + if(bypass) { + // everything bypassed + while(offset < numsamples) { + outs[0][offset] = ins[0][offset]; + outs[1][offset] = ins[1][offset]; + ++offset; + } + // displays, too + clip_in = 0.f; + clip_out = 0.f; + meter_in = 0.f; + meter_out = 0.f; + } else { + + clip_in -= std::min(clip_in, numsamples); + clip_out -= std::min(clip_out, numsamples); + meter_in = 0.f; + meter_out = 0.f; + + // process + while(offset < numsamples) { + // cycle through samples + float outL = 0.f; + float outR = 0.f; + float inL = ins[0][offset]; + float inR = ins[1][offset]; + // in level + inR *= *params[param_level_in]; + inL *= *params[param_level_in]; + + float procL = inL; + float procR = inR; + + // all filters in chain + if(*params[param_ls_active] > 0.f) { + procL = lsL.process(procL); + procR = lsR.process(procR); + } + if(*params[param_hs_active] > 0.f) { + procL = hsL.process(procL); + procR = hsR.process(procR); + } + if(*params[param_p1_active] > 0.f) { + procL = pL[0].process(procL); + procR = pR[0].process(procR); + } + if(*params[param_p2_active] > 0.f) { + procL = pL[1].process(procL); + procR = pR[1].process(procR); + } + if(*params[param_p3_active] > 0.f) { + procL = pL[2].process(procL); + procR = pR[2].process(procR); + } + + outL = procL * *params[param_level_out]; + outR = procR * *params[param_level_out]; + + // send to output + outs[0][offset] = outL; + outs[1][offset] = outR; + + // clip LED's + float maxIn = std::max(fabs(inL), fabs(inR)); + float maxOut = std::max(fabs(outL), fabs(outR)); + + if(maxIn > 1.f) { + clip_in = srate >> 3; + } + if(maxOut > 1.f) { + clip_out = srate >> 3; + } + // set up in / out meters + if(maxIn > meter_in) { + meter_in = maxIn; + } + if(maxOut > meter_out) { + meter_out = maxOut; + } + + // next sample + ++offset; + } // cycle trough samples + // clean up + lsL.sanitize(); + hsR.sanitize(); + for(int i = 0; i < 3; ++i) { + pL[i].sanitize(); + pR[i].sanitize(); + } + } + // draw meters + if(params[param_clip_in] != NULL) { + *params[param_clip_in] = clip_in; + } + if(params[param_clip_out] != NULL) { + *params[param_clip_out] = clip_out; + } + + if(params[param_meter_in] != NULL) { + *params[param_meter_in] = meter_in; + } + if(params[param_meter_out] != NULL) { + *params[param_meter_out] = meter_out; + } + // whatever has to be returned x) + return outputs_mask; +} +bool equalizer5band_audio_module::get_graph(int index, int subindex, float *data, int points, cairo_iface *context) +{ + if (!is_active) + return false; + if (index == param_p1_freq && !subindex) { + context->set_line_width(1.5); + return ::get_graph(*this, subindex, data, points); + } + return false; +} + +bool equalizer5band_audio_module::get_gridline(int index, int subindex, float &pos, bool &vertical, std::string &legend, cairo_iface *context) +{ + if (!is_active) { + return false; + } else { + return get_freq_gridline(subindex, pos, vertical, legend, context); + } +} + +int equalizer5band_audio_module::get_changed_offsets(int index, int generation, int &subindex_graph, int &subindex_dot, int &subindex_gridline) +{ + if (!is_active) { + return false; + } else { + if (*params[param_ls_freq] != ls_freq_old1 + or *params[param_ls_level] != ls_level_old1 + or *params[param_hs_freq] != hs_freq_old1 + or *params[param_hs_level] != hs_level_old1 + + or *params[param_p1_freq] != p_freq_old1[0] + or *params[param_p1_level] != p_level_old1[0] + or *params[param_p1_q] != p_q_old1[0] + + or *params[param_p2_freq] != p_freq_old1[1] + or *params[param_p2_level] != p_level_old1[1] + or *params[param_p2_q] != p_q_old1[1] + + or *params[param_p3_freq] != p_freq_old1[2] + or *params[param_p3_level] != p_level_old1[2] + or *params[param_p3_q] != p_q_old1[2]) + { + + ls_freq_old1 = *params[param_ls_freq]; + ls_level_old1 = *params[param_ls_level]; + hs_freq_old1 = *params[param_hs_freq]; + hs_level_old1 = *params[param_hs_level]; + + p_freq_old1[0] = *params[param_p1_freq]; + p_level_old1[0] = *params[param_p1_level]; + p_q_old1[0] = *params[param_p1_q]; + + p_freq_old1[1] = *params[param_p2_freq]; + p_level_old1[1] = *params[param_p2_level]; + p_q_old1[1] = *params[param_p2_q]; + + p_freq_old1[2] = *params[param_p3_freq]; + p_level_old1[2] = *params[param_p3_level]; + p_q_old1[2] = *params[param_p3_q]; + + last_generation++; + subindex_graph = 0; + subindex_dot = INT_MAX; + subindex_gridline = INT_MAX; + } + else { + subindex_graph = 0; + subindex_dot = subindex_gridline = generation ? INT_MAX : 0; + } + if (generation == last_calculated_generation) + subindex_graph = INT_MAX; + return last_generation; + } + return false; +}