[SCM] calf/master: + Filterclavier: added gain control for bandpasses
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:39:00 UTC 2013
The following commit has been merged in the master branch:
commit 9e55b8492b7a87da6464379420fc19fde4d09069
Author: Hans Baier <hansfbaier at googlemail.com>
Date: Thu Jan 22 15:35:37 2009 +0700
+ Filterclavier: added gain control for bandpasses
diff --git a/src/calf/audio_fx.h b/src/calf/audio_fx.h
index 65528b8..7bcfa01 100644
--- a/src/calf/audio_fx.h
+++ b/src/calf/audio_fx.h
@@ -599,12 +599,14 @@ public:
class filter_module_iface
{
public:
- virtual void calculate_filter(float freq, float q, int mode) = 0;
+ virtual void calculate_filter(float freq, float q, int mode, float gain = 1.0) = 0;
virtual void filter_activate() = 0;
+ virtual void sanitize() = 0;
virtual int process_channel(uint16_t channel_no, float *in, float *out, uint32_t numsamples, int inmask) = 0;
virtual float freq_gain(int subindex, float freq, float srate) = 0;
};
+
class biquad_filter_module: public filter_module_iface
{
private:
@@ -614,17 +616,26 @@ private:
public:
uint32_t srate;
+ enum { mode_12db_lp = 0, mode_24db_lp = 1, mode_36db_lp = 2,
+ mode_12db_hp = 3, mode_24db_hp = 4, mode_36db_hp = 5,
+ mode_12db_bp = 6, mode_24db_bp = 7, mode_36db_bp = 8,
+ mode_count = 9
+ };
+
public:
biquad_filter_module() : order(0) {}
- void calculate_filter(float freq, float q, int mode)
+ void calculate_filter(float freq, float q, int mode, float gain = 1.0)
{
- if (mode < 3) {
+ if (mode <= mode_36db_lp) {
order = mode + 1;
- left[0].set_lp_rbj(freq, pow(q, 1.0 / order), srate);
- } else {
+ left[0].set_lp_rbj(freq, pow(q, 1.0 / order), srate, gain);
+ } else if ( mode_12db_hp <= mode && mode <= mode_36db_hp ) {
order = mode - 2;
- left[0].set_hp_rbj(freq, pow(q, 1.0 / order), srate);
+ left[0].set_hp_rbj(freq, pow(q, 1.0 / order), srate, gain);
+ } else { // mode_12db_bp <= mode <= mode_36db_bp
+ order = mode - 5;
+ left[0].set_bp_rbj(freq, pow(q, 1.0 / order), srate, gain);
}
right[0].copy_coeffs(left[0]);
@@ -642,6 +653,14 @@ public:
}
}
+ void sanitize()
+ {
+ for (int i=0; i < order; i++) {
+ left[i].sanitize();
+ right[i].sanitize();
+ }
+ }
+
inline int process_channel(uint16_t channel_no, float *in, float *out, uint32_t numsamples, int inmask) {
dsp::biquad_d1<float> *filter;
switch (channel_no) {
@@ -708,7 +727,7 @@ public:
{
float level = 1.0;
for (int j = 0; j < order; j++)
- level *= left[j].freq_gain(freq, srate);
+ level *= left[j].freq_gain(freq, srate);
return level;
}
};
diff --git a/src/calf/modules.h b/src/calf/modules.h
index ffe6870..2753881 100644
--- a/src/calf/modules.h
+++ b/src/calf/modules.h
@@ -585,13 +585,14 @@ public:
float *outs[Metadata::out_count];
float *params[Metadata::param_count];
- inertia<exponential_ramp> inertia_cutoff, inertia_resonance;
+ inertia<exponential_ramp> inertia_cutoff, inertia_resonance, inertia_gain;
once_per_n timer;
bool is_active;
filter_module_with_inertia()
: inertia_cutoff(exponential_ramp(128), 20)
, inertia_resonance(exponential_ramp(128), 20)
+ , inertia_gain(exponential_ramp(128), 1.0)
, timer(128)
{
is_active = false;
@@ -610,9 +611,10 @@ public:
if (inertia != inertia_cutoff.ramp.length()) {
inertia_cutoff.ramp.set_length(inertia);
inertia_resonance.ramp.set_length(inertia);
+ inertia_gain.ramp.set_length(inertia);
}
- FilterClass::calculate_filter(freq, q, mode);
+ FilterClass::calculate_filter(freq, q, mode, inertia_gain.get_last());
}
virtual void params_changed()
@@ -624,6 +626,7 @@ public:
{
inertia_cutoff.step();
inertia_resonance.step();
+ inertia_gain.step();
calculate_filter();
}
diff --git a/src/calf/modules_dev.h b/src/calf/modules_dev.h
index 578f674..f9162c5 100644
--- a/src/calf/modules_dev.h
+++ b/src/calf/modules_dev.h
@@ -37,9 +37,19 @@ class filterclavier_audio_module:
{
const float min_resonance;
const float max_resonance;
+ const float min_gain;
+ const float max_gain;
+
+ int last_note;
public:
- filterclavier_audio_module() : min_resonance(0.707), max_resonance(20.0) {}
+ filterclavier_audio_module()
+ :
+ min_resonance(0.707),
+ max_resonance(20.0),
+ min_gain(1.0),
+ max_gain(32.0),
+ last_note(-1) {}
void params_changed()
{
@@ -65,20 +75,44 @@ class filterclavier_audio_module:
/// MIDI control
virtual void note_on(int note, int vel)
{
+ last_note = note;
inertia_filter_module::inertia_cutoff.set_inertia(
note_to_hz(note + *params[par_transpose], *params[par_detune]));
+
inertia_filter_module::inertia_resonance.set_inertia(
(float(vel) / 127.0) * (max_resonance - min_resonance)
+ min_resonance);
+
+ int mode = dsp::fastf2i_drm(*params[par_mode]);
+ // for bandpasses: boost gain for velocities > 0
+ if ( (mode_12db_bp <= mode) && (mode <= mode_36db_bp) ) {
+ // gain for velocity 0: 1.0
+ // gain for velocity 127: 32.0
+ float mode_max_gain = max_gain;
+ // max_gain is right for mode_12db_bp
+ if (mode == mode_24db_bp)
+ mode_max_gain /= 6.0;
+ if (mode == mode_36db_bp)
+ mode_max_gain /= 10.5;
+
+ inertia_filter_module::inertia_gain.set_inertia(
+ (float(vel) / 127.0) * (mode_max_gain - min_gain) + min_gain);
+ } else {
+ inertia_filter_module::inertia_gain.set_inertia(min_gain);
+ }
+
inertia_filter_module::calculate_filter();
}
virtual void note_off(int note, int vel)
{
- inertia_filter_module::inertia_resonance.set_inertia(min_resonance);
- inertia_filter_module::calculate_filter();
- }
-
+ if (note == last_note) {
+ inertia_filter_module::inertia_resonance.set_inertia(min_resonance);
+ inertia_filter_module::inertia_gain.set_inertia(min_gain);
+ inertia_filter_module::calculate_filter();
+ }
+ }
+
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);
};
diff --git a/src/giface.cpp b/src/giface.cpp
index b047dce..c496ec1 100644
--- a/src/giface.cpp
+++ b/src/giface.cpp
@@ -298,7 +298,6 @@ static void send_graph_via_osc(osctl::osc_client &client, const std::string &add
client.send(address, os);
}
-#if USE_DSSI
calf_plugins::dssi_feedback_sender::dssi_feedback_sender(const char *URI, line_graph_iface *_graph, calf_plugins::parameter_properties *props, int num_params)
{
graph = _graph;
diff --git a/src/modules.cpp b/src/modules.cpp
index 7a02a1d..f2678fe 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -120,12 +120,15 @@ const char *filterclavier_choices[] = {
"12dB/oct Highpass",
"24dB/oct Highpass",
"36dB/oct Highpass",
+ "12dB/oct Bandpass", // TODO: are we lying here?
+ "24dB/oct Bandpass", // TODO: are we lying here?
+ "36dB/oct Bandpass", // TODO: are we lying here?
};
CALF_PORT_PROPS(filterclavier) = {
{ 0, -48, 48, 48*2+1, PF_INT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_SEMITONES, NULL, "transpose", "Transpose" },
{ 0, -100, 100, 0, PF_INT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_CENTS, NULL, "detune", "Detune" },
- { 0, 0, 5, 1, PF_ENUM | PF_CTL_COMBO, filterclavier_choices, "mode", "Mode" },
+ { 6, 0, 8, 1, PF_ENUM | PF_CTL_COMBO, filterclavier_choices, "mode", "Mode" },
{ 20, 1, 2000, 20, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "inertia", "Portamento time"}
};
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list