From b90ee67cfe41bba643ce03f890ddc5a8c18ee3bb Mon Sep 17 00:00:00 2001 From: Markus Schmidt Date: Tue, 29 Apr 2014 16:28:07 +0200 Subject: [PATCH] Hass Enhancer: Cleanup, added enhanced metering, added seamless bypass --- src/calf/metadata.h | 9 ++++----- src/calf/modulelist.h | 2 -- src/calf/modules_delay.h | 4 ++++ src/metadata.cpp | 40 ++++++++++++++++++++-------------------- src/modules_delay.cpp | 34 +++++++++++++++------------------- 5 files changed, 43 insertions(+), 46 deletions(-) diff --git a/src/calf/metadata.h b/src/calf/metadata.h index d371430..48a6651 100644 --- a/src/calf/metadata.h +++ b/src/calf/metadata.h @@ -88,14 +88,13 @@ struct comp_delay_metadata: public plugin_metadata struct haas_enhancer_metadata: public plugin_metadata { enum { + param_bypass, param_level_in, param_level_out, + par_s_gain, + STEREO_VU_METER_PARAMS, + param_meter_sideL, param_meter_sideR, par_m_source, par_m_phase, par_s_delay0, par_s_balance0, par_s_gain0, par_s_phase0, par_s_delay1, par_s_balance1, par_s_gain1, par_s_phase1, - par_m_gain, par_s_gain, - par_bypass, - - mtr_m, mtr_s_l, mtr_s_r, - param_count }; enum { in_count = 2, out_count = 2, ins_optional = 0, outs_optional = 0, rt_capable = true, support_midi = false, require_midi = false }; diff --git a/src/calf/modulelist.h b/src/calf/modulelist.h index 4eafc7b..88dce58 100644 --- a/src/calf/modulelist.h +++ b/src/calf/modulelist.h @@ -18,9 +18,7 @@ PER_MODULE_ITEM(reverb, false, "reverb") PER_MODULE_ITEM(vintage_delay, false, "vintagedelay") PER_MODULE_ITEM(comp_delay, true, "compdelay") -#ifdef ENABLE_EXPERIMENTAL PER_MODULE_ITEM(haas_enhancer, true, "haasenhancer") -#endif // dynamics PER_MODULE_ITEM(compressor, false, "compressor") diff --git a/src/calf/modules_delay.h b/src/calf/modules_delay.h index 698c464..f4dda58 100644 --- a/src/calf/modules_delay.h +++ b/src/calf/modules_delay.h @@ -25,6 +25,7 @@ #include #include #include "biquad.h" +#include "bypass.h" #include "inertia.h" #include "audio_fx.h" #include "giface.h" @@ -140,6 +141,9 @@ public: uint32_t buf_size; // guaranteed to be power of 2 uint32_t write_ptr; + dsp::bypass bypass; + vumeters meters; + uint32_t m_source, s_delay[2]; float s_bal_l[2], s_bal_r[2]; diff --git a/src/metadata.cpp b/src/metadata.cpp index 96fd701..446a7c9 100644 --- a/src/metadata.cpp +++ b/src/metadata.cpp @@ -245,37 +245,37 @@ CALF_PLUGIN_INFO(comp_delay) = { 0x8485, "CompensationDelay", "Calf Compensation CALF_PORT_NAMES(haas_enhancer) = {"In L", "In R", "Out L", "Out R"}; const char *haas_enhancer_source[] = { - "Left (L)", - "Right (R)", + "Left", + "Right", "Mid (L+R)", "Side (L-R)", "Mute", }; CALF_PORT_PROPS(haas_enhancer) = { - { 2, 0, 4, 1, PF_ENUM | PF_CTL_COMBO, haas_enhancer_source, "m_source", "Middle source" }, - { 0.0, 0.0, 1.0, 1.0, PF_BOOL | PF_CTL_TOGGLE, NULL, "m_phase", "Middle phase" }, - - { 2.05, 0.0, 10.0, 0.01, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB, NULL, "s_delay1", "Side channel 1 delay" }, - { 0.5, 0.0, 1.0, 0.01, PF_FLOAT | PF_SCALE_PERC | PF_CTL_KNOB, NULL, "s_balance1", "Side channel 1 balance" }, - { 1.0, 0.0, 10.0, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "s_gain1", "Side channel 1 gain" }, - { 0.0, 0.0, 1.0, 1.0, PF_BOOL | PF_CTL_TOGGLE, NULL, "s_phase1", "Side channel 1 phase" }, + BYPASS_AND_LEVEL_PARAMS + { 1.0, 0.015625, 64.0, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "s_gain", "Side gain" }, + METERING_PARAMS + + { 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_sideL", "Side 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_sideR", "Side R" }, + + { 2, 0, 4, 1, PF_ENUM | PF_CTL_COMBO, haas_enhancer_source, "m_source", "Middle source" }, + { 0.0, 0.0, 1.0, 1.0, PF_BOOL | PF_CTL_TOGGLE, NULL, "m_phase", "Middle phase" }, - { 2.12, 0.0, 10.0, 0.01, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB, NULL, "s_delay2", "Side channel 2 delay" }, - { 0.5, 0.0, 1.0, 0.01, PF_FLOAT | PF_SCALE_PERC | PF_CTL_KNOB, NULL, "s_balance2", "Side channel 2 balance" }, - { 1.0, 0.0, 10.0, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "s_gain2", "Side channel 2 gain" }, - { 1.0, 0.0, 1.0, 1.0, PF_BOOL | PF_CTL_TOGGLE, NULL, "s_phase2", "Side channel 2 phase" }, + { 2.05, 0.0, 10.0, 0.01, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB, NULL, "s_delay1", "Side channel 1 delay" }, + { 0.5, 0.0, 1.0, 0.01, PF_FLOAT | PF_SCALE_PERC | PF_CTL_KNOB, NULL, "s_balance1", "Side channel 1 balance" }, + { 1.0, 0.015625, 64.0, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB | PF_PROP_NOBOUNDS, NULL, "s_gain1", "Side channel 1 gain" }, + { 0.0, 0.0, 1.0, 1.0, PF_BOOL | PF_CTL_TOGGLE, NULL, "s_phase1", "Side channel 1 phase" }, - { 1.0, 0.0, 10.0, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "m_gain", "Middle gain" }, - { 1.0, 0.0, 10.0, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_COEF | PF_PROP_NOBOUNDS, NULL, "s_gain", "Side gain" }, - { 0, 0, 1, 0, PF_BOOL | PF_CTL_TOGGLE, NULL, "bypass", "Bypass" }, + { 2.12, 0.0, 10.0, 0.01, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB, NULL, "s_delay2", "Side channel 2 delay" }, + { 0.5, 0.0, 1.0, 0.01, PF_FLOAT | PF_SCALE_PERC | PF_CTL_KNOB, NULL, "s_balance2", "Side channel 2 balance" }, + { 1.0, 0.015625, 64.0, 0, PF_FLOAT | PF_SCALE_GAIN | PF_CTL_KNOB | PF_UNIT_DB | PF_PROP_NOBOUNDS, NULL, "s_gain2", "Side channel 2 gain" }, + { 1.0, 0.0, 1.0, 1.0, PF_BOOL | PF_CTL_TOGGLE, NULL, "s_phase2", "Side channel 2 phase" }, - { 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, "mtr_m", "Middle" }, - { 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, "mtr_s_l", "Side 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, "mtr_s_r", "Side R" }, {} }; -CALF_PLUGIN_INFO(haas_enhancer) = { 0x8486, "HaasEnhancer", "Calf HAAS Stereo Enhancer", "Vladimir Sadovnikov", calf_plugins::calf_copyright_info, "HaasPlugin" }; +CALF_PLUGIN_INFO(haas_enhancer) = { 0x8486, "HaasEnhancer", "Calf Haas Stereo Enhancer", "Vladimir Sadovnikov", calf_plugins::calf_copyright_info, "SpatialPlugin" }; //////////////////////////////////////////////////////////////////////////// diff --git a/src/modules_delay.cpp b/src/modules_delay.cpp index 0e19d6a..6c1a132 100644 --- a/src/modules_delay.cpp +++ b/src/modules_delay.cpp @@ -476,20 +476,26 @@ void haas_enhancer_audio_module::set_sample_rate(uint32_t sr) // Delete old buffer if (old_buf != NULL) delete [] old_buf; + + int meter[] = {param_meter_inL, param_meter_inR, param_meter_outL, param_meter_outR, -param_meter_sideL, -param_meter_sideR}; + int clip[] = {param_clip_inL, param_clip_inR, param_clip_outL, param_clip_outR, -1, -1}; + meters.init(params, meter, clip, 6, srate); } uint32_t haas_enhancer_audio_module::process(uint32_t offset, uint32_t numsamples, uint32_t inputs_mask, uint32_t outputs_mask) { - if (*params[par_bypass] > 0.5f) { + bool bypassed = bypass.update(*params[param_bypass] > 0.5f, numsamples); + if (bypassed) { while(offset < numsamples) { outs[0][offset] = ins[0][offset]; outs[1][offset] = ins[1][offset]; + float values[] = {0, 0, 0, 0, 0, 0}; + meters.process(values); ++offset; } } else { // Sample variables float mid, side[2], side_l, side_r; - float mtr_mid = 0.0, mtr_side_l = 0.0, mtr_side_r = 0.0; // Boundaries and pointers uint32_t b_mask = buf_size-1; @@ -516,37 +522,27 @@ uint32_t haas_enhancer_audio_module::process(uint32_t offset, uint32_t numsample buffer[w_ptr] = mid; // Calculate side - mid = mid * (*params[par_m_gain]); + mid = mid * *params[param_level_in]; side[0] = buffer[s0_ptr] * (*params[par_s_gain]); side[1] = buffer[s1_ptr] * (*params[par_s_gain]); side_l = side[0] * s_bal_l[0] - side[1] * s_bal_l[1]; side_r = side[1] * s_bal_r[1] - side[0] * s_bal_r[0]; // Output stereo image - outs[0][i] = mid + side_l; - outs[1][i] = mid + side_r; + outs[0][i] = (mid + side_l) * *params[param_level_out]; + outs[1][i] = (mid + side_r) * *params[param_level_out]; // Update pointers w_ptr = (w_ptr + 1) & b_mask; s0_ptr = (s0_ptr + 1) & b_mask; s1_ptr = (s1_ptr + 1) & b_mask; - // Update meters - if (mtr_mid < mid) - mtr_mid = mid; - if (mtr_side_l < side_l) - mtr_side_l = side_l; - if (mtr_side_r < side_r) - mtr_side_r = side_r; + float values[] = {ins[0][i], ins[1][i], outs[0][i], outs[1][i], side_l, side_r}; + meters.process (values); } - + bypass.crossfade(ins, outs, 2, offset, numsamples); write_ptr = w_ptr; - - // Output meters - *params[mtr_m] = mtr_mid; - *params[mtr_s_l] = mtr_side_l; - *params[mtr_s_r] = mtr_side_r; } - + meters.fall(numsamples); return outputs_mask; } -- 2.11.4.GIT