[PD-cvs] externals/iemlib/iemlib1/src FIR~.c, NONE, 1.1 biquad_freq_resp.c, NONE, 1.1 db2v.c, NONE, 1.1 f2note.c, NONE, 1.1 filter~.c, NONE, 1.1 for++.c, NONE, 1.1 gate.c, NONE, 1.1 hml_shelf~.c, NONE, 1.1 iem_cot4~.c, NONE, 1.1 iem_delay~.c, NONE, 1.1 iem_pow4~.c, NONE, 1.1 iem_sqrt4~.c, NONE, 1.1 iemlib.h, NONE, 1.1 iemlib1.c, NONE, 1.1 iemlib1.dsp, NONE, 1.1 iemlib1.dsw, NONE, 1.1 lp1_t~.c, NONE, 1.1 makefile, NONE, 1.1 makefile.darwin, NONE, 1.1 makefile_linux, NONE, 1.1 makefile_win, NONE, 1.1 mov_avrg_kern~.c, NONE, 1.1 para_bp2~.c, NONE, 1.1 peakenv~.c, NONE, 1.1 prvu~.c, NONE, 1.1 pvu~.c, NONE, 1.1 rvu~.c, NONE, 1.1 sin_phase~.c, NONE, 1.1 soundfile_info.c, NONE, 1.1 split.c, NONE, 1.1 v2db.c, NONE, 1.1 vcf_filter~.c, NONE, 1.1
musil
tmusil at users.sourceforge.net
Sat Dec 9 02:57:30 CET 2006
- Previous message: [PD-cvs] externals/iemlib/iemlib1 FIR~-help.pd, NONE, 1.1 db2v-help.pd, NONE, 1.1 f2note-help.pd, NONE, 1.1 for++-help.pd, NONE, 1.1 gate-help.pd, NONE, 1.1 hml_shelf~-help.pd, NONE, 1.1 lp1.wav, NONE, 1.1 lp1_t~-help.pd, NONE, 1.1 lp2.wav, NONE, 1.1 lp3.wav, NONE, 1.1 para_bp2~-help.pd, NONE, 1.1 peakenv~-help.pd, NONE, 1.1 prvu~-help.pd, NONE, 1.1 pvu~-help.pd, NONE, 1.1 rvu~-help.pd, NONE, 1.1 sin_phase~-help.pd, NONE, 1.1 soundfile_info-help.pd, NONE, 1.1 split-help.pd, NONE, 1.1 v2db-help.pd, NONE, 1.1
- Next message: [PD-cvs] externals/iemlib/iemlib2/src LFO_noise~.c, NONE, 1.1 add2_comma.c, NONE, 1.1 bpe.c, NONE, 1.1 dollarg.c, NONE, 1.1 exp_inc.c, NONE, 1.1
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Update of /cvsroot/pure-data/externals/iemlib/iemlib1/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16686/iemlib/iemlib1/src
Added Files:
FIR~.c biquad_freq_resp.c db2v.c f2note.c filter~.c for++.c
gate.c hml_shelf~.c iem_cot4~.c iem_delay~.c iem_pow4~.c
iem_sqrt4~.c iemlib.h iemlib1.c iemlib1.dsp iemlib1.dsw
lp1_t~.c makefile makefile.darwin makefile_linux makefile_win
mov_avrg_kern~.c para_bp2~.c peakenv~.c prvu~.c pvu~.c rvu~.c
sin_phase~.c soundfile_info.c split.c v2db.c vcf_filter~.c
Log Message:
// class_sethelpsymbol();
changed help-*.pd to *-help.pd
chanded file structure to standard
1st step remove old
--- NEW FILE: filter~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* ---------- filter~ - slow dynamic filter-kernel 1. and 2. order ----------- */
typedef struct _filter_tilde
{
t_object x_obj;
t_float wn1;
t_float wn2;
t_float a0;
t_float a1;
t_float a2;
t_float b1;
t_float b2;
t_float sr;
t_float cur_f;
t_float cur_l;
t_float cur_a;
t_float cur_b;
t_float delta_f;
t_float delta_a;
t_float delta_b;
t_float end_f;
t_float end_a;
t_float end_b;
t_float ticks_per_interpol_time;
t_float rcp_ticks;
t_float interpol_time;
int ticks;
int counter_f;
int counter_a;
int counter_b;
int inv;
int hp;
int first_order;
int event_mask;
void (*calc)();
void *x_debug_outlet;
t_atom x_at[5];
t_float x_msi;
} t_filter_tilde;
t_class *filter_tilde_class;
static void filter_tilde_snafu(t_filter_tilde *x)
{
}
static void filter_tilde_lp1(t_filter_tilde *x)
{
t_float al;
al = x->cur_a * x->cur_l;
x->a0 = 1.0f/(1.0f + al);
x->a1 = x->a0;
x->b1 = (al - 1.0f)*x->a0;
}
static void filter_tilde_lp2(t_filter_tilde *x)
{
t_float l, al, bl2, rcp;
l = x->cur_l;
al = l*x->cur_a;
bl2 = l*l*x->cur_b + 1.0f;
rcp = 1.0f/(al + bl2);
x->a0 = rcp;
x->a1 = 2.0f*rcp;
x->a2 = x->a0;
x->b1 = rcp*2.0f*(bl2 - 2.0f);
x->b2 = rcp*(al - bl2);
}
static void filter_tilde_hp1(t_filter_tilde *x)
{
t_float al, rcp;
al = x->cur_a * x->cur_l;
rcp = 1.0f/(1.0f + al);
x->a0 = rcp*al;
x->a1 = -x->a0;
x->b1 = rcp*(al - 1.0f);
}
static void filter_tilde_hp2(t_filter_tilde *x)
{
t_float l, al, bl2, rcp;
l = x->cur_l;
bl2 = l*l*x->cur_b + 1.0f;
al = l*x->cur_a;
rcp = 1.0f/(al + bl2);
x->a0 = rcp*(bl2 - 1.0f);
x->a1 = -2.0f*x->a0;
x->a2 = x->a0;
x->b1 = rcp*2.0f*(bl2 - 2.0f);
x->b2 = rcp*(al - bl2);
}
static void filter_tilde_rp2(t_filter_tilde *x)
{
t_float l, al, l2, rcp;
l = x->cur_l;
l2 = l*l + 1.0f;
al = l*x->cur_a;
rcp = 1.0f/(al + l2);
x->a0 = rcp*l;
x->a2 = -x->a0;
x->b1 = rcp*2.0f*(l2 - 2.0f);
x->b2 = rcp*(al - l2);
}
static void filter_tilde_bp2(t_filter_tilde *x)
{
t_float l, al, l2, rcp;
l = x->cur_l;
l2 = l*l + 1.0f;
al = l*x->cur_a;
rcp = 1.0f/(al + l2);
x->a0 = rcp*al;
x->a2 = -x->a0;
x->b1 = rcp*2.0f*(l2 - 2.0f);
x->b2 = rcp*(al - l2);
}
static void filter_tilde_bs2(t_filter_tilde *x)
{
t_float l, al, l2, rcp;
l = x->cur_l;
l2 = l*l + 1.0f;
al = l*x->cur_a;
rcp = 1.0f/(al + l2);
x->a0 = rcp*l2;
x->a1 = rcp*2.0f*(2.0f - l2);
x->a2 = x->a0;
x->b1 = -x->a1;
x->b2 = rcp*(al - l2);
}
static void filter_tilde_rpw2(t_filter_tilde *x)
{
t_float l, al, l2, rcp;
l = x->cur_l;
l2 = l*l + 1.0f;
al = l*x->cur_a/x->cur_f;
rcp = 1.0f/(al + l2);
x->a0 = rcp*l;
x->a2 = -x->a0;
x->b1 = rcp*2.0f*(l2 - 2.0f);
x->b2 = rcp*(al - l2);
}
static void filter_tilde_bpw2(t_filter_tilde *x)
{
t_float l, al, l2, rcp;
l = x->cur_l;
l2 = l*l + 1.0f;
al = l*x->cur_a/x->cur_f;
rcp = 1.0f/(al + l2);
x->a0 = rcp*al;
x->a2 = -x->a0;
x->b1 = rcp*2.0f*(l2 - 2.0f);
x->b2 = rcp*(al - l2);
}
static void filter_tilde_bsw2(t_filter_tilde *x)
{
t_float l, al, l2, rcp;
l = x->cur_l;
l2 = l*l + 1.0f;
al = l*x->cur_a/x->cur_f;
rcp = 1.0f/(al + l2);
x->a0 = rcp*l2;
x->a1 = rcp*2.0f*(2.0f - l2);
x->a2 = x->a0;
x->b1 = -x->a1;
x->b2 = rcp*(al - l2);
}
static void filter_tilde_ap1(t_filter_tilde *x)
{
t_float al;
al = x->cur_a * x->cur_l;
x->a0 = (1.0f - al)/(1.0f + al);
x->b1 = -x->a0;
}
static void filter_tilde_ap2(t_filter_tilde *x)
{
t_float l, al, bl2, rcp;
l = x->cur_l;
bl2 = l*l*x->cur_b + 1.0f;
al = l*x->cur_a;
rcp = 1.0f/(al + bl2);
x->a1 = rcp*2.0f*(2.0f - bl2);
x->a0 = rcp*(bl2 - al);
x->b1 = -x->a1;
x->b2 = -x->a0;
}
/*static void filter_tilde_bp2(t_filter_tilde *x)
{
t_float l, al, l2, rcp;
l = x->cur_l;
l2 = l*l + 1.0;
al = l*x->cur_a;
rcp = 1.0f/(al + l2);
x->a0 = rcp*al;
x->a2 = -x->a0;
x->b1 = rcp*2.0f*(2.0f - l2);
x->b2 = rcp*(l2 - al);
}*/
static void filter_tilde_dsp_tick(t_filter_tilde *x)
{
if(x->event_mask)
{
if(x->counter_f)
{
float l, si, co;
if(x->counter_f <= 1)
{
x->cur_f = x->end_f;
x->counter_f = 0;
x->event_mask &= 6;/*set event_mask_bit 0 = 0*/
}
else
{
x->counter_f--;
x->cur_f *= x->delta_f;
}
l = x->cur_f * x->sr;
if(l < 1.0e-20f)
x->cur_l = 1.0e20f;
else if(l > 1.57079632f)
x->cur_l = 0.0f;
else
{
si = sin(l);
co = cos(l);
x->cur_l = co/si;
}
}
if(x->counter_a)
{
if(x->counter_a <= 1)
{
x->cur_a = x->end_a;
x->counter_a = 0;
x->event_mask &= 5;/*set event_mask_bit 1 = 0*/
}
else
{
x->counter_a--;
x->cur_a *= x->delta_a;
}
}
if(x->counter_b)
{
if(x->counter_b <= 1)
{
x->cur_b = x->end_b;
x->counter_b = 0;
x->event_mask &= 3;/*set event_mask_bit 2 = 0*/
}
else
{
x->counter_b--;
x->cur_b *= x->delta_b;
}
}
(*(x->calc))(x);
/* stability check */
if(x->first_order)
{
if(x->b1 <= -0.9999998f)
x->b1 = -0.9999998f;
else if(x->b1 >= 0.9999998f)
x->b1 = 0.9999998f;
}
else
{
float discriminant = x->b1 * x->b1 + 4.0f * x->b2;
if(x->b1 <= -1.9999996f)
x->b1 = -1.9999996f;
else if(x->b1 >= 1.9999996f)
x->b1 = 1.9999996f;
if(x->b2 <= -0.9999998f)
x->b2 = -0.9999998f;
else if(x->b2 >= 0.9999998f)
x->b2 = 0.9999998f;
if(discriminant >= 0.0f)
{
if(0.9999998f - x->b1 - x->b2 < 0.0f)
x->b2 = 0.9999998f - x->b1;
if(0.9999998f + x->b1 - x->b2 < 0.0f)
x->b2 = 0.9999998f + x->b1;
}
}
}
}
static t_int *filter_tilde_perform_2o(t_int *w)
{
t_float *in = (float *)(w[1]);
t_float *out = (float *)(w[2]);
t_filter_tilde *x = (t_filter_tilde *)(w[3]);
int i, n = (t_int)(w[4]);
t_float wn0, wn1=x->wn1, wn2=x->wn2;
t_float a0=x->a0, a1=x->a1, a2=x->a2;
t_float b1=x->b1, b2=x->b2;
filter_tilde_dsp_tick(x);
for(i=0; i<n; i++)
{
wn0 = *in++ + b1*wn1 + b2*wn2;
*out++ = a0*wn0 + a1*wn1 + a2*wn2;
wn2 = wn1;
wn1 = wn0;
}
/* NAN protect */
if(IEM_DENORMAL(wn2))
wn2 = 0.0f;
if(IEM_DENORMAL(wn1))
wn1 = 0.0f;
x->wn1 = wn1;
x->wn2 = wn2;
return(w+5);
}
/* yn0 = *out;
xn0 = *in;
*************
yn0 = a0*xn0 + a1*xn1 + a2*xn2 + b1*yn1 + b2*yn2;
yn2 = yn1;
yn1 = yn0;
xn2 = xn1;
xn1 = xn0;
*************************
y/x = (a0 + a1*z-1 + a2*z-2)/(1 - b1*z-1 - b2*z-2);*/
static t_int *filter_tilde_perf8_2o(t_int *w)
{
t_float *in = (float *)(w[1]);
t_float *out = (float *)(w[2]);
t_filter_tilde *x = (t_filter_tilde *)(w[3]);
int i, n = (t_int)(w[4]);
t_float wn[10];
t_float a0=x->a0, a1=x->a1, a2=x->a2;
t_float b1=x->b1, b2=x->b2;
filter_tilde_dsp_tick(x);
wn[0] = x->wn2;
wn[1] = x->wn1;
for(i=0; i<n; i+=8, in+=8, out+=8)
{
wn[2] = in[0] + b1*wn[1] + b2*wn[0];
out[0] = a0*wn[2] + a1*wn[1] + a2*wn[0];
wn[3] = in[1] + b1*wn[2] + b2*wn[1];
out[1] = a0*wn[3] + a1*wn[2] + a2*wn[1];
wn[4] = in[2] + b1*wn[3] + b2*wn[2];
out[2] = a0*wn[4] + a1*wn[3] + a2*wn[2];
wn[5] = in[3] + b1*wn[4] + b2*wn[3];
out[3] = a0*wn[5] + a1*wn[4] + a2*wn[3];
wn[6] = in[4] + b1*wn[5] + b2*wn[4];
out[4] = a0*wn[6] + a1*wn[5] + a2*wn[4];
wn[7] = in[5] + b1*wn[6] + b2*wn[5];
out[5] = a0*wn[7] + a1*wn[6] + a2*wn[5];
wn[8] = in[6] + b1*wn[7] + b2*wn[6];
out[6] = a0*wn[8] + a1*wn[7] + a2*wn[6];
wn[9] = in[7] + b1*wn[8] + b2*wn[7];
out[7] = a0*wn[9] + a1*wn[8] + a2*wn[7];
wn[0] = wn[8];
wn[1] = wn[9];
}
/* NAN protect */
if(IEM_DENORMAL(wn[0]))
wn[0] = 0.0f;
if(IEM_DENORMAL(wn[1]))
wn[1] = 0.0f;
x->wn1 = wn[1];
x->wn2 = wn[0];
return(w+5);
}
static t_int *filter_tilde_perform_1o(t_int *w)
{
t_float *in = (float *)(w[1]);
t_float *out = (float *)(w[2]);
t_filter_tilde *x = (t_filter_tilde *)(w[3]);
int i, n = (t_int)(w[4]);
t_float wn0, wn1=x->wn1;
t_float a0=x->a0, a1=x->a1;
t_float b1=x->b1;
filter_tilde_dsp_tick(x);
for(i=0; i<n; i++)
{
wn0 = *in++ + b1*wn1;
*out++ = a0*wn0 + a1*wn1;
wn1 = wn0;
}
/* NAN protect */
if(IEM_DENORMAL(wn1))
wn1 = 0.0f;
x->wn1 = wn1;
return(w+5);
}
static t_int *filter_tilde_perf8_1o(t_int *w)
{
t_float *in = (float *)(w[1]);
t_float *out = (float *)(w[2]);
t_filter_tilde *x = (t_filter_tilde *)(w[3]);
int i, n = (t_int)(w[4]);
t_float wn[9];
t_float a0=x->a0, a1=x->a1;
t_float b1=x->b1;
filter_tilde_dsp_tick(x);
wn[0] = x->wn1;
for(i=0; i<n; i+=8, in+=8, out+=8)
{
wn[1] = in[0] + b1*wn[0];
out[0] = a0*wn[1] + a1*wn[0];
wn[2] = in[1] + b1*wn[1];
out[1] = a0*wn[2] + a1*wn[1];
wn[3] = in[2] + b1*wn[2];
out[2] = a0*wn[3] + a1*wn[2];
wn[4] = in[3] + b1*wn[3];
out[3] = a0*wn[4] + a1*wn[3];
wn[5] = in[4] + b1*wn[4];
out[4] = a0*wn[5] + a1*wn[4];
wn[6] = in[5] + b1*wn[5];
out[5] = a0*wn[6] + a1*wn[5];
wn[7] = in[6] + b1*wn[6];
out[6] = a0*wn[7] + a1*wn[6];
wn[8] = in[7] + b1*wn[7];
out[7] = a0*wn[8] + a1*wn[7];
wn[0] = wn[8];
}
/* NAN protect */
if(IEM_DENORMAL(wn[0]))
wn[0] = 0.0f;
x->wn1 = wn[0];
return(w+5);
}
static void filter_tilde_ft4(t_filter_tilde *x, t_floatarg t)
{
int i = (int)((x->ticks_per_interpol_time)*t+0.49999f);
x->interpol_time = t;
if(i <= 0)
{
x->ticks = 1;
x->rcp_ticks = 1.0;
}
else
{
x->ticks = i;
x->rcp_ticks = 1.0 / (t_float)i;
}
}
static void filter_tilde_ft3(t_filter_tilde *x, t_floatarg b)
{
if(b <= 0.0f)
b = 0.000001f;
if(x->hp)
b = 1.0 / b;
if(b != x->cur_b)
{
x->end_b = b;
x->counter_b = x->ticks;
x->delta_b = exp(log(b/x->cur_b)*x->rcp_ticks);
x->event_mask |= 4;/*set event_mask_bit 2 = 1*/
}
}
static void filter_tilde_ft2(t_filter_tilde *x, t_floatarg a)
{
if(a <= 0.0f)
a = 0.000001f;
if(x->inv)
a = 1.0f / a;
if(x->hp)
a /= x->cur_b;
if(a != x->cur_a)
{
x->end_a = a;
x->counter_a = x->ticks;
x->delta_a = exp(log(a/x->cur_a)*x->rcp_ticks);
x->event_mask |= 2;/*set event_mask_bit 1 = 1*/
}
}
static void filter_tilde_ft1(t_filter_tilde *x, t_floatarg f)
{
if(f <= 0.0f)
f = 0.000001f;
if(f != x->cur_f)
{
x->end_f = f;
x->counter_f = x->ticks;
x->delta_f = exp(log(f/x->cur_f)*x->rcp_ticks);
x->event_mask |= 1;/*set event_mask_bit 0 = 1*/
}
}
static void filter_tilde_print(t_filter_tilde *x)
{
// post("fb1 = %g, fb2 = %g, ff1 = %g, ff2 = %g, ff3 = %g", x->b1, x->b2, x->a0, x->a1, x->a2);
x->x_at[0].a_w.w_float = x->b1;
x->x_at[1].a_w.w_float = x->b2;
x->x_at[2].a_w.w_float = x->a0;
x->x_at[3].a_w.w_float = x->a1;
x->x_at[4].a_w.w_float = x->a2;
outlet_list(x->x_debug_outlet, &s_list, 5, x->x_at);
}
static void filter_tilde_dsp(t_filter_tilde *x, t_signal **sp)
{
t_float si, co, f;
int i, n=(int)sp[0]->s_n;
x->sr = 3.14159265358979323846f / (t_float)(sp[0]->s_sr);
x->ticks_per_interpol_time = 0.001f * (t_float)(sp[0]->s_sr) / (t_float)n;
i = (int)((x->ticks_per_interpol_time)*(x->interpol_time)+0.49999f);
if(i <= 0)
{
x->ticks = 1;
x->rcp_ticks = 1.0f;
}
else
{
x->ticks = i;
x->rcp_ticks = 1.0f / (t_float)i;
}
f = x->cur_f * x->sr;
if(f < 1.0e-20f)
x->cur_l = 1.0e20f;
else if(f > 1.57079632f)
x->cur_l = 0.0f;
else
{
si = sin(f);
co = cos(f);
x->cur_l = co/si;
}
if(x->first_order)
{
if(n&7)
dsp_add(filter_tilde_perform_1o, 4, sp[0]->s_vec, sp[1]->s_vec, x, n);
else
dsp_add(filter_tilde_perf8_1o, 4, sp[0]->s_vec, sp[1]->s_vec, x, n);
}
else
{
if(n&7)
dsp_add(filter_tilde_perform_2o, 4, sp[0]->s_vec, sp[1]->s_vec, x, n);
else
dsp_add(filter_tilde_perf8_2o, 4, sp[0]->s_vec, sp[1]->s_vec, x, n);
}
}
static void *filter_tilde_new(t_symbol *s, int argc, t_atom *argv)
{
t_filter_tilde *x = (t_filter_tilde *)pd_new(filter_tilde_class);
int i;
t_float si, co, f=0.0f, a=0.0f, b=0.0f, interpol=0.0f;
t_symbol *filt_typ=gensym("");
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft2"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft3"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft4"));
outlet_new(&x->x_obj, &s_signal);
x->x_debug_outlet = outlet_new(&x->x_obj, &s_list);
x->x_msi = 0.0f;
x->x_at[0].a_type = A_FLOAT;
x->x_at[1].a_type = A_FLOAT;
x->x_at[2].a_type = A_FLOAT;
x->x_at[3].a_type = A_FLOAT;
x->x_at[4].a_type = A_FLOAT;
x->event_mask = 1;
x->counter_f = 1;
x->counter_a = 0;
x->counter_b = 0;
x->delta_f = 0.0f;
x->delta_a = 0.0f;
x->delta_b = 0.0f;
x->interpol_time = 0.0f;
x->wn1 = 0.0f;
x->wn2 = 0.0f;
x->a0 = 0.0f;
x->a1 = 0.0f;
x->a2 = 0.0f;
x->b1 = 0.0f;
x->b2 = 0.0f;
x->sr = 3.14159265358979323846f / 44100.0f;
x->calc = filter_tilde_snafu;
x->first_order = 0;
if((argc == 5)&&IS_A_FLOAT(argv,4)&&IS_A_FLOAT(argv,3)&&IS_A_FLOAT(argv,2)&&IS_A_FLOAT(argv,1)&&IS_A_SYMBOL(argv,0))
{
filt_typ = atom_getsymbolarg(0, argc, argv);
f = (t_float)atom_getfloatarg(1, argc, argv);
a = (t_float)atom_getfloatarg(2, argc, argv);
b = (t_float)atom_getfloatarg(3, argc, argv);
interpol = (t_float)atom_getfloatarg(4, argc, argv);
}
x->cur_f = f;
f *= x->sr;
if(f < 1.0e-20f)
x->cur_l = 1.0e20f;
else if(f > 1.57079632f)
x->cur_l = 0.0f;
else
{
si = sin(f);
co = cos(f);
x->cur_l = co/si;
}
if(a <= 0.0f)
a = 0.000001f;
if(b <= 0.0f)
b = 0.000001f;
x->cur_b = b;
if(interpol <= 0.0f)
interpol = 0.0f;
x->interpol_time = interpol;
x->ticks_per_interpol_time = 0.001f * 44100.0f / 64.0f;
i = (int)((x->ticks_per_interpol_time)*(x->interpol_time)+0.49999f);
if(i <= 0)
{
x->ticks = 1;
x->rcp_ticks = 1.0f;
}
else
{
x->ticks = i;
x->rcp_ticks = 1.0f / (t_float)i;
}
x->calc = filter_tilde_snafu;
x->cur_a = 1.0f/a; /*a was Q*/
x->inv = 1;
x->hp = 0;
if(filt_typ->s_name)
{
if(filt_typ == gensym("ap1"))
{
x->calc = filter_tilde_ap1;
x->a1 = 1.0f;
x->first_order = 1;
}
else if(filt_typ == gensym("ap2"))
{
x->calc = filter_tilde_ap2;
x->a2 = 1.0f;
}
else if(filt_typ == gensym("ap1c"))
{
x->calc = filter_tilde_ap1;
x->a1 = 1.0f;
x->inv = 0;
x->cur_a = a; /*a was damping*/
x->first_order = 1;
}
else if(filt_typ == gensym("ap2c"))
{
x->calc = filter_tilde_ap2;
x->a2 = 1.0f;
x->inv = 0;
x->cur_a = a; /*a was damping*/
}
else if(filt_typ == gensym("bpq2"))
{
x->calc = filter_tilde_bp2;
}
else if(filt_typ == gensym("rbpq2"))
{
x->calc = filter_tilde_rp2;
}
else if(filt_typ == gensym("bsq2"))
{
x->calc = filter_tilde_bs2;
}
else if(filt_typ == gensym("bpw2"))
{
x->calc = filter_tilde_bpw2;
x->inv = 0;
x->cur_a = a; /*a was bw*/
}
else if(filt_typ == gensym("rbpw2"))
{
x->calc = filter_tilde_rpw2;
x->inv = 0;
x->cur_a = a; /*a was bw*/
}
else if(filt_typ == gensym("bsw2"))
{
x->calc = filter_tilde_bsw2;
x->inv = 0;
x->cur_a = a; /*a was bw*/
}
else if(filt_typ == gensym("hp1"))
{
x->calc = filter_tilde_hp1;
x->first_order = 1;
}
else if(filt_typ == gensym("hp2"))
{
x->calc = filter_tilde_hp2;
}
else if(filt_typ == gensym("lp1"))
{
x->calc = filter_tilde_lp1;
x->first_order = 1;
}
else if(filt_typ == gensym("lp2"))
{
x->calc = filter_tilde_lp2;
}
else if(filt_typ == gensym("hp1c"))
{
x->calc = filter_tilde_hp1;
x->cur_a = 1.0f / a;
x->first_order = 1;
}
else if(filt_typ == gensym("hp2c"))
{
x->calc = filter_tilde_hp2;
x->inv = 0;
x->cur_a = a / b;
x->cur_b = 1.0f / b;
x->hp = 1;
}
else if(filt_typ == gensym("lp1c"))
{
x->calc = filter_tilde_lp1;
x->inv = 0;
x->cur_a = a; /*a was damping*/
x->first_order = 1;
}
else if(filt_typ == gensym("lp2c"))
{
x->calc = filter_tilde_lp2;
x->inv = 0;
x->cur_a = a; /*a was damping*/
}
else
{
post("filter~-Error: 1. initial-arguments: <sym> kind: \
lp1, lp2, hp1, hp2, \
lp1c, lp2c, hp1c, hp2c, \
ap1, ap2, ap1c, ap2c, \
bpq2, rbpq2, bsq2, \
bpw2, rbpw2, bsw2!");
}
x->end_f = x->cur_f;
x->end_a = x->cur_a;
x->end_b = x->cur_b;
}
return (x);
}
void filter_tilde_setup(void)
{
filter_tilde_class = class_new(gensym("filter~"), (t_newmethod)filter_tilde_new,
0, sizeof(t_filter_tilde), 0, A_GIMME, 0);
CLASS_MAINSIGNALIN(filter_tilde_class, t_filter_tilde, x_msi);
class_addmethod(filter_tilde_class, (t_method)filter_tilde_dsp, gensym("dsp"), 0);
class_addmethod(filter_tilde_class, (t_method)filter_tilde_ft1, gensym("ft1"), A_FLOAT, 0);
class_addmethod(filter_tilde_class, (t_method)filter_tilde_ft2, gensym("ft2"), A_FLOAT, 0);
class_addmethod(filter_tilde_class, (t_method)filter_tilde_ft3, gensym("ft3"), A_FLOAT, 0);
class_addmethod(filter_tilde_class, (t_method)filter_tilde_ft4, gensym("ft4"), A_FLOAT, 0);
class_addmethod(filter_tilde_class, (t_method)filter_tilde_print, gensym("print"), 0);
// class_sethelpsymbol(filter_tilde_class, gensym("iemhelp/help-filter~"));
}
--- NEW FILE: makefile_linux ---
current: all
.SUFFIXES: .pd_linux
INCLUDE = -I. -I/usr/local/src/pd/src
LDFLAGS = -export-dynamic -shared
LIB = -ldl -lm -lpthread
#select either the DBG and OPT compiler flags below:
CFLAGS = -DPD -DUNIX -W -Werror -Wno-unused \
-Wno-parentheses -Wno-switch -O6 -funroll-loops -fomit-frame-pointer -fno-strict-aliasing \
-DDL_OPEN
SYSTEM = $(shell uname -m)
# the sources
SRC = biquad_freq_resp.c \
db2v.c \
f2note.c \
filter~.c \
FIR~.c \
forpp.c \
gate.c \
hml_shelf~.c \
iem_cot4~.c \
iem_delay~.c \
iem_pow4~.c \
iem_sqrt4~.c \
lp1_t~.c \
mov_avrg_kern~.c \
para_bp2~.c \
peakenv~.c \
prvu~.c \
pvu~.c \
rvu~.c \
sin_phase~.c \
soundfile_info.c \
split.c \
v2db.c \
vcf_filter~.c \
iemlib1.c
TARGET = iemlib1.pd_linux
OBJ = $(SRC:.c=.o)
#
# ------------------ targets ------------------------------------
#
clean:
rm $(TARGET)
rm *.o
all: $(OBJ)
@echo :: $(OBJ)
$(LD) $(LDFLAGS) -o $(TARGET) *.o $(LIB)
strip --strip-unneeded $(TARGET)
$(OBJ) : %.o : %.c
$(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c
--- NEW FILE: soundfile_info.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#define SFI_HEADER_SAMPLERATE 0
#define SFI_HEADER_FILENAME 1
#define SFI_HEADER_MULTICHANNEL_FILE_LENGTH 2
#define SFI_HEADER_HEADERBYTES 3
#define SFI_HEADER_CHANNELS 4
#define SFI_HEADER_BYTES_PER_SAMPLE 5
#define SFI_HEADER_ENDINESS 6
#define SFI_HEADER_SIZE 7
/* --------------------------- soundfile_info -------------------------------- */
/* -- reads only header of a wave-file and outputs the important parameters -- */
static t_class *soundfile_info_class;
typedef struct _soundfile_info
{
t_object x_obj;
long *x_begmem;
int x_size;
t_atom x_atheader[SFI_HEADER_SIZE];
t_canvas *x_canvas;
void *x_list_out;
} t_soundfile_info;
static short soundfile_info_str2short(char *cvec)
{
short s=0;
unsigned char *uc=(unsigned char *)cvec;
s += (short)(*uc);
s += (short)(*(uc+1)*256);
return(s);
}
static long soundfile_info_str2long(char *cvec)
{
long l=0;
unsigned char *uc=(unsigned char *)cvec;
l += (long)(*uc);
l += (long)(*(uc+1)*256);
l += (long)(*(uc+2)*65536);
l += (long)(*(uc+3)*16777216);
return(l);
}
static void soundfile_info_read(t_soundfile_info *x, t_symbol *filename)
{
char completefilename[400];
int i, n, n2, n4, filesize, read_chars, header_size=0, ch, bps, sr;
FILE *fh;
t_atom *at;
char *cvec;
long ll;
short ss;
if(filename->s_name[0] == '/')/*make complete path + filename*/
{
strcpy(completefilename, filename->s_name);
}
else if(((filename->s_name[0] >= 'A')&&(filename->s_name[0] <= 'Z')||
(filename->s_name[0] >= 'a')&&(filename->s_name[0] <= 'z'))&&
(filename->s_name[1] == ':')&&(filename->s_name[2] == '/'))
{
strcpy(completefilename, filename->s_name);
}
else
{
strcpy(completefilename, canvas_getdir(x->x_canvas)->s_name);
strcat(completefilename, "/");
strcat(completefilename, filename->s_name);
}
fh = fopen(completefilename,"rb");
if(!fh)
{
post("soundfile_info_read: cannot open %s !!\n", completefilename);
}
else
{
n = x->x_size;
n2 = sizeof(short) * x->x_size;
n4 = sizeof(long) * x->x_size;
fseek(fh, 0, SEEK_END);
filesize = ftell(fh);
fseek(fh,0,SEEK_SET);
read_chars = (int)fread(x->x_begmem, sizeof(char), n4, fh) /2;
fclose(fh);
// post("read chars = %d", read_chars);
cvec = (char *)x->x_begmem;
if(read_chars > 4)
{
if(strncmp(cvec, "RIFF", 4))
{
post("soundfile_info_read-error: %s is no RIFF-WAVE-file", completefilename);
goto soundfile_info_end;
}
header_size += 8;
cvec += 8;
if(strncmp(cvec, "WAVE", 4))
{
post("soundfile_info_read-error: %s is no RIFF-WAVE-file", completefilename);
goto soundfile_info_end;
}
header_size += 4;
cvec += 4;
for(i=header_size/2; i<read_chars; i++)
{
if(!strncmp(cvec, "fmt ", 4))
goto soundfile_info_fmt;
header_size += 2;
cvec += 2;
}
post("soundfile_info_read-error: %s has at begin no format-chunk", completefilename);
goto soundfile_info_end;
soundfile_info_fmt:
header_size += 4;
cvec += 4;
ll = soundfile_info_str2long(cvec);
if(ll != 16)
{
post("soundfile_info_read-error: %s has a format-chunk not equal to 16", completefilename);
goto soundfile_info_end;
}
header_size += 4;
cvec += 4;
ss = soundfile_info_str2short(cvec);
/* format */
if(ss != 1) /* PCM = 1 */
{
post("soundfile_info_read-error: %s is not PCM-format coded", completefilename);
goto soundfile_info_end;
}
header_size += 2;
cvec += 2;
ss = soundfile_info_str2short(cvec);
/* channels */
if((ss < 1) || (ss > 100))
{
post("soundfile_info_read-error: %s has no common channel-number", completefilename);
goto soundfile_info_end;
}
SETFLOAT(x->x_atheader+SFI_HEADER_CHANNELS, (t_float)ss);
ch = ss;
header_size += 2;
cvec += 2;
ll = soundfile_info_str2long(cvec);
/* samplerate */
if((ll > 400000) || (ll < 200))
{
post("soundfile_info_read-error: %s has no common samplerate", completefilename);
goto soundfile_info_end;
}
SETFLOAT(x->x_atheader+SFI_HEADER_SAMPLERATE, (t_float)ll);
sr = ll;
header_size += 4;
cvec += 4;
header_size += 4; /* bytes_per_sec */
cvec += 4;
ss = soundfile_info_str2short(cvec);
/* bytes_per_sample */
if((ss < 1) || (ss > 100))
{
post("soundfile_info_read-error: %s has no common number of bytes per sample", completefilename);
goto soundfile_info_end;
}
SETFLOAT(x->x_atheader+SFI_HEADER_BYTES_PER_SAMPLE, (t_float)(ss/ch));
bps = ss;
header_size += 2;
cvec += 2;
header_size += 2; /* bits_per_sample */
cvec += 2;
for(i=header_size/2; i<read_chars; i++)
{
if(!strncmp(cvec, "data", 4))
goto soundfile_info_data;
header_size += 2;
cvec += 2;
}
post("soundfile_info_read-error: %s has at begin no data-chunk", completefilename);
goto soundfile_info_end;
soundfile_info_data:
header_size += 8;
cvec += 8;
SETFLOAT(x->x_atheader+SFI_HEADER_HEADERBYTES, (t_float)header_size);
filesize -= header_size;
filesize /= bps;
SETFLOAT(x->x_atheader+SFI_HEADER_MULTICHANNEL_FILE_LENGTH, (t_float)filesize);
SETSYMBOL(x->x_atheader+SFI_HEADER_ENDINESS, gensym("l"));
SETSYMBOL(x->x_atheader+SFI_HEADER_FILENAME, gensym(completefilename));
/* post("ch = %d", ss);
post("sr = %d", ll);
post("bps = %d", ss/ch);
post("head = %d", header_size);
post("len = %d", filesize);*/
outlet_list(x->x_list_out, &s_list, SFI_HEADER_SIZE, x->x_atheader);
soundfile_info_end:
;
}
}
}
static void soundfile_info_free(t_soundfile_info *x)
{
freebytes(x->x_begmem, x->x_size * sizeof(long));
}
static void *soundfile_info_new(void)
{
t_soundfile_info *x = (t_soundfile_info *)pd_new(soundfile_info_class);
x->x_size = 10000;
x->x_begmem = (long *)getbytes(x->x_size * sizeof(long));
x->x_list_out = outlet_new(&x->x_obj, &s_list);
x->x_canvas = canvas_getcurrent();
return (x);
}
/* ---------------- global setup function -------------------- */
void soundfile_info_setup(void)
{
soundfile_info_class = class_new(gensym("soundfile_info"), (t_newmethod)soundfile_info_new,
(t_method)soundfile_info_free, sizeof(t_soundfile_info), 0, 0);
class_addmethod(soundfile_info_class, (t_method)soundfile_info_read, gensym("read"), A_SYMBOL, 0);
// class_sethelpsymbol(soundfile_info_class, gensym("iemhelp/help-soundfile_info"));
}
--- NEW FILE: iem_pow4~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* ------------------------ iem_pow4~ ----------------------------- */
static t_class *iem_pow4_tilde_class;
typedef struct _iem_pow4_tilde
{
t_object x_obj;
t_float x_exp;
t_float x_msi;
} t_iem_pow4_tilde;
static void iem_pow4_tilde_ft1(t_iem_pow4_tilde *x, t_floatarg f)
{
x->x_exp = f;
}
static t_int *iem_pow4_tilde_perform(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[2]);
t_iem_pow4_tilde *x = (t_iem_pow4_tilde *)(w[3]);
t_float y=x->x_exp;
t_float f, g;
int n = (int)(w[4])/4;
while (n--)
{
f = *in;
if(f < 0.01f)
f = 0.01f;
else if(f > 1000.0f)
f = 1000.0f;
g = log(f);
f = exp(g*y);
*out++ = f;
*out++ = f;
*out++ = f;
*out++ = f;
in += 4;
}
return (w+5);
}
static void iem_pow4_tilde_dsp(t_iem_pow4_tilde *x, t_signal **sp)
{
dsp_add(iem_pow4_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n);
}
static void *iem_pow4_tilde_new(t_floatarg f)
{
t_iem_pow4_tilde *x = (t_iem_pow4_tilde *)pd_new(iem_pow4_tilde_class);
x->x_exp = f;
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
outlet_new(&x->x_obj, gensym("signal"));
x->x_msi = 0;
return (x);
}
void iem_pow4_tilde_setup(void)
{
iem_pow4_tilde_class = class_new(gensym("iem_pow4~"), (t_newmethod)iem_pow4_tilde_new, 0,
sizeof(t_iem_pow4_tilde), 0, A_DEFFLOAT, 0);
class_addcreator((t_newmethod)iem_pow4_tilde_new, gensym("icot~"), 0);
CLASS_MAINSIGNALIN(iem_pow4_tilde_class, t_iem_pow4_tilde, x_msi);
class_addmethod(iem_pow4_tilde_class, (t_method)iem_pow4_tilde_dsp, gensym("dsp"), 0);
class_addmethod(iem_pow4_tilde_class, (t_method)iem_pow4_tilde_ft1, gensym("ft1"), A_FLOAT, 0);
// class_sethelpsymbol(iem_pow4_tilde_class, gensym("iemhelp/help-iem_pow4~"));
}
--- NEW FILE: makefile.darwin ---
current: all
.SUFFIXES: .pd_darwin
INCLUDE = -I. -I/usr/local/src/pd/src
LDFLAGS = -export-dynamic -shared
LIB = -ldl -lm -lpthread
#select either the DBG and OPT compiler flags below:
CFLAGS = -DPD -DUNIX -g -Wall -W -Werror -Wno-unused \
-Wno-parentheses -Wno-switch -O2 -fno-strict-aliasing \
$(INCLUDE) $(UCFLAGS) $(AFLAGS) \
MACOSXLINKFLAGS = -bundle -bundle_loader /usr/local/src/pd/bin/pd
SYSTEM = $(shell uname -m)
# the sources
SRC = biquad_freq_resp.c \
db2v.c \
f2note.c \
filter~.c \
FIR~.c \
forpp.c \
gate.c \
hml_shelf~.c \
iem_cot4~.c \
iem_delay~.c \
iem_pow4~.c \
iem_sqrt4~.c \
lp1_t~.c \
mov_avrg_kern~.c \
para_bp2~.c \
peakenv~.c \
prvu~.c \
pvu~.c \
rvu~.c \
sin_phase~.c \
soundfile_info.c \
split.c \
v2db.c \
vcf_filter~.c \
iemlib1.c
TARGET = iemlib1.pd_darwin
OBJ = $(SRC:.c=.o)
#
# ------------------ targets ------------------------------------
#
clean:
rm ../../lib/$(TARGET)
rm *.o
all: $(OBJ)
@echo :: $(OBJ)
$(CC) $(MACOSXLINKFLAGS) -o $(TARGET) *.o $(LIB)
strip --strip-unneeded $(TARGET)
mv $(TARGET) ../../lib
$(OBJ) : %.o : %.c
touch $*.c
$(CC) $(CFLAGS) -DPD $(INCLUDE) -c -o $*.o $*.c
--- NEW FILE: makefile_win ---
all: ..\iemlib1.dll
VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98"
PD_INST_PATH = "C:\Programme\pd-0.39-2"
PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include
PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN
PD_WIN_L_FLAGS = /nologo
PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \
$(VIS_CPP_PATH)\lib\libc.lib \
$(VIS_CPP_PATH)\lib\oldnames.lib \
$(VIS_CPP_PATH)\lib\kernel32.lib \
$(VIS_CPP_PATH)\lib\wsock32.lib \
$(VIS_CPP_PATH)\lib\winmm.lib \
$(PD_INST_PATH)\bin\pthreadVC.lib \
$(PD_INST_PATH)\bin\pd.lib
SRC = biquad_freq_resp.c \
db2v.c \
f2note.c \
filter~.c \
FIR~.c \
for++.c \
gate.c \
hml_shelf~.c \
iem_cot4~.c \
iem_delay~.c \
iem_pow4~.c \
iem_sqrt4~.c \
lp1_t~.c \
mov_avrg_kern~.c \
para_bp2~.c \
peakenv~.c \
prvu~.c \
pvu~.c \
rvu~.c \
sin_phase~.c \
soundfile_info.c \
split.c \
v2db.c \
vcf_filter~.c \
iemlib1.c
OBJ = $(SRC:.c=.obj)
.c.obj:
cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c
..\iemlib1.dll: $(OBJ)
link $(PD_WIN_L_FLAGS) /dll /export:iemlib1_setup \
/out:..\iemlib1.dll $(OBJ) $(PD_WIN_LIB)
clean:
del *.obj
--- NEW FILE: prvu~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* ---------------- prvu~ - simple peak&rms-vu-meter. ----------------- */
typedef struct _prvu_tilde
{
t_object x_obj;
t_atom x_at[3];
void *x_clock_metro;
t_float x_metro_time;
void *x_clock_hold;
t_float x_hold_time;
t_float x_cur_peak;
t_float x_old_peak;
t_float x_hold_peak;
int x_hold;
t_float x_sum_rms;
t_float x_old_rms;
t_float x_rcp;
t_float x_sr;
t_float x_threshold_over;
int x_overflow_counter;
t_float x_release_time;
t_float x_c1;
int x_started;
t_float x_msi;
} t_prvu_tilde;
t_class *prvu_tilde_class;
static void prvu_tilde_tick_metro(t_prvu_tilde *x);
static void prvu_tilde_tick_hold(t_prvu_tilde *x);
static void prvu_tilde_reset(t_prvu_tilde *x)
{
x->x_at[0].a_w.w_float = -99.9f;
x->x_at[1].a_w.w_float = -99.9f;
x->x_at[2].a_w.w_float = 0.0f;
outlet_list(x->x_obj.ob_outlet, &s_list, 3, x->x_at);
x->x_overflow_counter = 0;
x->x_cur_peak = 0.0f;
x->x_old_peak = 0.0f;
x->x_hold_peak = 0.0f;
x->x_sum_rms = 0.0f;
x->x_old_rms = 0.0f;
x->x_hold = 0;
clock_unset(x->x_clock_hold);
clock_delay(x->x_clock_metro, x->x_metro_time);
}
static void prvu_tilde_stop(t_prvu_tilde *x)
{
clock_unset(x->x_clock_metro);
x->x_started = 0;
}
static void prvu_tilde_start(t_prvu_tilde *x)
{
clock_delay(x->x_clock_metro, x->x_metro_time);
x->x_started = 1;
}
static void prvu_tilde_float(t_prvu_tilde *x, t_floatarg f)
{
if(f == 0.0)
{
clock_unset(x->x_clock_metro);
x->x_started = 0;
}
else
{
clock_delay(x->x_clock_metro, x->x_metro_time);
x->x_started = 1;
}
}
static void prvu_tilde_t_release(t_prvu_tilde *x, t_floatarg release_time)
{
if(release_time <= 5.0f)
release_time = 5.0f;
x->x_release_time = release_time;
x->x_c1 = exp(-2.0f*x->x_metro_time/x->x_release_time);
}
static void prvu_tilde_t_metro(t_prvu_tilde *x, t_floatarg metro_time)
{
if(metro_time <= 5.0f)
metro_time = 5.0f;
x->x_metro_time = metro_time;
x->x_c1 = exp(-2.0f*x->x_metro_time/x->x_release_time);
x->x_rcp = 1.0f/(x->x_sr*(t_float)x->x_metro_time);
}
static void prvu_tilde_t_hold(t_prvu_tilde *x, t_floatarg hold_time)
{
if(hold_time <= 5.0f)
hold_time = 5.0f;
x->x_hold_time = hold_time;
}
static void prvu_tilde_threshold(t_prvu_tilde *x, t_floatarg thresh)
{
x->x_threshold_over = thresh;
}
static t_int *prvu_tilde_perform(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_prvu_tilde *x = (t_prvu_tilde *)(w[2]);
int n = (int)(w[3]);
t_float peak = x->x_cur_peak, power, sum=x->x_sum_rms;
int i;
if(x->x_started)
{
for(i=0; i<n; i++)
{
power = in[i]*in[i];
if(power > peak)
peak = power;
sum += power;
}
x->x_cur_peak = peak;
x->x_sum_rms = sum;
}
return(w+4);
}
static void prvu_tilde_dsp(t_prvu_tilde *x, t_signal **sp)
{
x->x_sr = 0.001*(t_float)sp[0]->s_sr;
x->x_rcp = 1.0f/(x->x_sr*x->x_metro_time);
dsp_add(prvu_tilde_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
clock_delay(x->x_clock_metro, x->x_metro_time);
}
static void prvu_tilde_tick_hold(t_prvu_tilde *x)
{
x->x_hold = 0;
x->x_hold_peak = x->x_old_peak;
}
static void prvu_tilde_tick_metro(t_prvu_tilde *x)
{
t_float dbr, dbp, cur_rms, c1=x->x_c1;
x->x_old_peak *= c1;
/* NAN protect */
if(IEM_DENORMAL(x->x_old_peak))
x->x_old_peak = 0.0f;
if(x->x_cur_peak > x->x_old_peak)
x->x_old_peak = x->x_cur_peak;
if(x->x_old_peak > x->x_hold_peak)
{
x->x_hold = 1;
x->x_hold_peak = x->x_old_peak;
clock_delay(x->x_clock_hold, x->x_hold_time);
}
if(!x->x_hold)
x->x_hold_peak = x->x_old_peak;
if(x->x_hold_peak <= 0.0000000001f)
dbp = -99.9f;
else if(x->x_hold_peak > 1000000.0f)
{
dbp = 60.0f;
x->x_hold_peak = 1000000.0f;
x->x_old_peak = 1000000.0f;
}
else
dbp = 4.3429448195f*log(x->x_hold_peak);
x->x_cur_peak = 0.0f;
if(dbp >= x->x_threshold_over)
x->x_overflow_counter++;
x->x_at[1].a_w.w_float = dbp;
x->x_at[2].a_w.w_float = (t_float)x->x_overflow_counter;
cur_rms = (1.0f - c1)*x->x_sum_rms*x->x_rcp + c1*x->x_old_rms;
/* NAN protect */
if(IEM_DENORMAL(cur_rms))
cur_rms = 0.0f;
if(cur_rms <= 0.0000000001f)
dbr = -99.9f;
else if(cur_rms > 1000000.0f)
{
dbr = 60.0f;
x->x_old_rms = 1000000.0f;
}
else
dbr = 4.3429448195f*log(cur_rms);
x->x_sum_rms = 0.0f;
x->x_old_rms = cur_rms;
x->x_at[0].a_w.w_float = dbr;
outlet_list(x->x_obj.ob_outlet, &s_list, 3, x->x_at);
clock_delay(x->x_clock_metro, x->x_metro_time);
}
static void prvu_tilde_ff(t_prvu_tilde *x)
{
clock_free(x->x_clock_metro);
clock_free(x->x_clock_hold);
}
static void *prvu_tilde_new(t_floatarg metro_time, t_floatarg hold_time,
t_floatarg release_time, t_floatarg threshold)
{
t_prvu_tilde *x;
t_float t;
int i;
x = (t_prvu_tilde *)pd_new(prvu_tilde_class);
if(metro_time <= 0.0f)
metro_time = 300.0f;
if(metro_time <= 5.0f)
metro_time = 5.0f;
if(release_time <= 0.0f)
release_time = 300.0f;
if(release_time <= 5.0f)
release_time = 5.0f;
if(hold_time <= 0.0f)
hold_time = 1000.0f;
if(hold_time <= 5.0f)
hold_time = 5.0f;
if(threshold == 0.0f)
threshold = -0.01f;
x->x_metro_time = metro_time;
x->x_release_time = release_time;
x->x_hold_time = hold_time;
x->x_threshold_over = threshold;
x->x_c1 = exp(-2.0f*x->x_metro_time/x->x_release_time);
x->x_cur_peak = 0.0f;
x->x_old_peak = 0.0f;
x->x_hold_peak = 0.0f;
x->x_hold = 0;
x->x_sum_rms = 0.0f;
x->x_old_rms = 0.0f;
x->x_sr = 44.1f;
x->x_rcp = 1.0f/(x->x_sr*x->x_metro_time);
x->x_overflow_counter = 0;
x->x_clock_metro = clock_new(x, (t_method)prvu_tilde_tick_metro);
x->x_clock_hold = clock_new(x, (t_method)prvu_tilde_tick_hold);
x->x_started = 1;
outlet_new(&x->x_obj, &s_list);
x->x_at[0].a_type = A_FLOAT;
x->x_at[1].a_type = A_FLOAT;
x->x_at[2].a_type = A_FLOAT;
x->x_msi = 0.0f;
return(x);
}
void prvu_tilde_setup(void)
{
prvu_tilde_class = class_new(gensym("prvu~"), (t_newmethod)prvu_tilde_new,
(t_method)prvu_tilde_ff, sizeof(t_prvu_tilde), 0,
A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0);
CLASS_MAINSIGNALIN(prvu_tilde_class, t_prvu_tilde, x_msi);
class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_dsp, gensym("dsp"), 0);
class_addfloat(prvu_tilde_class, prvu_tilde_float);
class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_reset, gensym("reset"), 0);
class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_start, gensym("start"), 0);
class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_stop, gensym("stop"), 0);
class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_t_release, gensym("t_release"), A_FLOAT, 0);
class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_t_metro, gensym("t_metro"), A_FLOAT, 0);
class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_t_hold, gensym("t_hold"), A_FLOAT, 0);
class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_threshold, gensym("threshold"), A_FLOAT, 0);
// class_sethelpsymbol(prvu_tilde_class, gensym("iemhelp/help-prvu~"));
}
--- NEW FILE: db2v.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* -------- db2v - a techn. dB to rms-value converter. --------- */
static t_class *db2v_class;
t_float db2v(t_float f)
{
return (f <= -199.9 ? 0 : exp(0.11512925465 * f));
}
static void db2v_float(t_object *x, t_floatarg f)
{
outlet_float(x->ob_outlet, db2v(f));
}
static void *db2v_new(void)
{
t_object *x = (t_object *)pd_new(db2v_class);
outlet_new(x, &s_float);
return (x);
}
void db2v_setup(void)
{
db2v_class = class_new(gensym("db2v"), db2v_new, 0,
sizeof(t_object), 0, 0);
class_addfloat(db2v_class, (t_method)db2v_float);
// class_sethelpsymbol(db2v_class, gensym("iemhelp/help-db2v"));
}
--- NEW FILE: para_bp2~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* ---------- para_bp2~ - parametric bandpass 2. order ----------- */
typedef struct _para_bp2_tilde
{
t_object x_obj;
t_float wn1;
t_float wn2;
t_float a0;
t_float a1;
t_float a2;
t_float b1;
t_float b2;
t_float sr;
t_float cur_f;
t_float cur_l;
t_float cur_a;
t_float cur_g;
t_float delta_f;
t_float delta_a;
t_float delta_g;
t_float end_f;
t_float end_a;
t_float end_g;
t_float ticks_per_interpol_time;
t_float rcp_ticks;
t_float interpol_time;
int ticks;
int counter_f;
int counter_a;
int counter_g;
int event_mask;
void *x_debug_outlet;
t_atom x_at[5];
t_float x_msi;
} t_para_bp2_tilde;
t_class *para_bp2_tilde_class;
static void para_bp2_tilde_calc(t_para_bp2_tilde *x)
{
t_float l, al, gal, l2, rcp;
l = x->cur_l;
l2 = l*l + 1.0f;
al = l*x->cur_a;
gal = al*x->cur_g;
rcp = 1.0f/(al + l2);
x->a0 = rcp*(l2 + gal);
x->a1 = rcp*2.0f*(2.0f - l2);
x->a2 = rcp*(l2 - gal);
x->b1 = -x->a1;
x->b2 = rcp*(al - l2);
}
static void para_bp2_tilde_dsp_tick(t_para_bp2_tilde *x)
{
if(x->event_mask)
{
t_float discriminant;
if(x->counter_f)
{
t_float l, si, co;
if(x->counter_f <= 1)
{
x->cur_f = x->end_f;
x->counter_f = 0;
x->event_mask &= 6;/*set event_mask_bit 0 = 0*/
}
else
{
x->counter_f--;
x->cur_f *= x->delta_f;
}
l = x->cur_f * x->sr;
if(l < 1.0e-20f)
x->cur_l = 1.0e20f;
else if(l > 1.57079632f)
x->cur_l = 0.0f;
else
{
si = sin(l);
co = cos(l);
x->cur_l = co/si;
}
}
if(x->counter_a)
{
if(x->counter_a <= 1)
{
x->cur_a = x->end_a;
x->counter_a = 0;
x->event_mask &= 5;/*set event_mask_bit 1 = 0*/
}
else
{
x->counter_a--;
x->cur_a *= x->delta_a;
}
}
if(x->counter_g)
{
if(x->counter_g <= 1)
{
x->cur_g = x->end_g;
x->counter_g = 0;
x->event_mask &= 3;/*set event_mask_bit 2 = 0*/
}
else
{
x->counter_g--;
x->cur_g *= x->delta_g;
}
}
para_bp2_tilde_calc(x);
/* stability check */
discriminant = x->b1 * x->b1 + 4.0f * x->b2;
if(x->b1 <= -1.9999996f)
x->b1 = -1.9999996f;
else if(x->b1 >= 1.9999996f)
x->b1 = 1.9999996f;
if(x->b2 <= -0.9999998f)
x->b2 = -0.9999998f;
else if(x->b2 >= 0.9999998f)
x->b2 = 0.9999998f;
if(discriminant >= 0.0f)
{
if(0.9999998f - x->b1 - x->b2 < 0.0f)
x->b2 = 0.9999998f - x->b1;
if(0.9999998f + x->b1 - x->b2 < 0.0f)
x->b2 = 0.9999998f + x->b1;
}
}
}
static t_int *para_bp2_tilde_perform(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[2]);
t_para_bp2_tilde *x = (t_para_bp2_tilde *)(w[3]);
int i, n = (t_int)(w[4]);
t_float wn0, wn1=x->wn1, wn2=x->wn2;
t_float a0=x->a0, a1=x->a1, a2=x->a2;
t_float b1=x->b1, b2=x->b2;
para_bp2_tilde_dsp_tick(x);
for(i=0; i<n; i++)
{
wn0 = *in++ + b1*wn1 + b2*wn2;
*out++ = a0*wn0 + a1*wn1 + a2*wn2;
wn2 = wn1;
wn1 = wn0;
}
/* NAN protect */
if(IEM_DENORMAL(wn2))
wn2 = 0.0f;
if(IEM_DENORMAL(wn1))
wn1 = 0.0f;
x->wn1 = wn1;
x->wn2 = wn2;
return(w+5);
}
/* yn0 = *out;
xn0 = *in;
*************
yn0 = a0*xn0 + a1*xn1 + a2*xn2 + b1*yn1 + b2*yn2;
yn2 = yn1;
yn1 = yn0;
xn2 = xn1;
xn1 = xn0;
*************************
y/x = (a0 + a1*z-1 + a2*z-2)/(1 - b1*z-1 - b2*z-2);*/
static t_int *para_bp2_tilde_perf8(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[2]);
t_para_bp2_tilde *x = (t_para_bp2_tilde *)(w[3]);
int i, n = (t_int)(w[4]);
t_float wn[10];
t_float a0=x->a0, a1=x->a1, a2=x->a2;
t_float b1=x->b1, b2=x->b2;
para_bp2_tilde_dsp_tick(x);
wn[0] = x->wn2;
wn[1] = x->wn1;
for(i=0; i<n; i+=8, in+=8, out+=8)
{
wn[2] = in[0] + b1*wn[1] + b2*wn[0];
out[0] = a0*wn[2] + a1*wn[1] + a2*wn[0];
wn[3] = in[1] + b1*wn[2] + b2*wn[1];
out[1] = a0*wn[3] + a1*wn[2] + a2*wn[1];
wn[4] = in[2] + b1*wn[3] + b2*wn[2];
out[2] = a0*wn[4] + a1*wn[3] + a2*wn[2];
wn[5] = in[3] + b1*wn[4] + b2*wn[3];
out[3] = a0*wn[5] + a1*wn[4] + a2*wn[3];
wn[6] = in[4] + b1*wn[5] + b2*wn[4];
out[4] = a0*wn[6] + a1*wn[5] + a2*wn[4];
wn[7] = in[5] + b1*wn[6] + b2*wn[5];
out[5] = a0*wn[7] + a1*wn[6] + a2*wn[5];
wn[8] = in[6] + b1*wn[7] + b2*wn[6];
out[6] = a0*wn[8] + a1*wn[7] + a2*wn[6];
wn[9] = in[7] + b1*wn[8] + b2*wn[7];
out[7] = a0*wn[9] + a1*wn[8] + a2*wn[7];
wn[0] = wn[8];
wn[1] = wn[9];
}
/* NAN protect */
if(IEM_DENORMAL(wn[0]))
wn[0] = 0.0f;
if(IEM_DENORMAL(wn[1]))
wn[1] = 0.0f;
x->wn1 = wn[1];
x->wn2 = wn[0];
return(w+5);
}
static void para_bp2_tilde_ft4(t_para_bp2_tilde *x, t_floatarg t)
{
int i = (int)((x->ticks_per_interpol_time)*t);
x->interpol_time = t;
if(i <= 0)
i = 1;
x->ticks = i;
x->rcp_ticks = 1.0f / (t_float)i;
}
static void para_bp2_tilde_ft3(t_para_bp2_tilde *x, t_floatarg l)
{
t_float g = exp(0.11512925465 * l);
if(g != x->cur_g)
{
x->end_g = g;
x->counter_g = x->ticks;
x->delta_g = exp(log(g/x->cur_g)*x->rcp_ticks);
x->event_mask |= 4;/*set event_mask_bit 2 = 1*/
}
}
static void para_bp2_tilde_ft2(t_para_bp2_tilde *x, t_floatarg q)
{
t_float a;
if(q <= 0.0f)
q = 0.000001f;
a = 1.0f/q;
if(a != x->cur_a)
{
x->end_a = a;
x->counter_a = x->ticks;
x->delta_a = exp(log(a/x->cur_a)*x->rcp_ticks);
x->event_mask |= 2;/*set event_mask_bit 1 = 1*/
}
}
static void para_bp2_tilde_ft1(t_para_bp2_tilde *x, t_floatarg f)
{
if(f <= 0.0f)
f = 0.000001f;
if(f != x->cur_f)
{
x->end_f = f;
x->counter_f = x->ticks;
x->delta_f = exp(log(f/x->cur_f)*x->rcp_ticks);
x->event_mask |= 1;/*set event_mask_bit 0 = 1*/
}
}
static void para_bp2_tilde_print(t_para_bp2_tilde *x)
{
// post("fb1 = %g, fb2 = %g, ff1 = %g, ff2 = %g, ff3 = %g", x->b1, x->b2, x->a0, x->a1, x->a2);
x->x_at[0].a_w.w_float = x->b1;
x->x_at[1].a_w.w_float = x->b2;
x->x_at[2].a_w.w_float = x->a0;
x->x_at[3].a_w.w_float = x->a1;
x->x_at[4].a_w.w_float = x->a2;
outlet_list(x->x_debug_outlet, &s_list, 5, x->x_at);
}
static void para_bp2_tilde_dsp(t_para_bp2_tilde *x, t_signal **sp)
{
t_float si, co, f;
int i, n=(int)sp[0]->s_n;
x->sr = 3.14159265358979323846f / (t_float)(sp[0]->s_sr);
x->ticks_per_interpol_time = 0.001f * (t_float)(sp[0]->s_sr) / (t_float)n;
i = (int)((x->ticks_per_interpol_time)*(x->interpol_time));
if(i <= 0)
i = 1;
x->ticks = i;
x->rcp_ticks = 1.0f / (t_float)i;
f = x->cur_f * x->sr;
if(f < 1.0e-20f)
x->cur_l = 1.0e20f;
else if(f > 1.57079632f)
x->cur_l = 0.0f;
else
{
si = sin(f);
co = cos(f);
x->cur_l = co/si;
}
if(n&7)
dsp_add(para_bp2_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n);
else
dsp_add(para_bp2_tilde_perf8, 4, sp[0]->s_vec, sp[1]->s_vec, x, n);
}
static void *para_bp2_tilde_new(t_symbol *s, int argc, t_atom *argv)
{
t_para_bp2_tilde *x = (t_para_bp2_tilde *)pd_new(para_bp2_tilde_class);
int i;
t_float si, co, f=0.0f, q=1.0f, l=0.0f, interpol=0.0f;
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft2"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft3"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft4"));
outlet_new(&x->x_obj, &s_signal);
x->x_debug_outlet = outlet_new(&x->x_obj, &s_list);
x->x_msi = 0;
x->x_at[0].a_type = A_FLOAT;
x->x_at[1].a_type = A_FLOAT;
x->x_at[2].a_type = A_FLOAT;
x->x_at[3].a_type = A_FLOAT;
x->x_at[4].a_type = A_FLOAT;
x->event_mask = 1;
x->counter_f = 1;
x->counter_a = 0;
x->counter_g = 0;
x->delta_f = 0.0f;
x->delta_a = 0.0f;
x->delta_g = 0.0f;
x->interpol_time = 500.0f;
x->wn1 = 0.0f;
x->wn2 = 0.0f;
x->a0 = 0.0f;
x->a1 = 0.0f;
x->a2 = 0.0f;
x->b1 = 0.0f;
x->b2 = 0.0f;
x->sr = 3.14159265358979323846f / 44100.0f;
x->cur_a = 1.0f;
if((argc == 4)&&IS_A_FLOAT(argv,3)&&IS_A_FLOAT(argv,2)&&IS_A_FLOAT(argv,1)&&IS_A_FLOAT(argv,0))
{
f = (t_float)atom_getfloatarg(0, argc, argv);
q = (t_float)atom_getfloatarg(1, argc, argv);
l = (t_float)atom_getfloatarg(2, argc, argv);
interpol = (t_float)atom_getfloatarg(3, argc, argv);
}
if(f <= 0.0f)
f = 0.000001f;
x->cur_f = f;
f *= x->sr;
if(f < 1.0e-20f)
x->cur_l = 1.0e20f;
else if(f > 1.57079632f)
x->cur_l = 0.0f;
else
{
si = sin(f);
co = cos(f);
x->cur_l = co/si;
}
if(q <= 0.0f)
q = 0.000001f;
x->cur_a = 1.0f/q;
x->cur_g = exp(0.11512925465 * l);
if(interpol <= 0.0f)
interpol = 0.0f;
x->interpol_time = interpol;
x->ticks_per_interpol_time = 0.5f;
i = (int)((x->ticks_per_interpol_time)*(x->interpol_time));
if(i <= 0)
i = 1;
x->ticks = i;
x->rcp_ticks = 1.0f / (t_float)i;
x->end_f = x->cur_f;
x->end_a = x->cur_a;
x->end_g = x->cur_g;
return(x);
}
void para_bp2_tilde_setup(void)
{
para_bp2_tilde_class = class_new(gensym("para_bp2~"), (t_newmethod)para_bp2_tilde_new,
0, sizeof(t_para_bp2_tilde), 0, A_GIMME, 0);
CLASS_MAINSIGNALIN(para_bp2_tilde_class, t_para_bp2_tilde, x_msi);
class_addmethod(para_bp2_tilde_class, (t_method)para_bp2_tilde_dsp, gensym("dsp"), 0);
class_addmethod(para_bp2_tilde_class, (t_method)para_bp2_tilde_ft1, gensym("ft1"), A_FLOAT, 0);
class_addmethod(para_bp2_tilde_class, (t_method)para_bp2_tilde_ft2, gensym("ft2"), A_FLOAT, 0);
class_addmethod(para_bp2_tilde_class, (t_method)para_bp2_tilde_ft3, gensym("ft3"), A_FLOAT, 0);
class_addmethod(para_bp2_tilde_class, (t_method)para_bp2_tilde_ft4, gensym("ft4"), A_FLOAT, 0);
class_addmethod(para_bp2_tilde_class, (t_method)para_bp2_tilde_print, gensym("print"), 0);
// class_sethelpsymbol(para_bp2_tilde_class, gensym("iemhelp/help-para_bp2~"));
}
--- NEW FILE: iem_sqrt4~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
#define IEMSQRT4TAB1SIZE 256
#define IEMSQRT4TAB2SIZE 1024
/* ------------------------ iem_sqrt4~ ----------------------------- */
t_float *iem_sqrt4_tilde_exptab=(t_float *)0L;
t_float *iem_sqrt4_tilde_mantissatab=(t_float *)0L;
static t_class *iem_sqrt4_tilde_class;
typedef struct _iem_sqrt4_tilde
{
t_object x_obj;
t_float x_msi;
} t_iem_sqrt4_tilde;
static t_int *iem_sqrt4_tilde_perform(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[2]);
t_int n = (t_int)(w[3])/4;
while(n--)
{
t_float f = *in;
t_float g, h;
long l = *(long *)(in);
if(f < 0.0f)
{
*out++ = 0.0f;
*out++ = 0.0f;
*out++ = 0.0f;
*out++ = 0.0f;
}
else
{
g = iem_sqrt4_tilde_exptab[(l >> 23) & 0xff] * iem_sqrt4_tilde_mantissatab[(l >> 13) & 0x3ff];
h = f * (1.5f * g - 0.5f * g * g * g * f);
*out++ = h;
*out++ = h;
*out++ = h;
*out++ = h;
}
in += 4;
}
return(w+4);
}
static void iem_sqrt4_tilde_dsp(t_iem_sqrt4_tilde *x, t_signal **sp)
{
dsp_add(iem_sqrt4_tilde_perform, 3, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
}
static void iem_sqrt4_tilde_maketable(void)
{
int i;
t_float f;
long l;
if(!iem_sqrt4_tilde_exptab)
{
iem_sqrt4_tilde_exptab = (t_float *)getbytes(sizeof(t_float) * IEMSQRT4TAB1SIZE);
for(i=0; i<IEMSQRT4TAB1SIZE; i++)
{
l = (i ? (i == IEMSQRT4TAB1SIZE-1 ? IEMSQRT4TAB1SIZE-2 : i) : 1)<< 23;
*(long *)(&f) = l;
iem_sqrt4_tilde_exptab[i] = 1.0f/sqrt(f);
}
}
if(!iem_sqrt4_tilde_mantissatab)
{
iem_sqrt4_tilde_mantissatab = (t_float *)getbytes(sizeof(t_float) * IEMSQRT4TAB2SIZE);
for(i=0; i<IEMSQRT4TAB2SIZE; i++)
{
f = 1.0f + (1.0f/(t_float)IEMSQRT4TAB2SIZE) * (t_float)i;
iem_sqrt4_tilde_mantissatab[i] = 1.0f/sqrt(f);
}
}
}
static void *iem_sqrt4_tilde_new(void)
{
t_iem_sqrt4_tilde *x = (t_iem_sqrt4_tilde *)pd_new(iem_sqrt4_tilde_class);
outlet_new(&x->x_obj, gensym("signal"));
x->x_msi = 0;
return (x);
}
void iem_sqrt4_tilde_setup(void)
{
iem_sqrt4_tilde_class = class_new(gensym("iem_sqrt4~"), (t_newmethod)iem_sqrt4_tilde_new, 0,
sizeof(t_iem_sqrt4_tilde), 0, 0);
CLASS_MAINSIGNALIN(iem_sqrt4_tilde_class, t_iem_sqrt4_tilde, x_msi);
class_addmethod(iem_sqrt4_tilde_class, (t_method)iem_sqrt4_tilde_dsp, gensym("dsp"), 0);
iem_sqrt4_tilde_maketable();
// class_sethelpsymbol(iem_sqrt4_tilde_class, gensym("iemhelp/help-iem_sqrt4~"));
}
--- NEW FILE: mov_avrg_kern~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
/* -- mov_avrg_kern~ - kernel for a moving-average-filter with IIR - */
typedef struct _mov_avrg_kern_tilde
{
t_object x_obj;
double x_wn1;
double x_a0;
double x_sr;
double x_mstime;
int x_nsamps;
int x_counter;
t_float x_msi;
} t_mov_avrg_kern_tilde;
t_class *mov_avrg_kern_tilde_class;
static t_int *mov_avrg_kern_tilde_perform(t_int *w)
{
t_float *in_direct = (t_float *)(w[1]);
t_float *in_delayed = (t_float *)(w[2]);
t_float *out = (t_float *)(w[3]);
t_mov_avrg_kern_tilde *x = (t_mov_avrg_kern_tilde *)(w[4]);
int i, n = (int)(w[5]);
double wn0, wn1=x->x_wn1, a0=x->x_a0;
if(x->x_counter)
{
int counter = x->x_counter;
if(counter >= n)
{
x->x_counter = counter - n;
for(i=0; i<n; i++)
{
wn0 = wn1 + a0*(double)(*in_direct++);
*out++ = (t_float)wn0;
wn1 = wn0;
}
}
else
{
x->x_counter = 0;
for(i=0; i<counter; i++)
{
wn0 = wn1 + a0*(double)(*in_direct++);
*out++ = (t_float)wn0;
wn1 = wn0;
}
for(i=counter; i<n; i++)
{
wn0 = wn1 + a0*(double)(*in_direct++ - *in_delayed++);
*out++ = (t_float)wn0;
wn1 = wn0;
}
}
}
else
{
for(i=0; i<n; i++)
{
wn0 = wn1 + a0*(double)(*in_direct++ - *in_delayed++);
*out++ = (t_float)wn0;
wn1 = wn0;
}
}
x->x_wn1 = wn1;
return(w+6);
}
static void mov_avrg_kern_tilde_ft1(t_mov_avrg_kern_tilde *x, t_floatarg mstime)
{
if(mstime < 0.04)
mstime = 0.04;
x->x_mstime = (double)mstime;
x->x_nsamps = (int)(x->x_sr * x->x_mstime);
x->x_counter = x->x_nsamps;
x->x_wn1 = 0.0;
x->x_a0 = 1.0/(double)(x->x_nsamps);
}
static void mov_avrg_kern_tilde_reset(t_mov_avrg_kern_tilde *x)
{
x->x_counter = x->x_nsamps;
x->x_wn1 = 0.0;
}
static void mov_avrg_kern_tilde_dsp(t_mov_avrg_kern_tilde *x, t_signal **sp)
{
x->x_sr = 0.001*(double)(sp[0]->s_sr);
x->x_nsamps = (int)(x->x_sr * x->x_mstime);
x->x_counter = x->x_nsamps;
x->x_wn1 = 0.0;
x->x_a0 = 1.0/(double)(x->x_nsamps);
dsp_add(mov_avrg_kern_tilde_perform, 5, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, x, sp[0]->s_n);
}
static void *mov_avrg_kern_tilde_new(t_floatarg mstime)
{
t_mov_avrg_kern_tilde *x = (t_mov_avrg_kern_tilde *)pd_new(mov_avrg_kern_tilde_class);
if(mstime < 0.04)
mstime = 0.04;
x->x_mstime = (double)mstime;
x->x_sr = 44.1;
x->x_nsamps = (int)(x->x_sr * x->x_mstime);
x->x_counter = x->x_nsamps;
x->x_wn1 = 0.0;
x->x_a0 = 1.0/(double)(x->x_nsamps);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
outlet_new(&x->x_obj, &s_signal);
x->x_msi = 0;
return(x);
}
void mov_avrg_kern_tilde_setup(void)
{
mov_avrg_kern_tilde_class = class_new(gensym("mov_avrg_kern~"), (t_newmethod)mov_avrg_kern_tilde_new,
0, sizeof(t_mov_avrg_kern_tilde), 0, A_FLOAT, 0);
CLASS_MAINSIGNALIN(mov_avrg_kern_tilde_class, t_mov_avrg_kern_tilde, x_msi);
class_addmethod(mov_avrg_kern_tilde_class, (t_method)mov_avrg_kern_tilde_dsp, gensym("dsp"), 0);
class_addmethod(mov_avrg_kern_tilde_class, (t_method)mov_avrg_kern_tilde_ft1, gensym("ft1"), A_FLOAT, 0);
class_addmethod(mov_avrg_kern_tilde_class, (t_method)mov_avrg_kern_tilde_reset, gensym("reset"), 0);
}
--- NEW FILE: hml_shelf~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* ---------- hml_shelf~ - high-middle-low-shelving filter ----------- */
typedef struct _hml_shelf_tilde
{
t_object x_obj;
t_float wn1;
t_float wn2;
t_float a0;
t_float a1;
t_float a2;
t_float b1;
t_float b2;
t_float sr;
t_float cur_lf;
t_float cur_hf;
t_float cur_lg;
t_float cur_mg;
t_float cur_hg;
t_float delta_lf;
t_float delta_hf;
t_float delta_lg;
t_float delta_mg;
t_float delta_hg;
t_float end_lf;
t_float end_hf;
t_float end_lg;
t_float end_mg;
t_float end_hg;
t_float ticks_per_interpol_time;
t_float rcp_ticks;
t_float interpol_time;
int ticks;
int counter_lf;
int counter_hf;
int counter_lg;
int counter_mg;
int counter_hg;
int event_mask;
void *x_debug_outlet;
t_atom x_at[5];
t_float x_msi;
} t_hml_shelf_tilde;
t_class *hml_shelf_tilde_class;
static void hml_shelf_tilde_calc(t_hml_shelf_tilde *x)
{
t_float rf = x->cur_hf/x->cur_lf;
t_float mf = x->cur_hf*x->cur_lf;
t_float lg = x->cur_lg;
t_float rcplg = 1.0f/lg;
t_float mg = x->cur_mg;
t_float rcpmg = 1.0f/mg;
t_float hg = x->cur_hg;
t_float rcphg = 1.0f/hg;
t_float f = mf*x->sr;
t_float l = cos(f)/sin(f);
t_float k1 = rf*l;
t_float k2 = l/rf;
t_float k3 = l*l;
t_float k4 = k3*hg;
t_float k5 = k3*rcphg;
t_float k6 = rcplg + k5;
t_float k7 = rcpmg*k1 + k2*rcplg*rcphg*mg;
t_float k8 = lg + k4;
t_float k9 = mg*k1 + k2*lg*hg*rcpmg;
t_float k10 = 1.0f/(k6 + k7);
x->b2 = k10*(k7 - k6);
x->b1 = k10*2.0f*(k5 - rcplg);
x->a2 = k10*(k8 - k9);
x->a1 = k10*2.0f*(lg - k4);
x->a0 = k10*(k8 + k9);
}
/*
high- & low- shelving-filter:
L....sqrt(lowlevel);
rL...rsqrt(lowlevel);
M....sqrt(mediumlevel);
rM...rsqrt(mediumlevel);
H....sqrt(highlevel);
rH...rsqrt(highlevel);
V....sqrt(highfrequency/lowfrequency);
P....j*2*pi*f/(2*pi*V*lowfrequency);
Y/X = [M/(1/M)] * [(L/M + PV)/(M/L + PV)] * [(1 + HP/(VM))/(1 + MP/(VH))];
Y/X = (L + P*(M*V + L*H/(V*M)) + P*P*H) / (rL + P*(rM*V + rL*rH/(V*rM)) + P*P*rH);
hlshlv: lowlevel: ll; mediumlevel: lm; highlevel: hl; lowfrequency: fl; highfrequency: fh; samplerate: sr;
V = sqrt(fh/fl);
f = fl*V;
L = sqrt(ll);
rL = 1.0/L;
M = sqrt(lm);
rM = 1.0/M;
H = sqrt(lh);
rH = 1.0/H;
l = cot(f*3.14159265358979323846/sr);
k1 = V*l;
k2 = l/V;
l2 = l*l;
l3 = l2*H;
l4 = l2*rH;
m1 = k2*L*H*rM;
m2 = k2*rL*rH*M;
n1 = rL + l4;
n2 = rM*k1 + m2;
p1 = L + l3;
p2 = M*k1 + m1;
a012 = 1.0/(n1 + n2);
b2 = a012*(n2 - n1);
b1 = a012*2.0*(l4 - rL);
a2 = a012*(p1 - p2);
a1 = a012*2.0*(L - l3);
a0 = a012*(p1 + p2);
rf = sqrt(fh/fl);
mf = fl*rf;
L = sqrt(ll);
rL = 1.0/L;
M = sqrt(lm);
rM = 1.0/M;
H = sqrt(lh);
rH = 1.0/H;
l = cot(fm*3.14159265358979323846/sr);
k1 = V*l;
k2 = l/V;
k3 = l*l;
k4 = k3*H;
k5 = k3*rH;
k6 = rL + k5;
k7 = rM*k1 + k2*rL*rH*M;
k8 = L + k4;
k9 = M*k1 + k2*L*H*rM;
k10 = 1.0/(k6 + k7);
b2 = k10*(k7 - k6);
b1 = k10*2.0*(k5 - rL);
a2 = k10*(k8 - k9);
a1 = k10*2.0*(L - k4);
a0 = k10*(k8 + k9);
*/
static void hml_shelf_tilde_dsp_tick(t_hml_shelf_tilde *x)
{
if(x->event_mask)
{
t_float discriminant;
if(x->counter_lg)
{
if(x->counter_lg <= 1)
{
x->cur_lg = x->end_lg;
x->counter_lg = 0;
x->event_mask &= 30;/*set event_mask_bit 0 = 0*/
}
else
{
x->counter_lg--;
x->cur_lg *= x->delta_lg;
}
}
if(x->counter_lf)
{
if(x->counter_lf <= 1)
{
x->cur_lf = x->end_lf;
x->counter_lf = 0;
x->event_mask &= 29;/*set event_mask_bit 1 = 0*/
}
else
{
x->counter_lf--;
x->cur_lf *= x->delta_lf;
}
}
if(x->counter_mg)
{
if(x->counter_mg <= 1)
{
x->cur_mg = x->end_mg;
x->counter_mg = 0;
x->event_mask &= 27;/*set event_mask_bit 2 = 0*/
}
else
{
x->counter_mg--;
x->cur_mg *= x->delta_mg;
}
}
if(x->counter_hf)
{
if(x->counter_hf <= 1)
{
x->cur_hf = x->end_hf;
x->counter_hf = 0;
x->event_mask &= 23;/*set event_mask_bit 3 = 0*/
}
else
{
x->counter_hf--;
x->cur_hf *= x->delta_hf;
}
}
if(x->counter_hg)
{
if(x->counter_hg <= 1)
{
x->cur_hg = x->end_hg;
x->counter_hg = 0;
x->event_mask &= 15;/*set event_mask_bit 4 = 0*/
}
else
{
x->counter_hg--;
x->cur_hg *= x->delta_hg;
}
}
hml_shelf_tilde_calc(x);
/* stability check */
discriminant = x->b1 * x->b1 + 4.0f * x->b2;
if(x->b1 <= -1.9999996f)
x->b1 = -1.9999996f;
else if(x->b1 >= 1.9999996f)
x->b1 = 1.9999996f;
if(x->b2 <= -0.9999998f)
x->b2 = -0.9999998f;
else if(x->b2 >= 0.9999998f)
x->b2 = 0.9999998f;
if(discriminant >= 0.0f)
{
if(0.9999998f - x->b1 - x->b2 < 0.0f)
x->b2 = 0.9999998f - x->b1;
if(0.9999998f + x->b1 - x->b2 < 0.0f)
x->b2 = 0.9999998f + x->b1;
}
}
}
static t_int *hml_shelf_tilde_perform(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[2]);
t_hml_shelf_tilde *x = (t_hml_shelf_tilde *)(w[3]);
int i, n = (t_int)(w[4]);
t_float wn0, wn1=x->wn1, wn2=x->wn2;
t_float a0=x->a0, a1=x->a1, a2=x->a2;
t_float b1=x->b1, b2=x->b2;
hml_shelf_tilde_dsp_tick(x);
for(i=0; i<n; i++)
{
wn0 = *in++ + b1*wn1 + b2*wn2;
*out++ = a0*wn0 + a1*wn1 + a2*wn2;
wn2 = wn1;
wn1 = wn0;
}
/* NAN protect */
if(IEM_DENORMAL(wn2))
wn2 = 0.0f;
if(IEM_DENORMAL(wn1))
wn1 = 0.0f;
x->wn1 = wn1;
x->wn2 = wn2;
return(w+5);
}
/* yn0 = *out;
xn0 = *in;
*************
yn0 = a0*xn0 + a1*xn1 + a2*xn2 + b1*yn1 + b2*yn2;
yn2 = yn1;
yn1 = yn0;
xn2 = xn1;
xn1 = xn0;
*************************
y/x = (a0 + a1*z-1 + a2*z-2)/(1 - b1*z-1 - b2*z-2);
*/
static t_int *hml_shelf_tilde_perf8(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[2]);
t_hml_shelf_tilde *x = (t_hml_shelf_tilde *)(w[3]);
int i, n = (t_int)(w[4]);
t_float wn[10];
t_float a0=x->a0, a1=x->a1, a2=x->a2;
t_float b1=x->b1, b2=x->b2;
hml_shelf_tilde_dsp_tick(x);
wn[0] = x->wn2;
wn[1] = x->wn1;
for(i=0; i<n; i+=8, in+=8, out+=8)
{
wn[2] = in[0] + b1*wn[1] + b2*wn[0];
out[0] = a0*wn[2] + a1*wn[1] + a2*wn[0];
wn[3] = in[1] + b1*wn[2] + b2*wn[1];
out[1] = a0*wn[3] + a1*wn[2] + a2*wn[1];
wn[4] = in[2] + b1*wn[3] + b2*wn[2];
out[2] = a0*wn[4] + a1*wn[3] + a2*wn[2];
wn[5] = in[3] + b1*wn[4] + b2*wn[3];
out[3] = a0*wn[5] + a1*wn[4] + a2*wn[3];
wn[6] = in[4] + b1*wn[5] + b2*wn[4];
out[4] = a0*wn[6] + a1*wn[5] + a2*wn[4];
wn[7] = in[5] + b1*wn[6] + b2*wn[5];
out[5] = a0*wn[7] + a1*wn[6] + a2*wn[5];
wn[8] = in[6] + b1*wn[7] + b2*wn[6];
out[6] = a0*wn[8] + a1*wn[7] + a2*wn[6];
wn[9] = in[7] + b1*wn[8] + b2*wn[7];
out[7] = a0*wn[9] + a1*wn[8] + a2*wn[7];
wn[0] = wn[8];
wn[1] = wn[9];
}
/* NAN protect */
if(IEM_DENORMAL(wn[0]))
wn[0] = 0.0f;
if(IEM_DENORMAL(wn[1]))
wn[1] = 0.0f;
x->wn1 = wn[1];
x->wn2 = wn[0];
return(w+5);
}
static void hml_shelf_tilde_ft6(t_hml_shelf_tilde *x, t_floatarg t)
{
int i = (int)((x->ticks_per_interpol_time)*t);
x->interpol_time = t;
if(i <= 0)
i = 1;
x->ticks = i;
x->rcp_ticks = 1.0f / (t_float)i;
}
static void hml_shelf_tilde_ft5(t_hml_shelf_tilde *x, t_floatarg hl)
{
t_float hg = exp(0.057564627325 * hl);
if(hg != x->cur_hg)
{
x->end_hg = hg;
x->counter_hg = x->ticks;
x->delta_hg = exp(log(hg/x->cur_hg)*x->rcp_ticks);
x->event_mask |= 16;/*set event_mask_bit 4 = 1*/
}
}
static void hml_shelf_tilde_ft4(t_hml_shelf_tilde *x, t_floatarg hf)
{
t_float sqhf;
if(hf <= 0.0f)
hf = 0.000001f;
sqhf = sqrt(hf);
if(sqhf != x->cur_hf)
{
x->end_hf = sqhf;
x->counter_hf = x->ticks;
x->delta_hf = exp(log(sqhf/x->cur_hf)*x->rcp_ticks);
x->event_mask |= 8;/*set event_mask_bit 3 = 1*/
}
}
static void hml_shelf_tilde_ft3(t_hml_shelf_tilde *x, t_floatarg ml)
{
t_float mg = exp(0.057564627325 * ml);
if(mg != x->cur_mg)
{
x->end_mg = mg;
x->counter_mg = x->ticks;
x->delta_mg = exp(log(mg/x->cur_mg)*x->rcp_ticks);
x->event_mask |= 4;/*set event_mask_bit 2 = 1*/
}
}
static void hml_shelf_tilde_ft2(t_hml_shelf_tilde *x, t_floatarg lf)
{
t_float sqlf;
if(lf <= 0.0f)
lf = 0.000001f;
sqlf = sqrt(lf);
if(sqlf != x->cur_lf)
{
x->end_lf = sqlf;
x->counter_lf = x->ticks;
x->delta_lf = exp(log(sqlf/x->cur_lf)*x->rcp_ticks);
x->event_mask |= 2;/*set event_mask_bit 1 = 1*/
}
}
static void hml_shelf_tilde_ft1(t_hml_shelf_tilde *x, t_floatarg ll)
{
t_float lg = exp(0.057564627325 * ll);
if(lg != x->cur_lg)
{
x->end_lg = lg;
x->counter_lg = x->ticks;
x->delta_lg = exp(log(lg/x->cur_lg)*x->rcp_ticks);
x->event_mask |= 1;/*set event_mask_bit 0 = 1*/
}
}
static void hml_shelf_tilde_print(t_hml_shelf_tilde *x)
{
// post("fb1 = %g, fb2 = %g, ff1 = %g, ff2 = %g, ff3 = %g", x->b1, x->b2, x->a0, x->a1, x->a2);
x->x_at[0].a_w.w_float = x->b1;
x->x_at[1].a_w.w_float = x->b2;
x->x_at[2].a_w.w_float = x->a0;
x->x_at[3].a_w.w_float = x->a1;
x->x_at[4].a_w.w_float = x->a2;
outlet_list(x->x_debug_outlet, &s_list, 5, x->x_at);
}
static void hml_shelf_tilde_dsp(t_hml_shelf_tilde *x, t_signal **sp)
{
int i, n=(int)sp[0]->s_n;
x->sr = 3.14159265358979323846f / (t_float)(sp[0]->s_sr);
x->ticks_per_interpol_time = 0.001f * (t_float)(sp[0]->s_sr) / (t_float)n;
i = (int)((x->ticks_per_interpol_time)*(x->interpol_time));
if(i <= 0)
i = 1;
x->ticks = i;
x->rcp_ticks = 1.0f / (t_float)i;
if(n&7)
dsp_add(hml_shelf_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n);
else
dsp_add(hml_shelf_tilde_perf8, 4, sp[0]->s_vec, sp[1]->s_vec, x, n);
}
static void *hml_shelf_tilde_new(t_symbol *s, int argc, t_atom *argv)
{
t_hml_shelf_tilde *x = (t_hml_shelf_tilde *)pd_new(hml_shelf_tilde_class);
int i;
t_float lf=200.0f, hf=2000.0f, ll=0.0f, ml=0.0f, hl=0.0f, interpol=0.0f;
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft2"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft3"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft4"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft5"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft6"));
outlet_new(&x->x_obj, &s_signal);
x->x_debug_outlet = outlet_new(&x->x_obj, &s_list);
x->x_msi = 0;
x->x_at[0].a_type = A_FLOAT;
x->x_at[1].a_type = A_FLOAT;
x->x_at[2].a_type = A_FLOAT;
x->x_at[3].a_type = A_FLOAT;
x->x_at[4].a_type = A_FLOAT;
x->event_mask = 2;
x->counter_lg = 0;
x->counter_lf = 1;
x->counter_mg = 0;
x->counter_hf = 0;
x->counter_hg = 0;
x->delta_lg = 0.0f;
x->delta_lf = 0.0f;
x->delta_mg = 0.0f;
x->delta_hf = 0.0f;
x->delta_hg = 0.0f;
x->interpol_time = 0.0f;
x->wn1 = 0.0f;
x->wn2 = 0.0f;
x->a0 = 0.0f;
x->a1 = 0.0f;
x->a2 = 0.0f;
x->b1 = 0.0f;
x->b2 = 0.0f;
x->sr = 3.14159265358979323846f / 44100.0f;
if((argc == 6)&&IS_A_FLOAT(argv,5)&&IS_A_FLOAT(argv,4)&&IS_A_FLOAT(argv,3)
&&IS_A_FLOAT(argv,2)&&IS_A_FLOAT(argv,1)&&IS_A_FLOAT(argv,0))
{
ll = (t_float)atom_getfloatarg(0, argc, argv);
lf = (t_float)atom_getfloatarg(1, argc, argv);
ml = (t_float)atom_getfloatarg(2, argc, argv);
hf = (t_float)atom_getfloatarg(3, argc, argv);
hl = (t_float)atom_getfloatarg(4, argc, argv);
interpol = (t_float)atom_getfloatarg(5, argc, argv);
}
x->cur_lg = exp(0.057564627325 * ll);
x->cur_mg = exp(0.057564627325 * ml);
x->cur_hg = exp(0.057564627325 * hl);
if(lf <= 0.0f)
lf = 0.000001f;
if(hf <= 0.0f)
hf = 0.000001f;
x->cur_lf = sqrt(lf);
x->cur_hf = sqrt(hf);
if(interpol < 0.0f)
interpol = 0.0f;
x->interpol_time = interpol;
x->ticks_per_interpol_time = 0.5f;
i = (int)((x->ticks_per_interpol_time)*(x->interpol_time));
if(i <= 0)
i = 1;
x->ticks = i;
x->rcp_ticks = 1.0f / (t_float)i;
x->end_lf = x->cur_lf;
x->end_hf = x->cur_hf;
x->end_lg = x->cur_lg;
x->end_mg = x->cur_mg;
x->end_hg = x->cur_hg;
return(x);
}
void hml_shelf_tilde_setup(void)
{
hml_shelf_tilde_class = class_new(gensym("hml_shelf~"), (t_newmethod)hml_shelf_tilde_new,
0, sizeof(t_hml_shelf_tilde), 0, A_GIMME, 0);
CLASS_MAINSIGNALIN(hml_shelf_tilde_class, t_hml_shelf_tilde, x_msi);
class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_dsp, gensym("dsp"), 0);
class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_ft1, gensym("ft1"), A_FLOAT, 0);
class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_ft2, gensym("ft2"), A_FLOAT, 0);
class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_ft3, gensym("ft3"), A_FLOAT, 0);
class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_ft4, gensym("ft4"), A_FLOAT, 0);
class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_ft5, gensym("ft5"), A_FLOAT, 0);
class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_ft6, gensym("ft6"), A_FLOAT, 0);
class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_print, gensym("print"), 0);
// class_sethelpsymbol(hml_shelf_tilde_class, gensym("iemhelp/help-hml_shelf~"));
}
--- NEW FILE: peakenv~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* ---------------- peakenv~ - simple peak-envelope-converter. ----------------- */
typedef struct _peakenv_tilde
{
t_object x_obj;
t_float x_sr;
t_float x_old_peak;
t_float x_c1;
t_float x_releasetime;
t_float x_msi;
} t_peakenv_tilde;
t_class *peakenv_tilde_class;
static void peakenv_tilde_reset(t_peakenv_tilde *x)
{
x->x_old_peak = 0.0f;
}
static void peakenv_tilde_ft1(t_peakenv_tilde *x, t_floatarg f)/* release-time in ms */
{
if(f < 0.0f)
f = 0.0f;
x->x_releasetime = f;
x->x_c1 = exp(-1.0/(x->x_sr*0.001*x->x_releasetime));
}
static t_int *peakenv_tilde_perform(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[2]);
t_peakenv_tilde *x = (t_peakenv_tilde *)(w[3]);
int n = (int)(w[4]);
t_float peak = x->x_old_peak;
t_float c1 = x->x_c1;
t_float absolute;
int i;
for(i=0; i<n; i++)
{
absolute = fabs(*in++);
peak *= c1;
if(absolute > peak)
peak = absolute;
*out++ = peak;
}
/* NAN protect */
if(IEM_DENORMAL(peak))
peak = 0.0f;
x->x_old_peak = peak;
return(w+5);
}
static void peakenv_tilde_dsp(t_peakenv_tilde *x, t_signal **sp)
{
x->x_sr = (t_float)sp[0]->s_sr;
peakenv_tilde_ft1(x, x->x_releasetime);
dsp_add(peakenv_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n);
}
static void *peakenv_tilde_new(t_floatarg f)
{
t_peakenv_tilde *x = (t_peakenv_tilde *)pd_new(peakenv_tilde_class);
if(f <= 0.0f)
f = 0.0f;
x->x_sr = 44100.0f;
peakenv_tilde_ft1(x, f);
x->x_old_peak = 0.0f;
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
outlet_new(&x->x_obj, &s_signal);
x->x_msi = 0;
return(x);
}
void peakenv_tilde_setup(void)
{
peakenv_tilde_class = class_new(gensym("peakenv~"), (t_newmethod)peakenv_tilde_new,
0, sizeof(t_peakenv_tilde), 0, A_DEFFLOAT, 0);
CLASS_MAINSIGNALIN(peakenv_tilde_class, t_peakenv_tilde, x_msi);
class_addmethod(peakenv_tilde_class, (t_method)peakenv_tilde_dsp, gensym("dsp"), 0);
class_addmethod(peakenv_tilde_class, (t_method)peakenv_tilde_ft1, gensym("ft1"), A_FLOAT, 0);
class_addmethod(peakenv_tilde_class, (t_method)peakenv_tilde_reset, gensym("reset"), 0);
// class_sethelpsymbol(peakenv_tilde_class, gensym("iemhelp/help-peakenv~"));
}
--- NEW FILE: makefile ---
TARGET = iemlib1
include ../../Make.include
--- NEW FILE: gate.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
/* --------- gate ---------------------- */
/* ----------- like spigot ------------ */
typedef struct _gate
{
t_object x_obj;
t_float x_state;
} t_gate;
static t_class *gate_class;
static void gate_bang(t_gate *x)
{
if(x->x_state != 0)
outlet_bang(x->x_obj.ob_outlet);
}
static void gate_pointer(t_gate *x, t_gpointer *gp)
{
if(x->x_state != 0)
outlet_pointer(x->x_obj.ob_outlet, gp);
}
static void gate_float(t_gate *x, t_floatarg f)
{
if(x->x_state != 0)
outlet_float(x->x_obj.ob_outlet, f);
}
static void gate_symbol(t_gate *x, t_symbol *s)
{
if(x->x_state != 0)
outlet_symbol(x->x_obj.ob_outlet, s);
}
static void gate_list(t_gate *x, t_symbol *s, int argc, t_atom *argv)
{
if(x->x_state != 0)
outlet_list(x->x_obj.ob_outlet, s, argc, argv);
}
static void gate_anything(t_gate *x, t_symbol *s, int argc, t_atom *argv)
{
if(x->x_state != 0)
outlet_anything(x->x_obj.ob_outlet, s, argc, argv);
}
static void *gate_new(t_floatarg f)
{
t_gate *x = (t_gate *)pd_new(gate_class);
floatinlet_new(&x->x_obj, &x->x_state);
outlet_new(&x->x_obj, 0);
x->x_state = (f==0.0f)?0.0f:1.0f;
return (x);
}
void gate_setup(void)
{
gate_class = class_new(gensym("gate"), (t_newmethod)gate_new, 0,
sizeof(t_gate), 0, A_DEFFLOAT, 0);
class_addbang(gate_class, gate_bang);
class_addpointer(gate_class, gate_pointer);
class_addfloat(gate_class, gate_float);
class_addsymbol(gate_class, gate_symbol);
class_addlist(gate_class, gate_list);
class_addanything(gate_class, gate_anything);
// class_sethelpsymbol(gate_class, gensym("iemhelp/help-gate"));
}
--- NEW FILE: vcf_filter~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <string.h>
#include <math.h>
/* ---------- vcf_filter~ - slow dynamic vcf_filter 1. and 2. order ----------- */
typedef struct _vcf_filter_tilde
{
t_object x_obj;
t_float x_wn1;
t_float x_wn2;
t_float x_msi;
char x_filtname[6];
} t_vcf_filter_tilde;
t_class *vcf_filter_tilde_class;
static t_int *vcf_filter_tilde_perform_snafu(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[4]);
int n = (t_int)(w[6]);
while(n--)
*out++ = *in++;
return(w+7);
}
/*
lp2
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*(wn0 + 2.0f*wn1 + wn2);
wn2 = wn1;
wn1 = wn0;
bp2
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*al*(wn0 - wn2);
wn2 = wn1;
wn1 = wn0;
rbp2
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*l*(wn0 - wn2);
wn2 = wn1;
wn1 = wn0;
hp2
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*(wn0 - 2.0f*wn1 + wn2);
wn2 = wn1;
wn1 = wn0;
*/
static t_int *vcf_filter_tilde_perform_lp2(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *lp = (t_float *)(w[2]);
t_float *q = (t_float *)(w[3]);
t_float *out = (t_float *)(w[4]);
t_vcf_filter_tilde *x = (t_vcf_filter_tilde *)(w[5]);
int i, n = (t_int)(w[6]);
t_float wn0, wn1=x->x_wn1, wn2=x->x_wn2;
t_float l, al, l2, rcp;
for(i=0; i<n; i+=4)
{
l = lp[i];
if(q[i] < 0.000001f)
al = 1000000.0f*l;
else if(q[i] > 1000000.0f)
al = 0.000001f*l;
else
al = l/q[i];
l2 = l*l + 1.0f;
rcp = 1.0f/(al + l2);
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*(wn0 + 2.0f*wn1 + wn2);
wn2 = wn1;
wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*(wn0 + 2.0f*wn1 + wn2);
wn2 = wn1;
wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*(wn0 + 2.0f*wn1 + wn2);
wn2 = wn1;
wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*(wn0 + 2.0f*wn1 + wn2);
wn2 = wn1;
wn1 = wn0;
}
/* NAN protect */
if(IEM_DENORMAL(wn2))
wn2 = 0.0f;
if(IEM_DENORMAL(wn1))
wn1 = 0.0f;
x->x_wn1 = wn1;
x->x_wn2 = wn2;
return(w+7);
}
static t_int *vcf_filter_tilde_perform_bp2(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *lp = (t_float *)(w[2]);
t_float *q = (t_float *)(w[3]);
t_float *out = (t_float *)(w[4]);
t_vcf_filter_tilde *x = (t_vcf_filter_tilde *)(w[5]);
int i, n = (t_int)(w[6]);
t_float wn0, wn1=x->x_wn1, wn2=x->x_wn2;
t_float l, al, l2, rcp;
for(i=0; i<n; i+=4)
{
l = lp[i];
if(q[i] < 0.000001f)
al = 1000000.0f*l;
else if(q[i] > 1000000.0f)
al = 0.000001f*l;
else
al = l/q[i];
l2 = l*l + 1.0f;
rcp = 1.0f/(al + l2);
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*al*(wn0 - wn2);
wn2 = wn1;
wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*al*(wn0 - wn2);
wn2 = wn1;
wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*al*(wn0 - wn2);
wn2 = wn1;
wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*al*(wn0 - wn2);
wn2 = wn1;
wn1 = wn0;
}
/* NAN protect */
if(IEM_DENORMAL(wn2))
wn2 = 0.0f;
if(IEM_DENORMAL(wn1))
wn1 = 0.0f;
x->x_wn1 = wn1;
x->x_wn2 = wn2;
return(w+7);
}
static t_int *vcf_filter_tilde_perform_rbp2(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *lp = (t_float *)(w[2]);
t_float *q = (t_float *)(w[3]);
t_float *out = (t_float *)(w[4]);
t_vcf_filter_tilde *x = (t_vcf_filter_tilde *)(w[5]);
int i, n = (t_int)(w[6]);
t_float wn0, wn1=x->x_wn1, wn2=x->x_wn2;
t_float al, l, l2, rcp;
for(i=0; i<n; i+=4)
{
l = lp[i];
if(q[i] < 0.000001f)
al = 1000000.0f*l;
else if(q[i] > 1000000.0f)
al = 0.000001f*l;
else
al = l/q[i];
l2 = l*l + 1.0f;
rcp = 1.0f/(al + l2);
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*l*(wn0 - wn2);
wn2 = wn1;
wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*l*(wn0 - wn2);
wn2 = wn1;
wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*l*(wn0 - wn2);
wn2 = wn1;
wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = rcp*l*(wn0 - wn2);
wn2 = wn1;
wn1 = wn0;
}
/* NAN protect */
if(IEM_DENORMAL(wn2))
wn2 = 0.0f;
if(IEM_DENORMAL(wn1))
wn1 = 0.0f;
x->x_wn1 = wn1;
x->x_wn2 = wn2;
return(w+7);
}
static t_int *vcf_filter_tilde_perform_hp2(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *lp = (t_float *)(w[2]);
t_float *q = (t_float *)(w[3]);
t_float *out = (t_float *)(w[4]);
t_vcf_filter_tilde *x = (t_vcf_filter_tilde *)(w[5]);
int i, n = (t_int)(w[6]);
t_float wn0, wn1=x->x_wn1, wn2=x->x_wn2;
t_float l, al, l2, rcp, forw;
for(i=0; i<n; i+=4)
{
l = lp[i];
if(q[i] < 0.000001f)
al = 1000000.0f*l;
else if(q[i] > 1000000.0f)
al = 0.000001f*l;
else
al = l/q[i];
l2 = l*l + 1.0f;
rcp = 1.0f/(al + l2);
forw = rcp * (l2 - 1.0f);
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = forw*(wn0 - 2.0f*wn1 + wn2);
wn2 = wn1;
wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = forw*(wn0 - 2.0f*wn1 + wn2);
wn2 = wn1;
wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = forw*(wn0 - 2.0f*wn1 + wn2);
wn2 = wn1;
wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2);
*out++ = forw*(wn0 - 2.0f*wn1 + wn2);
wn2 = wn1;
wn1 = wn0;
}
/* NAN protect */
if(IEM_DENORMAL(wn2))
wn2 = 0.0f;
if(IEM_DENORMAL(wn1))
wn1 = 0.0f;
x->x_wn1 = wn1;
x->x_wn2 = wn2;
return(w+7);
}
static void vcf_filter_tilde_dsp(t_vcf_filter_tilde *x, t_signal **sp)
{
if(!strcmp(x->x_filtname,"bp2"))
dsp_add(vcf_filter_tilde_perform_bp2, 6, sp[0]->s_vec, sp[1]->s_vec,
sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n);
else if(!strcmp(x->x_filtname,"rbp2"))
dsp_add(vcf_filter_tilde_perform_rbp2, 6, sp[0]->s_vec, sp[1]->s_vec,
sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n);
else if(!strcmp(x->x_filtname,"lp2"))
dsp_add(vcf_filter_tilde_perform_lp2, 6, sp[0]->s_vec, sp[1]->s_vec,
sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n);
else if(!strcmp(x->x_filtname,"hp2"))
dsp_add(vcf_filter_tilde_perform_hp2, 6, sp[0]->s_vec, sp[1]->s_vec,
sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n);
else
{
dsp_add(vcf_filter_tilde_perform_snafu, 6, sp[0]->s_vec, sp[1]->s_vec,
sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n);
post("vcf_filter~-Error: 1. initial-arguments: <sym> kind: lp2, bp2, rbp2, hp2!");
}
}
static void *vcf_filter_tilde_new(t_symbol *filt_typ)
{
t_vcf_filter_tilde *x = (t_vcf_filter_tilde *)pd_new(vcf_filter_tilde_class);
char *c;
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
outlet_new(&x->x_obj, &s_signal);
x->x_msi = 0;
x->x_wn1 = 0.0f;
x->x_wn2 = 0.0f;
c = (char *)filt_typ->s_name;
c[5] = 0;
strcpy(x->x_filtname, c);
return(x);
}
void vcf_filter_tilde_setup(void)
{
vcf_filter_tilde_class = class_new(gensym("vcf_filter~"), (t_newmethod)vcf_filter_tilde_new,
0, sizeof(t_vcf_filter_tilde), 0, A_SYMBOL, 0);
CLASS_MAINSIGNALIN(vcf_filter_tilde_class, t_vcf_filter_tilde, x_msi);
class_addmethod(vcf_filter_tilde_class, (t_method)vcf_filter_tilde_dsp, gensym("dsp"), 0);
// class_sethelpsymbol(vcf_filter_tilde_class, gensym("iemhelp/help-vcf_filter~"));
}
--- NEW FILE: iemlib.h ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#ifndef __IEMLIB_H__
#define __IEMLIB_H__
#define IS_A_POINTER(atom,index) ((atom+index)->a_type == A_POINTER)
#define IS_A_FLOAT(atom,index) ((atom+index)->a_type == A_FLOAT)
#define IS_A_SYMBOL(atom,index) ((atom+index)->a_type == A_SYMBOL)
#define IS_A_DOLLAR(atom,index) ((atom+index)->a_type == A_DOLLAR)
#define IS_A_DOLLSYM(atom,index) ((atom+index)->a_type == A_DOLLSYM)
#define IS_A_SEMI(atom,index) ((atom+index)->a_type == A_SEMI)
#define IS_A_COMMA(atom,index) ((atom+index)->a_type == A_COMMA)
#ifdef NT
int sys_noloadbang;
//t_symbol *iemgui_key_sym=0;
#include <io.h>
#else
extern int sys_noloadbang;
//extern t_symbol *iemgui_key_sym;
#include <unistd.h>
#endif
#define DEFDELVS 64
#define XTRASAMPS 4
#define SAMPBLK 4
#define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */
/* machine-dependent definitions. These ifdefs really
should have been by CPU type and not by operating system! */
#ifdef IRIX
/* big-endian. Most significant byte is at low address in memory */
#define HIOFFSET 0 /* word offset to find MSB */
#define LOWOFFSET 1 /* word offset to find LSB */
#define int32 long /* a data type that has 32 bits */
#else
#ifdef MSW
/* little-endian; most significant byte is at highest address */
#define HIOFFSET 1
#define LOWOFFSET 0
#define int32 long
#else
#ifdef __FreeBSD__
#include <machine/endian.h>
#if BYTE_ORDER == LITTLE_ENDIAN
#define HIOFFSET 1
#define LOWOFFSET 0
#else
#define HIOFFSET 0 /* word offset to find MSB */
#define LOWOFFSET 1 /* word offset to find LSB */
#endif /* BYTE_ORDER */
#include <sys/types.h>
#define int32 int32_t
#endif
#ifdef __linux__
#include <endian.h>
#if !defined(__BYTE_ORDER) || !defined(__LITTLE_ENDIAN)
#error No byte order defined
#endif
#if __BYTE_ORDER == __LITTLE_ENDIAN
#define HIOFFSET 1
#define LOWOFFSET 0
#else
#define HIOFFSET 0 /* word offset to find MSB */
#define LOWOFFSET 1 /* word offset to find LSB */
#endif /* __BYTE_ORDER */
#include <sys/types.h>
#define int32 int32_t
#else
#ifdef __APPLE__
#define HIOFFSET 0 /* word offset to find MSB */
#define LOWOFFSET 1 /* word offset to find LSB */
#define int32 int /* a data type that has 32 bits */
#endif /* __APPLE__ */
#endif /* __linux__ */
#endif /* MSW */
#endif /* SGI */
union tabfudge
{
double tf_d;
int32 tf_i[2];
};
#if defined __i386__ || defined __x86_64__
#define IEM_DENORMAL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \
(((*(unsigned int*)&(f))&0x60000000)==0x60000000))
/* more stringent test: anything not between 1e-19 and 1e19 in absolute val */
#else
#define IEM_DENORMAL(f) 0
#endif
#endif
--- NEW FILE: lp1_t~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* -- lp1_t~ - slow dynamic lowpass-filter 1. order with tau input --- */
typedef struct _lp1_t_tilde
{
t_object x_obj;
t_float yn1;
t_float c0;
t_float c1;
t_float sr;
t_float cur_t;
t_float delta_t;
t_float end_t;
t_float ticks_per_interpol_time;
t_float rcp_ticks;
t_float interpol_time;
int ticks;
int counter_t;
t_float x_msi;
} t_lp1_t_tilde;
t_class *lp1_t_tilde_class;
static void lp1_t_tilde_dsp_tick(t_lp1_t_tilde *x)
{
if(x->counter_t)
{
if(x->counter_t <= 1)
{
x->cur_t = x->end_t;
x->counter_t = 0;
}
else
{
x->counter_t--;
x->cur_t += x->delta_t;
}
if(x->cur_t == 0.0f)
x->c1 = 0.0f;
else
x->c1 = exp((x->sr)/x->cur_t);
x->c0 = 1.0f - x->c1;
}
}
static t_int *lp1_t_tilde_perform(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[2]);
t_lp1_t_tilde *x = (t_lp1_t_tilde *)(w[3]);
int i, n = (t_int)(w[4]);
t_float yn0, yn1=x->yn1;
t_float c0=x->c0, c1=x->c1;
lp1_t_tilde_dsp_tick(x);
for(i=0; i<n; i++)
{
yn0 = (*in++)*c0 + yn1*c1;
*out++ = yn0;
yn1 = yn0;
}
/* NAN protect */
if(IEM_DENORMAL(yn1))
yn1 = 0.0f;
x->yn1 = yn1;
return(w+5);
}
static t_int *lp1_t_tilde_perf8(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[2]);
t_lp1_t_tilde *x = (t_lp1_t_tilde *)(w[3]);
int i, n = (t_int)(w[4]);
t_float yn[9];
t_float c0=x->c0, c1=x->c1;
lp1_t_tilde_dsp_tick(x);
yn[0] = x->yn1;
for(i=0; i<n; i+=8, in+=8, out+=8)
{
yn[1] = in[0]*c0 + yn[0]*c1;
out[0] = yn[1];
yn[2] = in[1]*c0 + yn[1]*c1;
out[1] = yn[2];
yn[3] = in[2]*c0 + yn[2]*c1;
out[2] = yn[3];
yn[4] = in[3]*c0 + yn[3]*c1;
out[3] = yn[4];
yn[5] = in[4]*c0 + yn[4]*c1;
out[4] = yn[5];
yn[6] = in[5]*c0 + yn[5]*c1;
out[5] = yn[6];
yn[7] = in[6]*c0 + yn[6]*c1;
out[6] = yn[7];
yn[8] = in[7]*c0 + yn[7]*c1;
out[7] = yn[8];
yn[0] = yn[8];
}
/* NAN protect */
if(IEM_DENORMAL(yn[0]))
yn[0] = 0.0f;
x->yn1 = yn[0];
return(w+5);
}
static void lp1_t_tilde_ft2(t_lp1_t_tilde *x, t_floatarg t)
{
int i = (int)((x->ticks_per_interpol_time)*t);
x->interpol_time = t;
if(i <= 0)
i = 1;
x->ticks = i;
x->rcp_ticks = 1.0f / (t_float)i;
}
static void lp1_t_tilde_ft1(t_lp1_t_tilde *x, t_floatarg time_const)
{
if(time_const < 0.0f)
time_const = 0.0f;
if(time_const != x->cur_t)
{
x->end_t = time_const;
x->counter_t = x->ticks;
x->delta_t = (time_const - x->cur_t) * x->rcp_ticks;
}
}
static void lp1_t_tilde_dsp(t_lp1_t_tilde *x, t_signal **sp)
{
int i, n=(int)sp[0]->s_n;
x->sr = -1000.0f / (t_float)(sp[0]->s_sr);
x->ticks_per_interpol_time = 0.001f * (t_float)(sp[0]->s_sr) / (t_float)n;
i = (int)((x->ticks_per_interpol_time)*(x->interpol_time));
if(i <= 0)
i = 1;
x->ticks = i;
x->rcp_ticks = 1.0f / (t_float)i;
if(x->cur_t == 0.0f)
x->c1 = 0.0f;
else
x->c1 = exp((x->sr)/x->cur_t);
x->c0 = 1.0f - x->c1;
if(n&7)
dsp_add(lp1_t_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n);
else
dsp_add(lp1_t_tilde_perf8, 4, sp[0]->s_vec, sp[1]->s_vec, x, n);
}
static void *lp1_t_tilde_new(t_symbol *s, int argc, t_atom *argv)
{
t_lp1_t_tilde *x = (t_lp1_t_tilde *)pd_new(lp1_t_tilde_class);
int i;
t_float time_const=0.0f, interpol=0.0f;
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft2"));
outlet_new(&x->x_obj, &s_signal);
x->x_msi = 0;
x->counter_t = 1;
x->delta_t = 0.0f;
x->interpol_time = 0.0f;
x->yn1 = 0.0f;
x->sr = -1.0f / 44.1f;
if((argc >= 1)&&IS_A_FLOAT(argv,0))
time_const = (t_float)atom_getfloatarg(0, argc, argv);
if((argc >= 2)&&IS_A_FLOAT(argv,1))
interpol = (t_float)atom_getfloatarg(1, argc, argv);
if(time_const < 0.0f)
time_const = 0.0f;
x->cur_t = time_const;
if(time_const == 0.0f)
x->c1 = 0.0f;
else
x->c1 = exp((x->sr)/time_const);
x->c0 = 1.0f - x->c1;
if(interpol < 0.0f)
interpol = 0.0f;
x->interpol_time = interpol;
x->ticks_per_interpol_time = 0.5f;
i = (int)((x->ticks_per_interpol_time)*(x->interpol_time));
if(i <= 0)
i = 1;
x->ticks = i;
x->rcp_ticks = 1.0f / (t_float)i;
x->end_t = x->cur_t;
return (x);
}
void lp1_t_tilde_setup(void)
{
lp1_t_tilde_class = class_new(gensym("lp1_t~"), (t_newmethod)lp1_t_tilde_new,
0, sizeof(t_lp1_t_tilde), 0, A_GIMME, 0);
CLASS_MAINSIGNALIN(lp1_t_tilde_class, t_lp1_t_tilde, x_msi);
class_addmethod(lp1_t_tilde_class, (t_method)lp1_t_tilde_dsp, gensym("dsp"), 0);
class_addmethod(lp1_t_tilde_class, (t_method)lp1_t_tilde_ft1, gensym("ft1"), A_FLOAT, 0);
class_addmethod(lp1_t_tilde_class, (t_method)lp1_t_tilde_ft2, gensym("ft2"), A_FLOAT, 0);
// class_sethelpsymbol(lp1_t_tilde_class, gensym("iemhelp/help-lp1_t~"));
}
--- NEW FILE: biquad_freq_resp.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* ------------------------ biquad_freq_resp ------------------- */
/* -- calculates the frequency responce of a biquad structure -- */
typedef struct _biquad_freq_resp
{
t_object x_obj;
t_float a0;
t_float a1;
t_float a2;
t_float b1;
t_float b2;
t_outlet *x_out_re;
t_outlet *x_out_im;
} t_biquad_freq_resp;
static t_class *biquad_freq_resp_class;
static void biquad_freq_resp_float(t_biquad_freq_resp *x, t_floatarg f)
{
t_float re1, im1, re2, im2;
t_float c, s, a;
if(f < 0.0f)
f = 0.0f;
else if(f > 180.0f)
f = 180.0;
f *= 3.14159265f;
f /= 180.0f;
c = cos(f);
s = sin(f);
re1 = x->a0 + x->a1*c + x->a2*(c*c - s*s);
im1 = x->a1*s + x->a2*2.0f*(s*c);
re2 = 1.0f - x->b1*c - x->b2*(c*c - s*s);
im2 = -x->b1*s - x->b2*2.0f*(s*c);
a = re2*re2 + im2*im2;
outlet_float(x->x_out_im, (re1*im2 - re2*im1)/a);/* because z^-1 = e^-jwt, negative sign */
outlet_float(x->x_out_re, (re1*re2 + im1*im2)/a);
}
/* y/x = (a0 + a1*z-1 + a2*z-2)/(1 - b1*z-1 - b2*z-2);*/
static void biquad_freq_resp_list(t_biquad_freq_resp *x, t_symbol *s, int argc, t_atom *argv)
{
if((argc == 5)&&IS_A_FLOAT(argv,4)&&IS_A_FLOAT(argv,3)&&IS_A_FLOAT(argv,2)&&IS_A_FLOAT(argv,1)&&IS_A_FLOAT(argv,0))
{
x->b1 = (float)atom_getfloatarg(0, argc, argv);
x->b2 = (float)atom_getfloatarg(1, argc, argv);
x->a0 = (float)atom_getfloatarg(2, argc, argv);
x->a1 = (float)atom_getfloatarg(3, argc, argv);
x->a2 = (float)atom_getfloatarg(4, argc, argv);
}
}
static void *biquad_freq_resp_new(void)
{
t_biquad_freq_resp *x = (t_biquad_freq_resp *)pd_new(biquad_freq_resp_class);
x->x_out_re = outlet_new(&x->x_obj, &s_float);
x->x_out_im = outlet_new(&x->x_obj, &s_float);
x->b1 = 0.0f;
x->b2 = 0.0f;
x->a0 = 0.0f;
x->a1 = 0.0f;
x->a2 = 0.0f;
return (x);
}
void biquad_freq_resp_setup(void)
{
biquad_freq_resp_class = class_new(gensym("biquad_freq_resp"), (t_newmethod)biquad_freq_resp_new, 0,
sizeof(t_biquad_freq_resp), 0, 0);
class_addfloat(biquad_freq_resp_class, biquad_freq_resp_float);
class_addlist(biquad_freq_resp_class, (t_method)biquad_freq_resp_list);
// class_sethelpsymbol(biquad_freq_resp_class, gensym("iemhelp/help-biquad_freq_resp"));
}
--- NEW FILE: iem_cot4~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* ------------------------ iem_cot4~ ----------------------------- */
t_float *iem_cot4_tilde_table_cos=(t_float *)0L;
t_float *iem_cot4_tilde_table_sin=(t_float *)0L;
static t_class *iem_cot4_tilde_class;
typedef struct _iem_cot4_tilde
{
t_object x_obj;
t_float x_sr;
t_float x_msi;
} t_iem_cot4_tilde;
static t_int *iem_cot4_tilde_perform(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[2]);
t_float norm_freq;
t_float hout;
t_iem_cot4_tilde *x = (t_iem_cot4_tilde *)(w[3]);
t_float sr=x->x_sr;
int n = (int)(w[4]);
t_float *ctab = iem_cot4_tilde_table_cos, *stab = iem_cot4_tilde_table_sin;
t_float *caddr, *saddr, cf1, cf2, sf1, sf2, frac;
double dphase;
int normhipart;
int32 mytfi;
union tabfudge tf;
tf.tf_d = UNITBIT32;
normhipart = tf.tf_i[HIOFFSET];
#if 0 /* this is the readable version of the code. */
while (n--)
{
norm_freq = *in * sr;
if(norm_freq < 0.0001f)
norm_freq = 0.0001f;
else if(norm_freq > 0.9f)
norm_freq = 0.9f;
dphase = (double)(norm_freq * (t_float)(COSTABSIZE)) + UNITBIT32;
tf.tf_d = dphase;
mytfi = tf.tf_i[HIOFFSET] & (COSTABSIZE-1);
saddr = stab + (mytfi);
caddr = ctab + (mytfi);
tf.tf_i[HIOFFSET] = normhipart;
frac = tf.tf_d - UNITBIT32;
sf1 = saddr[0];
sf2 = saddr[1];
cf1 = caddr[0];
cf2 = caddr[1];
in++;
*out++ = (cf1 + frac * (cf2 - cf1))/(sf1 + frac * (sf2 - sf1));
}
#endif
#if 1 /* this is the same, unwrapped by hand. prolog beg*/
n /= 4;
norm_freq = *in * sr;
if(norm_freq < 0.0001f)
norm_freq = 0.0001f;
else if(norm_freq > 0.9f)
norm_freq = 0.9f;
dphase = (double)(norm_freq * (t_float)(COSTABSIZE)) + UNITBIT32;
tf.tf_d = dphase;
mytfi = tf.tf_i[HIOFFSET] & (COSTABSIZE-1);
saddr = stab + (mytfi);
caddr = ctab + (mytfi);
tf.tf_i[HIOFFSET] = normhipart;
in += 4; /*prolog end*/
while (--n)
{
norm_freq = *in * sr;
if(norm_freq < 0.0001f)
norm_freq = 0.0001f;
else if(norm_freq > 0.9f)
norm_freq = 0.9f;
dphase = (double)(norm_freq * (t_float)(COSTABSIZE)) + UNITBIT32;
frac = tf.tf_d - UNITBIT32;
tf.tf_d = dphase;
sf1 = saddr[0];
sf2 = saddr[1];
cf1 = caddr[0];
cf2 = caddr[1];
mytfi = tf.tf_i[HIOFFSET] & (COSTABSIZE-1);
saddr = stab + (mytfi);
caddr = ctab + (mytfi);
hout = (cf1 + frac * (cf2 - cf1))/(sf1 + frac * (sf2 - sf1));
*out++ = hout;
*out++ = hout;
*out++ = hout;
*out++ = hout;
in += 4;
tf.tf_i[HIOFFSET] = normhipart;
}/*epilog beg*/
frac = tf.tf_d - UNITBIT32;
sf1 = saddr[0];
sf2 = saddr[1];
cf1 = caddr[0];
cf2 = caddr[1];
hout = (cf1 + frac * (cf2 - cf1))/(sf1 + frac * (sf2 - sf1));
*out++ = hout;
*out++ = hout;
*out++ = hout;
*out++ = hout;
/*epilog end*/
#endif
return (w+5);
}
static void iem_cot4_tilde_dsp(t_iem_cot4_tilde *x, t_signal **sp)
{
x->x_sr = 2.0f / (t_float)sp[0]->s_sr;
dsp_add(iem_cot4_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n);
}
static void iem_cot4_tilde_maketable(void)
{
int i;
t_float *fp, phase, fff, phsinc = 0.5*3.141592653 / ((t_float)COSTABSIZE);
union tabfudge tf;
if(!iem_cot4_tilde_table_sin)
{
iem_cot4_tilde_table_sin = (t_float *)getbytes(sizeof(t_float) * (COSTABSIZE+1));
for(i=COSTABSIZE+1, fp=iem_cot4_tilde_table_sin, phase=0; i--; fp++, phase+=phsinc)
*fp = sin(phase);
}
if(!iem_cot4_tilde_table_cos)
{
iem_cot4_tilde_table_cos = (t_float *)getbytes(sizeof(t_float) * (COSTABSIZE+1));
for(i=COSTABSIZE+1, fp=iem_cot4_tilde_table_cos, phase=0; i--; fp++, phase+=phsinc)
*fp = cos(phase);
}
tf.tf_d = UNITBIT32 + 0.5;
if((unsigned)tf.tf_i[LOWOFFSET] != 0x80000000)
bug("iem_cot4~: unexpected machine alignment");
}
static void *iem_cot4_tilde_new(void)
{
t_iem_cot4_tilde *x = (t_iem_cot4_tilde *)pd_new(iem_cot4_tilde_class);
outlet_new(&x->x_obj, gensym("signal"));
x->x_msi = 0;
return (x);
}
void iem_cot4_tilde_setup(void)
{
iem_cot4_tilde_class = class_new(gensym("iem_cot4~"), (t_newmethod)iem_cot4_tilde_new, 0,
sizeof(t_iem_cot4_tilde), 0, 0);
class_addcreator((t_newmethod)iem_cot4_tilde_new, gensym("iem_cot~"), 0);
CLASS_MAINSIGNALIN(iem_cot4_tilde_class, t_iem_cot4_tilde, x_msi);
class_addmethod(iem_cot4_tilde_class, (t_method)iem_cot4_tilde_dsp, gensym("dsp"), 0);
iem_cot4_tilde_maketable();
// class_sethelpsymbol(iem_cot4_tilde_class, gensym("iemhelp/help-iem_cot4~"));
}
--- NEW FILE: iem_delay~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
/* -------------------------- iem_delay~ ------------------------------ */
static t_class *iem_delay_tilde_class;
#define IEMDELAY_DEF_VEC_SIZE 64
typedef struct _iem_delay_tilde
{
t_object x_obj;
int x_mallocsize;
t_float x_max_delay_ms;
t_float x_current_delay_ms;
t_float *x_begmem1;
t_float *x_begmem2;
int x_writeindex;
int x_blocksize;
int x_delay_samples;
t_float x_sr;
t_float x_msi;
} t_iem_delay_tilde;
static void iem_delay_tilde_cur_del(t_iem_delay_tilde *x, t_floatarg f)
{
if(f < 0.0f)
f = 0.0f;
else if(f > x->x_max_delay_ms)
f = x->x_max_delay_ms;
x->x_current_delay_ms = f;
x->x_delay_samples = (int)(0.001f*x->x_sr * f + 0.5f);
}
static t_int *iem_delay_tilde_perform(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[2]);
t_iem_delay_tilde *x = (t_iem_delay_tilde *)(w[3]);
int n=(int)(w[4]);
int writeindex = x->x_writeindex;
t_float *vec1, *vec2, *vec3;
vec1 = x->x_begmem1 + writeindex;
vec2 = x->x_begmem2 + writeindex;
vec3 = x->x_begmem2 + writeindex - x->x_delay_samples;
writeindex += n;
while(n--)
{
*vec1++ = *vec2++ = *in++;
*out++ = *vec3++;
}
if(writeindex >= x->x_mallocsize)
{
writeindex -= x->x_mallocsize;
}
x->x_writeindex = writeindex;
return(w+5);
}
static t_int *iem_delay_tilde_perf8(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[2]);
t_iem_delay_tilde *x = (t_iem_delay_tilde *)(w[3]);
int i, n=(int)(w[4]);
int writeindex = x->x_writeindex;
t_float *vec1, *vec2;
vec1 = x->x_begmem1 + writeindex;
vec2 = x->x_begmem2 + writeindex;
for(i=0; i<n; i+=8)
{
*vec1++ = *vec2++ = *in++;
*vec1++ = *vec2++ = *in++;
*vec1++ = *vec2++ = *in++;
*vec1++ = *vec2++ = *in++;
*vec1++ = *vec2++ = *in++;
*vec1++ = *vec2++ = *in++;
*vec1++ = *vec2++ = *in++;
*vec1++ = *vec2++ = *in++;
}
vec2 = x->x_begmem2 + writeindex - x->x_delay_samples;
for(i=0; i<n; i+=8)
{
*out++ = *vec2++;
*out++ = *vec2++;
*out++ = *vec2++;
*out++ = *vec2++;
*out++ = *vec2++;
*out++ = *vec2++;
*out++ = *vec2++;
*out++ = *vec2++;
}
writeindex += n;
if(writeindex >= x->x_mallocsize)
{
writeindex -= x->x_mallocsize;
}
x->x_writeindex = writeindex;
return(w+5);
}
static void iem_delay_tilde_dsp(t_iem_delay_tilde *x, t_signal **sp)
{
int blocksize = sp[0]->s_n, i;
if(!x->x_blocksize)/*first time*/
{
int nsamps = x->x_max_delay_ms * (t_float)sp[0]->s_sr * 0.001f;
if(nsamps < 1)
nsamps = 1;
nsamps += ((- nsamps) & (blocksize - 1));
nsamps += blocksize;
x->x_mallocsize = nsamps;
x->x_begmem1 = (t_float *)getbytes(2 * x->x_mallocsize * sizeof(t_float));
x->x_begmem2 = x->x_begmem1 + x->x_mallocsize;
post("beginn = %x", (unsigned long)x->x_begmem1);
x->x_writeindex = blocksize;
x->x_sr = (t_float)sp[0]->s_sr;
x->x_blocksize = blocksize;
x->x_delay_samples = (int)(0.001f*x->x_sr * x->x_current_delay_ms + 0.5f);
}
else if((x->x_blocksize != blocksize) || ((t_float)sp[0]->s_sr != x->x_sr))
{
int nsamps = x->x_max_delay_ms * (t_float)sp[0]->s_sr * 0.001f;
if(nsamps < 1)
nsamps = 1;
nsamps += ((- nsamps) & (blocksize - 1));
nsamps += blocksize;
x->x_begmem1 = (t_float *)resizebytes(x->x_begmem1, 2*x->x_mallocsize*sizeof(t_float), 2*nsamps*sizeof(t_float));
x->x_mallocsize = nsamps;
x->x_begmem2 = x->x_begmem1 + x->x_mallocsize;
post("beginn = %x", (unsigned long)x->x_begmem1);
if(x->x_writeindex >= nsamps)
x->x_writeindex -= nsamps;
x->x_sr = (t_float)sp[0]->s_sr;
x->x_blocksize = blocksize;
x->x_delay_samples = (int)(0.001f*x->x_sr * x->x_current_delay_ms + 0.5f);
}
if(blocksize&7)
dsp_add(iem_delay_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, blocksize);
else
dsp_add(iem_delay_tilde_perf8, 4, sp[0]->s_vec, sp[1]->s_vec, x, blocksize);
}
static void *iem_delay_tilde_new(t_floatarg max_delay_ms, t_floatarg current_delay_ms)
{
t_iem_delay_tilde *x = (t_iem_delay_tilde *)pd_new(iem_delay_tilde_class);
int nsamps;
if(max_delay_ms < 2.0f)
max_delay_ms = 2.0f;
x->x_max_delay_ms = max_delay_ms;
if(current_delay_ms < 0.0f)
current_delay_ms = 0.0f;
else if(current_delay_ms > max_delay_ms)
current_delay_ms = max_delay_ms;
x->x_current_delay_ms = current_delay_ms;
nsamps = max_delay_ms * sys_getsr() * 0.001f;
if(nsamps < 1)
nsamps = 1;
nsamps += ((- nsamps) & (IEMDELAY_DEF_VEC_SIZE - 1));
nsamps += IEMDELAY_DEF_VEC_SIZE;
x->x_mallocsize = nsamps;
x->x_begmem1 = (t_float *)getbytes(2 * x->x_mallocsize * sizeof(t_float));
x->x_begmem2 = x->x_begmem1 + x->x_mallocsize;
x->x_writeindex = IEMDELAY_DEF_VEC_SIZE;
x->x_blocksize = 0;
x->x_sr = 0.0f;
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
outlet_new(&x->x_obj, &s_signal);
x->x_msi = 0.0f;
return (x);
}
static void iem_delay_tilde_free(t_iem_delay_tilde *x)
{
freebytes(x->x_begmem1, 2 * x->x_mallocsize * sizeof(t_float));
}
void iem_delay_tilde_setup(void)
{
iem_delay_tilde_class = class_new(gensym("iem_delay~"), (t_newmethod)iem_delay_tilde_new, (t_method)iem_delay_tilde_free,
sizeof(t_iem_delay_tilde), 0, A_DEFFLOAT, A_DEFFLOAT, 0);
CLASS_MAINSIGNALIN(iem_delay_tilde_class, t_iem_delay_tilde, x_msi);
class_addmethod(iem_delay_tilde_class, (t_method)iem_delay_tilde_dsp, gensym("dsp"), 0);
class_addmethod(iem_delay_tilde_class, (t_method)iem_delay_tilde_cur_del, gensym("ft1"), A_FLOAT, 0);
}
--- NEW FILE: sin_phase~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
/* --- sin_phase~ - output the phase-difference between --- */
/* --- 2 sinewaves with the same frequency in samples ----- */
/* --- as a signal ---------------------------------------- */
typedef struct _sin_phase_tilde
{
t_object x_obj;
t_float x_prev1;
t_float x_prev2;
t_float x_cur_out;
int x_counter1;
int x_counter2;
int x_state1;
int x_state2;
t_float x_msi;
} t_sin_phase_tilde;
t_class *sin_phase_tilde_class;
static t_int *sin_phase_tilde_perform(t_int *w)
{
t_float *in1 = (t_float *)(w[1]);
t_float *in2 = (t_float *)(w[2]);
t_float *out = (t_float *)(w[3]);
t_sin_phase_tilde *x = (t_sin_phase_tilde *)(w[4]);
int i, n = (t_int)(w[5]);
t_float prev1=x->x_prev1;
t_float prev2=x->x_prev2;
t_float cur_out=x->x_cur_out;
int counter1=x->x_counter1;
int counter2=x->x_counter2;
int state1=x->x_state1;
int state2=x->x_state2;
for(i=0; i<n; i++)
{
if((in1[i] >= 0.0f) && (prev1 < 0.0f))
{/* pos. zero cross of sig_in_1 */
state1 = 1;
counter1 = 0;
}
else if((in1[i] < 0.0f) && (prev1 >= 0.0f))
{/* neg. zero cross of sig_in_1 */
state2 = 1;
counter2 = 0;
}
if((in2[i] >= 0.0f) && (prev2 < 0.0f))
{/* pos. zero cross of sig_in_2 */
state1 = 0;
cur_out = (t_float)(counter1);
counter1 = 0;
}
else if((in2[i] < 0.0f) && (prev2 >= 0.0f))
{/* neg. zero cross of sig_in_2 */
state2 = 0;
cur_out = (t_float)(counter2);
counter2 = 0;
}
if(state1)
counter1++;
if(state2)
counter2++;
prev1 = in1[i];
prev2 = in2[i];
out[i] = cur_out;
}
x->x_prev1 = prev1;
x->x_prev2 = prev2;
x->x_cur_out = cur_out;
x->x_counter1 = counter1;
x->x_counter2 = counter2;
x->x_state1 = state1;
x->x_state2 = state2;
return(w+6);
}
static void sin_phase_tilde_dsp(t_sin_phase_tilde *x, t_signal **sp)
{
dsp_add(sin_phase_tilde_perform, 5, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, x, sp[0]->s_n);
}
static void *sin_phase_tilde_new(void)
{
t_sin_phase_tilde *x = (t_sin_phase_tilde *)pd_new(sin_phase_tilde_class);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
outlet_new(&x->x_obj, &s_signal);
x->x_prev1 = 0.0f;
x->x_prev2 = 0.0f;
x->x_cur_out = 0.0f;
x->x_counter1 = 0;
x->x_counter2 = 0;
x->x_state1 = 0;
x->x_state2 = 0;
x->x_msi = 0;
return (x);
}
void sin_phase_tilde_setup(void)
{
sin_phase_tilde_class = class_new(gensym("sin_phase~"), (t_newmethod)sin_phase_tilde_new,
0, sizeof(t_sin_phase_tilde), 0, 0);
CLASS_MAINSIGNALIN(sin_phase_tilde_class, t_sin_phase_tilde, x_msi);
class_addmethod(sin_phase_tilde_class, (t_method)sin_phase_tilde_dsp, gensym("dsp"), 0);
// class_sethelpsymbol(sin_phase_tilde_class, gensym("iemhelp/help-sin_phase~"));
}
--- NEW FILE: iemlib1.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
static t_class *iemlib1_class;
static void *iemlib1_new(void)
{
t_object *x = (t_object *)pd_new(iemlib1_class);
return (x);
}
void biquad_freq_resp_setup(void);
void db2v_setup(void);
void f2note_setup(void);
void filter_tilde_setup(void);
void FIR_tilde_setup(void);
void forpp_setup(void);
void gate_setup(void);
void hml_shelf_tilde_setup(void);
void iem_cot4_tilde_setup(void);
void iem_delay_tilde_setup(void);
void iem_pow4_tilde_setup(void);
void iem_sqrt4_tilde_setup(void);
void lp1_t_tilde_setup(void);
void mov_avrg_kern_tilde_setup(void);
void para_bp2_tilde_setup(void);
void peakenv_tilde_setup(void);
void prvu_tilde_setup(void);
void pvu_tilde_setup(void);
void rvu_tilde_setup(void);
void sin_phase_tilde_setup(void);
void soundfile_info_setup(void);
void split_setup(void);
void v2db_setup(void);
void vcf_filter_tilde_setup(void);
/* ------------------------ setup routine ------------------------- */
void iemlib1_setup(void)
{
iemlib1_class = class_new(gensym("iemlib1"), iemlib1_new, 0,
sizeof(t_object), CLASS_NOINLET, 0);
biquad_freq_resp_setup();
db2v_setup();
f2note_setup();
filter_tilde_setup();
FIR_tilde_setup();
forpp_setup();
gate_setup();
hml_shelf_tilde_setup();
iem_cot4_tilde_setup();
iem_delay_tilde_setup();
iem_pow4_tilde_setup();
iem_sqrt4_tilde_setup();
lp1_t_tilde_setup();
mov_avrg_kern_tilde_setup();
para_bp2_tilde_setup();
peakenv_tilde_setup();
prvu_tilde_setup();
pvu_tilde_setup();
rvu_tilde_setup();
sin_phase_tilde_setup();
soundfile_info_setup();
split_setup();
v2db_setup();
vcf_filter_tilde_setup();
post("iemlib1 (R-1.17) library loaded! (c) Thomas Musil 11.2006");
post(" musil%ciem.at iem KUG Graz Austria", '@');
}
--- NEW FILE: FIR~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
/* ---------- FIR~ - FIR-filter with table-coef ----------- */
typedef struct _FIR_tilde
{
t_object x_obj;
t_float *x_coef_beg;
t_float *x_history_beg;
int x_rw_index;
int x_fir_order;
t_symbol *x_table_name;
t_float x_msi;
} t_FIR_tilde;
t_class *FIR_tilde_class;
static t_int *FIR_tilde_perform(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_float *out = (t_float *)(w[2]);
t_FIR_tilde *x = (t_FIR_tilde *)(w[3]);
int n = (t_int)(w[4]);
int rw_index = x->x_rw_index;
int i, j;
int order = x->x_fir_order;
int ord16 = order / 16;
t_float sum=0.0f;
t_float *coef = x->x_coef_beg;
t_float *write_hist1=x->x_history_beg;
t_float *write_hist2;
t_float *read_hist;
t_float *coef_vec;
t_float *hist_vec;
if(!coef)
goto FIR_tildeperfzero;
write_hist1 = x->x_history_beg;
write_hist2 = write_hist1 + order;
read_hist = write_hist2;
for(i=0; i<n; i++)
{
write_hist1[rw_index] = in[i];
write_hist2[rw_index] = in[i];
sum = 0.0f;
coef_vec = coef;
hist_vec = &read_hist[rw_index];
for(j=0; j<ord16; j++)
{
sum += coef_vec[0] * hist_vec[0];
sum += coef_vec[1] * hist_vec[-1];
sum += coef_vec[2] * hist_vec[-2];
sum += coef_vec[3] * hist_vec[-3];
sum += coef_vec[4] * hist_vec[-4];
sum += coef_vec[5] * hist_vec[-5];
sum += coef_vec[6] * hist_vec[-6];
sum += coef_vec[7] * hist_vec[-7];
sum += coef_vec[8] * hist_vec[-8];
sum += coef_vec[9] * hist_vec[-9];
sum += coef_vec[10] * hist_vec[-10];
sum += coef_vec[11] * hist_vec[-11];
sum += coef_vec[12] * hist_vec[-12];
sum += coef_vec[13] * hist_vec[-13];
sum += coef_vec[14] * hist_vec[-14];
sum += coef_vec[15] * hist_vec[-15];
coef_vec += 16;
hist_vec -= 16;
}
for(j=ord16*16; j<order; j++)
{
sum += coef[j] * read_hist[rw_index-j];
}
out[i] = sum;
rw_index++;
if(rw_index >= order)
rw_index -= order;
}
x->x_rw_index = rw_index;
return(w+5);
FIR_tildeperfzero:
while(n--)
*out++ = 0.0f;
return(w+5);
}
void FIR_tilde_set(t_FIR_tilde *x, t_symbol *table_name, t_floatarg forder)
{
t_garray *ga;
int table_size;
int order = (int)forder;
x->x_table_name = table_name;
if(!(ga = (t_garray *)pd_findbyclass(x->x_table_name, garray_class)))
{
if(*table_name->s_name)
error("FIR~: %s: no such table~", x->x_table_name->s_name);
x->x_coef_beg = 0;
}
else if(!garray_getfloatarray(ga, &table_size, &x->x_coef_beg))
{
error("%s: bad template for FIR~", x->x_table_name->s_name);
x->x_coef_beg = 0;
}
else if(table_size < order)
{
error("FIR~: tablesize %d < order %d !!!!", table_size, order);
x->x_coef_beg = 0;
}
else
garray_usedindsp(ga);
x->x_rw_index = 0;
if(order > x->x_fir_order)/* resize */
x->x_history_beg = (t_float *)resizebytes(x->x_history_beg, 2*x->x_fir_order*sizeof(t_float), 2*order*sizeof(float));
x->x_fir_order = order;
}
static void FIR_tilde_dsp(t_FIR_tilde *x, t_signal **sp)
{
FIR_tilde_set(x, x->x_table_name, x->x_fir_order);
dsp_add(FIR_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n);
}
static void *FIR_tilde_new(t_symbol *ref, t_floatarg np)
{
t_FIR_tilde *x = (t_FIR_tilde *)pd_new(FIR_tilde_class);
outlet_new(&x->x_obj, &s_signal);
x->x_msi = 0;
x->x_table_name = ref;
x->x_coef_beg = 0;
if((int)np < 1)
np = 1.0;
x->x_fir_order = (int)np;
x->x_history_beg = (t_float *)getbytes((2*x->x_fir_order)*sizeof(t_float));
x->x_rw_index = 0;
return(x);
}
static void FIR_tilde_free(t_FIR_tilde *x)
{
if(x->x_history_beg)
freebytes(x->x_history_beg, (2*x->x_fir_order)*sizeof(t_float));
}
void FIR_tilde_setup(void)
{
FIR_tilde_class = class_new(gensym("FIR~"), (t_newmethod)FIR_tilde_new,
(t_method)FIR_tilde_free, sizeof(t_FIR_tilde), 0, A_DEFSYM, A_DEFFLOAT, 0);
CLASS_MAINSIGNALIN(FIR_tilde_class, t_FIR_tilde, x_msi);
class_addmethod(FIR_tilde_class, (t_method)FIR_tilde_dsp, gensym("dsp"), 0);
class_addmethod(FIR_tilde_class, (t_method)FIR_tilde_set,
gensym("set"), A_SYMBOL, A_FLOAT, 0);
// class_sethelpsymbol(FIR_tilde_class, gensym("iemhelp/help-FIR~"));
}
--- NEW FILE: split.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
/* --------- split is like moses ----------- */
typedef struct _split
{
t_object x_obj;
t_outlet *x_out_less;
t_outlet *x_out_greater_equal;
float x_threshold;
} t_split;
static t_class *split_class;
static void split_float(t_split *x, t_float f)
{
if(f < x->x_threshold)
outlet_float(x->x_out_less, f);
else
outlet_float(x->x_out_greater_equal, f);
}
static void *split_new(t_floatarg f)
{
t_split *x = (t_split *)pd_new(split_class);
floatinlet_new(&x->x_obj, &x->x_threshold);
x->x_out_less = outlet_new(&x->x_obj, &s_float);
x->x_out_greater_equal = outlet_new(&x->x_obj, &s_float);
x->x_threshold = f;
return (x);
}
void split_setup(void)
{
split_class = class_new(gensym("split"), (t_newmethod)split_new, 0,
sizeof(t_split), 0, A_DEFFLOAT, 0);
class_addfloat(split_class, split_float);
// class_sethelpsymbol(split_class, gensym("iemhelp/help-split"));
}
--- NEW FILE: rvu~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* ---------------- rvu~ - simple peak&rms-vu-meter. ----------------- */
typedef struct _rvu_tilde
{
t_object x_obj;
void *x_clock_metro;
t_float x_metro_time;
t_float x_sum_rms;
t_float x_old_rms;
t_float x_rcp;
t_float x_sr;
t_float x_release_time;
t_float x_c1;
int x_started;
t_float x_msi;
} t_rvu_tilde;
t_class *rvu_tilde_class;
static void rvu_tilde_tick_metro(t_rvu_tilde *x);
static void rvu_tilde_reset(t_rvu_tilde *x)
{
outlet_float(x->x_obj.ob_outlet, -99.9f);
x->x_sum_rms = 0.0f;
x->x_old_rms = 0.0f;
clock_delay(x->x_clock_metro, x->x_metro_time);
}
static void rvu_tilde_stop(t_rvu_tilde *x)
{
clock_unset(x->x_clock_metro);
x->x_started = 0;
}
static void rvu_tilde_start(t_rvu_tilde *x)
{
clock_delay(x->x_clock_metro, x->x_metro_time);
x->x_started = 1;
}
static void rvu_tilde_float(t_rvu_tilde *x, t_floatarg f)
{
if(f == 0.0f)
{
clock_unset(x->x_clock_metro);
x->x_started = 0;
}
else
{
clock_delay(x->x_clock_metro, x->x_metro_time);
x->x_started = 1;
}
}
static void rvu_tilde_t_release(t_rvu_tilde *x, t_floatarg release_time)
{
if(release_time <= 5.0f)
release_time = 5.0f;
x->x_release_time = release_time;
x->x_c1 = exp(-2.0f*x->x_metro_time/x->x_release_time);
}
static void rvu_tilde_t_metro(t_rvu_tilde *x, t_floatarg metro_time)
{
if(metro_time <= 5.0f)
metro_time = 5.0f;
x->x_metro_time = metro_time;
x->x_c1 = exp(-2.0f*x->x_metro_time/x->x_release_time);
x->x_rcp = 1.0f/(x->x_sr*x->x_metro_time);
}
static t_int *rvu_tilde_perform(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_rvu_tilde *x = (t_rvu_tilde *)(w[2]);
int n = (int)(w[3]);
t_float sum=x->x_sum_rms;
int i;
if(x->x_started)
{
for(i=0; i<n; i++)
{
sum += in[i]*in[i];
}
x->x_sum_rms = sum;
}
return(w+4);
}
static void rvu_tilde_dsp(t_rvu_tilde *x, t_signal **sp)
{
x->x_sr = 0.001*(t_float)sp[0]->s_sr;
x->x_rcp = 1.0f/(x->x_sr*x->x_metro_time);
dsp_add(rvu_tilde_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
clock_delay(x->x_clock_metro, x->x_metro_time);
}
static void rvu_tilde_tick_metro(t_rvu_tilde *x)
{
t_float dbr, cur_rms, c1=x->x_c1;
cur_rms = (1.0f - c1)*x->x_sum_rms*x->x_rcp + c1*x->x_old_rms;
/* NAN protect */
if(IEM_DENORMAL(cur_rms))
cur_rms = 0.0f;
if(cur_rms <= 0.0000000001f)
dbr = -99.9f;
else if(cur_rms > 1000000.0f)
{
dbr = 60.0f;
x->x_old_rms = 1000000.0f;
}
else
dbr = 4.3429448195f*log(cur_rms);
x->x_sum_rms = 0.0f;
x->x_old_rms = cur_rms;
outlet_float(x->x_obj.ob_outlet, dbr);
clock_delay(x->x_clock_metro, x->x_metro_time);
}
static void rvu_tilde_ff(t_rvu_tilde *x)
{
clock_free(x->x_clock_metro);
}
static void *rvu_tilde_new(t_floatarg metro_time, t_floatarg release_time)
{
t_rvu_tilde *x=(t_rvu_tilde *)pd_new(rvu_tilde_class);
if(metro_time <= 0.0f)
metro_time = 300.0f;
if(metro_time <= 5.0f)
metro_time = 5.0f;
if(release_time <= 0.0f)
release_time = 300.0f;
if(release_time <= 5.0f)
release_time = 5.0f;
x->x_metro_time = metro_time;
x->x_release_time = release_time;
x->x_c1 = exp(-2.0f*x->x_metro_time/x->x_release_time);
x->x_sum_rms = 0.0f;
x->x_old_rms = 0.0f;
x->x_sr = 44.1f;
x->x_rcp = 1.0f/(x->x_sr*x->x_metro_time);
x->x_clock_metro = clock_new(x, (t_method)rvu_tilde_tick_metro);
x->x_started = 1;
outlet_new(&x->x_obj, &s_float);
x->x_msi = 0.0f;
return(x);
}
void rvu_tilde_setup(void)
{
rvu_tilde_class = class_new(gensym("rvu~"), (t_newmethod)rvu_tilde_new,
(t_method)rvu_tilde_ff, sizeof(t_rvu_tilde), 0,
A_DEFFLOAT, A_DEFFLOAT, 0);
CLASS_MAINSIGNALIN(rvu_tilde_class, t_rvu_tilde, x_msi);
class_addmethod(rvu_tilde_class, (t_method)rvu_tilde_dsp, gensym("dsp"), 0);
class_addfloat(rvu_tilde_class, rvu_tilde_float);
class_addmethod(rvu_tilde_class, (t_method)rvu_tilde_reset, gensym("reset"), 0);
class_addmethod(rvu_tilde_class, (t_method)rvu_tilde_start, gensym("start"), 0);
class_addmethod(rvu_tilde_class, (t_method)rvu_tilde_stop, gensym("stop"), 0);
class_addmethod(rvu_tilde_class, (t_method)rvu_tilde_t_release, gensym("t_release"), A_FLOAT, 0);
class_addmethod(rvu_tilde_class, (t_method)rvu_tilde_t_metro, gensym("t_metro"), A_FLOAT, 0);
// class_sethelpsymbol(rvu_tilde_class, gensym("iemhelp/help-rvu~"));
}
--- NEW FILE: pvu~.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* ---------------- pvu~ - simple peak-vu-meter. ----------------- */
typedef struct _pvu_tilde
{
t_object x_obj;
void *x_outlet_meter;
void *x_outlet_over;
void *x_clock;
t_float x_cur_peak;
t_float x_old_peak;
t_float x_threshold_over;
t_float x_c1;
t_float x_metro_time;
t_float x_release_time;
int x_overflow_counter;
int x_started;
t_float x_msi;
} t_pvu_tilde;
t_class *pvu_tilde_class;
static void pvu_tilde_tick(t_pvu_tilde *x);
static void pvu_tilde_reset(t_pvu_tilde *x)
{
outlet_float(x->x_outlet_over, 0.0f);
outlet_float(x->x_outlet_meter, -199.9f);
x->x_overflow_counter = 0;
x->x_cur_peak = 0.0f;
x->x_old_peak = 0.0f;
clock_delay(x->x_clock, x->x_metro_time);
}
static void pvu_tilde_stop(t_pvu_tilde *x)
{
clock_unset(x->x_clock);
x->x_started = 0;
}
static void pvu_tilde_start(t_pvu_tilde *x)
{
clock_delay(x->x_clock, x->x_metro_time);
x->x_started = 1;
}
static void pvu_tilde_float(t_pvu_tilde *x, t_floatarg f)
{
if(f == 0.0)
{
clock_unset(x->x_clock);
x->x_started = 0;
}
else
{
clock_delay(x->x_clock, x->x_metro_time);
x->x_started = 1;
}
}
static void pvu_tilde_t_release(t_pvu_tilde *x, t_floatarg release_time)
{
if(release_time <= 5.0f)
release_time = 5.0f;
x->x_release_time = release_time;
x->x_c1 = exp(-x->x_metro_time/release_time);
}
static void pvu_tilde_t_metro(t_pvu_tilde *x, t_floatarg metro_time)
{
if(metro_time <= 5.0f)
metro_time = 5.0f;
x->x_metro_time = (int)metro_time;
x->x_c1 = exp(-metro_time/x->x_release_time);
}
static void pvu_tilde_threshold(t_pvu_tilde *x, t_floatarg thresh)
{
x->x_threshold_over = thresh;
}
static t_int *pvu_tilde_perform(t_int *w)
{
t_float *in = (t_float *)(w[1]);
t_pvu_tilde *x = (t_pvu_tilde *)(w[2]);
int n = (int)(w[3]);
t_float peak = x->x_cur_peak;
t_float absolute;
int i;
if(x->x_started)
{
for(i=0; i<n; i++)
{
absolute = fabs(*in++);
if(absolute > peak)
peak = absolute;
}
x->x_cur_peak = peak;
}
return(w+4);
}
static void pvu_tilde_dsp(t_pvu_tilde *x, t_signal **sp)
{
dsp_add(pvu_tilde_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
clock_delay(x->x_clock, x->x_metro_time);
}
static void pvu_tilde_tick(t_pvu_tilde *x)
{
t_float db;
int i;
x->x_old_peak *= x->x_c1;
/* NAN protect */
if(IEM_DENORMAL(x->x_old_peak))
x->x_old_peak = 0.0f;
if(x->x_cur_peak > x->x_old_peak)
x->x_old_peak = x->x_cur_peak;
if(x->x_old_peak <= 0.0000000001f)
db = -199.9f;
else if(x->x_old_peak > 1000000.0f)
{
db = 120.0f;
x->x_old_peak = 1000000.0f;
}
else
db = 8.6858896381f*log(x->x_old_peak);
if(db >= x->x_threshold_over)
{
x->x_overflow_counter++;
outlet_float(x->x_outlet_over, (t_float)x->x_overflow_counter);
}
outlet_float(x->x_outlet_meter, db);
x->x_cur_peak = 0.0f;
clock_delay(x->x_clock, x->x_metro_time);
}
static void *pvu_tilde_new(t_floatarg metro_time, t_floatarg release_time, t_floatarg threshold)
{
t_pvu_tilde *x;
t_float t;
x = (t_pvu_tilde *)pd_new(pvu_tilde_class);
if(metro_time <= 0.0f)
metro_time = 300.0f;
if(metro_time <= 5.0f)
metro_time = 5.0f;
if(release_time <= 0.0f)
release_time = 300.0f;
if(release_time <= 5.0f)
release_time = 5.0f;
if(threshold == 0.0f)
threshold = -0.01f;
x->x_threshold_over = threshold;
x->x_overflow_counter = 0;
x->x_metro_time = metro_time;
x->x_release_time = release_time;
x->x_c1 = exp(-metro_time/release_time);
x->x_cur_peak = 0.0f;
x->x_old_peak = 0.0f;
x->x_clock = clock_new(x, (t_method)pvu_tilde_tick);
x->x_outlet_meter = outlet_new(&x->x_obj, &s_float);/* left */
x->x_outlet_over = outlet_new(&x->x_obj, &s_float); /* right */
x->x_started = 1;
x->x_msi = 0;
return(x);
}
static void pvu_tilde_ff(t_pvu_tilde *x)
{
clock_free(x->x_clock);
}
void pvu_tilde_setup(void )
{
pvu_tilde_class = class_new(gensym("pvu~"), (t_newmethod)pvu_tilde_new,
(t_method)pvu_tilde_ff, sizeof(t_pvu_tilde), 0, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0);
CLASS_MAINSIGNALIN(pvu_tilde_class, t_pvu_tilde, x_msi);
class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_dsp, gensym("dsp"), 0);
class_addfloat(pvu_tilde_class, pvu_tilde_float);
class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_reset, gensym("reset"), 0);
class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_start, gensym("start"), 0);
class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_stop, gensym("stop"), 0);
class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_t_release, gensym("t_release"), A_FLOAT, 0);
class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_t_metro, gensym("t_metro"), A_FLOAT, 0);
class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_threshold, gensym("threshold"), A_FLOAT, 0);
// class_sethelpsymbol(pvu_tilde_class, gensym("iemhelp/help-pvu~"));
}
--- NEW FILE: iemlib1.dsp ---
# Microsoft Developer Studio Project File - Name="iemlib1" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** NICHT BEARBEITEN **
# TARGTYPE "Win32 (x86) External Target" 0x0106
CFG=iemlib1 - Win32 Debug
!MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl
!MESSAGE
!MESSAGE NMAKE /f "iemlib1.mak".
!MESSAGE
!MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
!MESSAGE
!MESSAGE NMAKE /f "iemlib1.mak" CFG="iemlib1 - Win32 Debug"
!MESSAGE
!MESSAGE Für die Konfiguration stehen zur Auswahl:
!MESSAGE
!MESSAGE "iemlib1 - Win32 Release" (basierend auf "Win32 (x86) External Target")
!MESSAGE "iemlib1 - Win32 Debug" (basierend auf "Win32 (x86) External Target")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
!IF "$(CFG)" == "iemlib1 - Win32 Release"
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Cmd_Line "NMAKE /f makefile_win"
# PROP BASE Rebuild_Opt "/a"
# PROP BASE Target_File "makefile_win.exe"
# PROP BASE Bsc_Name "makefile_win.bsc"
# PROP BASE Target_Dir ""
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Cmd_Line "NMAKE /f makefile_win"
# PROP Rebuild_Opt "/a"
# PROP Target_File "iemlib1.exe"
# PROP Bsc_Name "iemlib1.bsc"
# PROP Target_Dir ""
!ELSEIF "$(CFG)" == "iemlib1 - Win32 Debug"
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Cmd_Line "NMAKE /f makefile_win"
# PROP BASE Rebuild_Opt "/a"
# PROP BASE Target_File "makefile_win.exe"
# PROP BASE Bsc_Name "makefile_win.bsc"
# PROP BASE Target_Dir ""
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Cmd_Line "NMAKE /f makefile_win"
# PROP Rebuild_Opt "/a"
# PROP Target_File "iemlib1.exe"
# PROP Bsc_Name "iemlib1.bsc"
# PROP Target_Dir ""
!ENDIF
# Begin Target
# Name "iemlib1 - Win32 Release"
# Name "iemlib1 - Win32 Debug"
!IF "$(CFG)" == "iemlib1 - Win32 Release"
!ELSEIF "$(CFG)" == "iemlib1 - Win32 Debug"
!ENDIF
# Begin Source File
SOURCE=.\makefile_win
# End Source File
# End Target
# End Project
--- NEW FILE: for++.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
/* ----------------------------- for++ -------------------------------- */
/* -- an internal timed counter (start-, stop-number and metro-time) -- */
typedef struct _forpp
{
t_object x_obj;
int x_beg;
int x_end;
t_float x_delay;
int x_cur;
int x_incr;
void *x_out_end;
void *x_clock;
void *x_clock2;
} t_forpp;
static t_class *forpp_class;
static void forpp_tick2(t_forpp *x)
{
outlet_bang(x->x_out_end);
clock_unset(x->x_clock2);
}
static void forpp_tick(t_forpp *x)
{
outlet_float(x->x_obj.ob_outlet, x->x_cur);
x->x_cur += x->x_incr;
if(x->x_incr > 0)
{
if(x->x_cur <= x->x_end)
clock_delay(x->x_clock, x->x_delay);
else
{
clock_unset(x->x_clock);
clock_delay(x->x_clock2, x->x_delay);
}
}
else
{
if(x->x_cur >= x->x_end)
clock_delay(x->x_clock, x->x_delay);
else
{
clock_unset(x->x_clock);
clock_delay(x->x_clock2, x->x_delay);
}
}
}
static void forpp_bang(t_forpp *x)
{
x->x_cur = x->x_beg;
outlet_float(x->x_obj.ob_outlet, x->x_cur);
x->x_cur += x->x_incr;
if(x->x_incr > 0)
{
if(x->x_cur <= x->x_end)
clock_delay(x->x_clock, x->x_delay);
else
{
clock_unset(x->x_clock);
clock_delay(x->x_clock2, x->x_delay);
}
}
else
{
if(x->x_cur >= x->x_end)
clock_delay(x->x_clock, x->x_delay);
else
{
clock_unset(x->x_clock);
clock_delay(x->x_clock2, x->x_delay);
}
}
}
static void forpp_start(t_forpp *x)
{
forpp_bang(x);
}
static void forpp_stop(t_forpp *x)
{
if(x->x_incr > 0)
x->x_cur = x->x_end + 1;
else
x->x_cur = x->x_end - 1;
clock_unset(x->x_clock);
clock_unset(x->x_clock2);
}
static void forpp_float(t_forpp *x, t_floatarg beg)
{
x->x_beg = (int)beg;
if(x->x_end < x->x_beg)
x->x_incr = -1;
else
x->x_incr = 1;
}
static void forpp_ft1(t_forpp *x, t_floatarg end)
{
x->x_end = (int)end;
if(x->x_end < x->x_beg)
x->x_incr = -1;
else
x->x_incr = 1;
}
static void forpp_ft2(t_forpp *x, t_floatarg delay)
{
if(delay < 0.0)
delay = 0.0;
x->x_delay = delay;
}
static void forpp_list(t_forpp *x, t_symbol *s, int argc, t_atom *argv)
{
if(argc == 2)
{
forpp_float(x, atom_getfloatarg(0, argc, argv));
forpp_ft1(x, atom_getfloatarg(1, argc, argv));
}
else if(argc == 3)
{
forpp_float(x, atom_getfloatarg(0, argc, argv));
forpp_ft1(x, atom_getfloatarg(1, argc, argv));
forpp_ft2(x, atom_getfloatarg(2, argc, argv));
}
}
static void *forpp_new(t_floatarg beg, t_floatarg end, t_floatarg delay)
{
t_forpp *x = (t_forpp *)pd_new(forpp_class);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft2"));
outlet_new(&x->x_obj, &s_float);
x->x_out_end = outlet_new(&x->x_obj, &s_bang);
x->x_clock = clock_new(x, (t_method)forpp_tick);
x->x_clock2 = clock_new(x, (t_method)forpp_tick2);
x->x_beg = (int)beg;
x->x_end = (int)end;
if(x->x_end < x->x_beg)
x->x_incr = -1;
else
x->x_incr = 1;
if(delay < 0.0)
delay = 0.0;
x->x_delay = delay;
x->x_cur = x->x_beg;
return(x);
}
static void forpp_ff(t_forpp *x)
{
clock_free(x->x_clock);
clock_free(x->x_clock2);
}
void forpp_setup(void)
{
forpp_class = class_new(gensym("for++"), (t_newmethod)forpp_new,
(t_method)forpp_ff, sizeof(t_forpp),
0, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0);
class_addbang(forpp_class, forpp_bang);
class_addfloat(forpp_class, forpp_float);
class_addlist(forpp_class, forpp_list);
class_addmethod(forpp_class, (t_method)forpp_start, gensym("start"), 0);
class_addmethod(forpp_class, (t_method)forpp_stop, gensym("stop"), 0);
class_addmethod(forpp_class, (t_method)forpp_ft1, gensym("ft1"), A_FLOAT, 0);
class_addmethod(forpp_class, (t_method)forpp_ft2, gensym("ft2"), A_FLOAT, 0);
// class_sethelpsymbol(forpp_class, gensym("iemhelp/help-for++"));
}
--- NEW FILE: iemlib1.dsw ---
(This appears to be a binary file; contents omitted.)
--- NEW FILE: v2db.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* -------- v2db - a rms-value to techn. dB converter. --------- */
static t_class *v2db_class;
t_float v2db(t_float f)
{
return (f <= 0 ? -199.9 : 8.6858896381*log(f));
}
static void v2db_float(t_object *x, t_float f)
{
outlet_float(x->ob_outlet, v2db(f));
}
static void *v2db_new(void)
{
t_object *x = (t_object *)pd_new(v2db_class);
outlet_new(x, &s_float);
return (x);
}
void v2db_setup(void)
{
v2db_class = class_new(gensym("v2db"), v2db_new, 0,
sizeof(t_object), 0, 0);
class_addfloat(v2db_class, (t_method)v2db_float);
// class_sethelpsymbol(v2db_class, gensym("iemhelp/help-v2db"));
}
--- NEW FILE: f2note.c ---
/* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h"
#include "iemlib.h"
#include <math.h>
/* ------------------------- f2note ---------------------- */
/* ------ frequency to note plus cents converter --------- */
typedef struct _f2note
{
t_object x_obj;
void *x_outlet_midi;
void *x_outlet_note;
void *x_outlet_cent;
int x_centomidi;
t_float x_refhz;
t_float x_refexp;
t_float x_reflog;
t_symbol *x_set;
} t_f2note;
static t_class *f2note_class;
t_float f2note_mtof(t_f2note *x, t_float midi)
{
return(x->x_refexp * exp(0.057762265047 * midi));
}
t_float f2note_ftom(t_f2note *x, t_float freq)
{
return (freq > 0 ? 17.31234049 * log(x->x_reflog * freq) : -1500);
}
void f2note_calc_ref(t_f2note *x)
{
t_float ln2=log(2.0);
x->x_refexp = x->x_refhz*exp(-5.75*ln2);
x->x_reflog = 1.0/x->x_refexp;
}
static void f2note_make_note(char *str, int midi)
{
int j,k,l=0;
j = midi / 12;
k = midi % 12;
if(k <= 5)
{
if(k <= 2)
{
if(k==0)
str[l]='c';
else if(k==1)
{
str[l++]='#';
str[l]='c';
}
else
str[l]='d';
}
else
{
if(k==3)
{
str[l++]='#';
str[l]='d';
}
else if(k==4)
str[l]='e';
else
str[l]='f';
}
}
else
{
if(k <= 8)
{
if(k==6)
{
str[l++]='#';
str[l]='f';
}
else if(k==7)
str[l]='g';
else
{
str[l++]='#';
str[l]='g';
}
}
else
{
if(k==9)
str[l]='a';
else if(k==10)
{
str[l++]='#';
str[l]='a';
}
else
str[l]='h';
}
}
if(j < 4)
{
str[l] -= 'a';
str[l] += 'A';
}
l++;
if(j < 3)
{
str[l++] = '0' + (char)(3 - j);
}
else if(j > 4)
{
str[l++] = '0' + (char)(j - 4);
}
str[l] = 0;
}
static void f2note_bang(t_f2note *x)
{
int i,j;
t_atom at;
char s[4];
i = (x->x_centomidi + 50)/100;
j = x->x_centomidi - 100*i;
outlet_float(x->x_outlet_cent, (t_float)j);
f2note_make_note(s, i);
SETSYMBOL(&at, gensym(s));
outlet_anything(x->x_outlet_note, x->x_set, 1, &at);
outlet_float(x->x_outlet_midi, 0.01f*(t_float)(x->x_centomidi));
}
static void f2note_float(t_f2note *x, t_floatarg freq)
{
x->x_centomidi = (int)(100.0f*f2note_ftom(x, freq) + 0.5f);
f2note_bang(x);
}
void f2note_ref(t_f2note *x, t_floatarg ref)
{
x->x_refhz = ref;
f2note_calc_ref(x);
}
static void *f2note_new(t_floatarg ref)
{
t_f2note *x = (t_f2note *)pd_new(f2note_class);
if(ref == 0.0f)
ref=440.0f;
x->x_refhz = ref;
x->x_centomidi = (int)(100.0f*ref + 0.499f);
f2note_calc_ref(x);
x->x_outlet_midi = outlet_new(&x->x_obj, &s_float);
x->x_outlet_note = outlet_new(&x->x_obj, &s_list);
x->x_outlet_cent = outlet_new(&x->x_obj, &s_float);
x->x_set = gensym("set");
return (x);
}
static void f2note_free(t_f2note *x)
{
}
void f2note_setup(void)
{
f2note_class = class_new(gensym("f2note"), (t_newmethod)f2note_new, (t_method)f2note_free,
sizeof(t_f2note), 0, A_DEFFLOAT, 0);
class_addbang(f2note_class,f2note_bang);
class_addfloat(f2note_class,f2note_float);
class_addmethod(f2note_class, (t_method)f2note_ref, gensym("ref"), A_FLOAT, 0);
// class_sethelpsymbol(f2note_class, gensym("iemhelp/help-f2note"));
}
- Previous message: [PD-cvs] externals/iemlib/iemlib1 FIR~-help.pd, NONE, 1.1 db2v-help.pd, NONE, 1.1 f2note-help.pd, NONE, 1.1 for++-help.pd, NONE, 1.1 gate-help.pd, NONE, 1.1 hml_shelf~-help.pd, NONE, 1.1 lp1.wav, NONE, 1.1 lp1_t~-help.pd, NONE, 1.1 lp2.wav, NONE, 1.1 lp3.wav, NONE, 1.1 para_bp2~-help.pd, NONE, 1.1 peakenv~-help.pd, NONE, 1.1 prvu~-help.pd, NONE, 1.1 pvu~-help.pd, NONE, 1.1 rvu~-help.pd, NONE, 1.1 sin_phase~-help.pd, NONE, 1.1 soundfile_info-help.pd, NONE, 1.1 split-help.pd, NONE, 1.1 v2db-help.pd, NONE, 1.1
- Next message: [PD-cvs] externals/iemlib/iemlib2/src LFO_noise~.c, NONE, 1.1 add2_comma.c, NONE, 1.1 bpe.c, NONE, 1.1 dollarg.c, NONE, 1.1 exp_inc.c, NONE, 1.1
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Pd-cvs
mailing list