[PD-cvs] externals/iemlib/src/iemlib1 FIR~.c, NONE, 1.1 filter~.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 lp1_t~.c, NONE, 1.1 makefile_linux, 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 vcf_filter~.c, NONE, 1.1 biquad_freq_resp.c, 1.5, 1.6 db2v.c, 1.4, 1.5 f2note.c, 1.4, 1.5 forpp.c, 1.4, 1.5 gate.c, 1.4, 1.5 iemlib1.c, 1.4, 1.5 makefile_win, 1.5, 1.6 soundfile_info.c, 1.4, 1.5 split.c, 1.5, 1.6 v2db.c, 1.4, 1.5

musil tmusil at users.sourceforge.net
Wed Nov 8 14:24:12 CET 2006


Update of /cvsroot/pure-data/externals/iemlib/src/iemlib1
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1233/iemlib/src/iemlib1

Modified Files:
	biquad_freq_resp.c db2v.c f2note.c forpp.c gate.c iemlib1.c 
	makefile_win soundfile_info.c split.c v2db.c 
Added Files:
	FIR~.c filter~.c hml_shelf~.c iem_cot4~.c iem_delay~.c 
	iem_pow4~.c iem_sqrt4~.c lp1_t~.c makefile_linux 
	mov_avrg_kern~.c para_bp2~.c peakenv~.c prvu~.c pvu~.c rvu~.c 
	sin_phase~.c vcf_filter~.c 
Log Message:
changed sig* to *_tilde
#if MSC_VER is obsolete
replaced all float by t_float


--- 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 - 2005 */


#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 \
	iemlib2.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





Index: soundfile_info.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/soundfile_info.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** soundfile_info.c	11 Apr 2006 16:24:09 -0000	1.4
--- soundfile_info.c	8 Nov 2006 13:24:10 -0000	1.5
***************
*** 4,12 ****
  iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
  
- #ifdef _MSC_VER
- #pragma warning( disable : 4244 )
- #pragma warning( disable : 4305 )
- #endif
- 
  #include "m_pd.h"
  #include "iemlib.h"
--- 4,7 ----
***************
*** 163,167 ****
          goto soundfile_info_end;
        }
!       SETFLOAT(x->x_atheader+SFI_HEADER_CHANNELS, (float)ss);
        ch = ss;
        header_size += 2;
--- 158,162 ----
          goto soundfile_info_end;
        }
!       SETFLOAT(x->x_atheader+SFI_HEADER_CHANNELS, (t_float)ss);
        ch = ss;
        header_size += 2;
***************
*** 174,178 ****
          goto soundfile_info_end;
        }
!       SETFLOAT(x->x_atheader+SFI_HEADER_SAMPLERATE, (float)ll);
        sr = ll;
        header_size += 4;
--- 169,173 ----
          goto soundfile_info_end;
        }
!       SETFLOAT(x->x_atheader+SFI_HEADER_SAMPLERATE, (t_float)ll);
        sr = ll;
        header_size += 4;
***************
*** 189,193 ****
          goto soundfile_info_end;
        }
!       SETFLOAT(x->x_atheader+SFI_HEADER_BYTES_PER_SAMPLE, (float)(ss/ch));
        bps = ss;
        header_size += 2;
--- 184,188 ----
          goto soundfile_info_end;
        }
!       SETFLOAT(x->x_atheader+SFI_HEADER_BYTES_PER_SAMPLE, (t_float)(ss/ch));
        bps = ss;
        header_size += 2;
***************
*** 211,219 ****
        cvec += 8;
        
!       SETFLOAT(x->x_atheader+SFI_HEADER_HEADERBYTES, (float)header_size);
        
        filesize -= header_size;
        filesize /= bps;
!       SETFLOAT(x->x_atheader+SFI_HEADER_MULTICHANNEL_FILE_LENGTH, (float)filesize);
        SETSYMBOL(x->x_atheader+SFI_HEADER_ENDINESS, gensym("l"));
        SETSYMBOL(x->x_atheader+SFI_HEADER_FILENAME, gensym(completefilename));
--- 206,214 ----
        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));

--- 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 - 2005 */

#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~"));
}

Index: makefile_win
===================================================================
RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/makefile_win,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** makefile_win	31 Oct 2006 14:17:16 -0000	1.5
--- makefile_win	8 Nov 2006 13:24:09 -0000	1.6
***************
*** 19,43 ****
  		db2v.c \
  		f2note.c \
  		forpp.c \
  		gate.c \
! 		sigfilter.c \
! 		sigFIR.c \
! 		sighml_shelf.c \
! 		sigiem_cot4.c \
! 		sigiem_delay.c \
! 		sigiem_sqrt4.c \
! 		sigiem_pow4.c \
! 		siglp1_t.c \
! 		sigmov_avrg_kern.c \
! 		sigpara_bp2.c \
! 		sigpeakenv.c \
! 		sigprvu.c \
! 		sigpvu.c \
! 		sigrvu.c \
! 		sigsin_phase.c \
! 		sigvcf_filter.c \
  		soundfile_info.c \
  		split.c \
  		v2db.c \
  		iemlib1.c
  
--- 19,43 ----
  		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
  

--- 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 - 2005 */

#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, pow, sum=x->x_sum_rms;
  int i;
  
  if(x->x_started)
  {
    for(i=0; i<n; i++)
    {
      pow = in[i]*in[i];
      if(pow > peak)
        peak = pow;
      sum += pow;
    }
    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~"));
}

Index: db2v.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/db2v.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** db2v.c	11 Apr 2006 16:24:09 -0000	1.4
--- db2v.c	8 Nov 2006 13:24:09 -0000	1.5
***************
*** 4,18 ****
  iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
  
- #ifdef _MSC_VER
- #pragma warning( disable : 4244 )
- #pragma warning( disable : 4305 )
- #endif
- 
  
  #include "m_pd.h"
  #include "iemlib.h"
  #include <math.h>
- #include <stdio.h>
- #include <string.h>
  
  /* -------- db2v - a techn. dB to rms-value converter. --------- */
--- 4,11 ----
***************
*** 20,29 ****
  static t_class *db2v_class;
  
! float db2v(float f)
  {
    return (f <= -199.9 ? 0 : exp(0.11512925465 * f));
  }
  
! static void db2v_float(t_object *x, t_float f)
  {
    outlet_float(x->ob_outlet, db2v(f));
--- 13,22 ----
  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));

--- 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 - 2005 */

#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 - 2005 */

#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~"));
}

Index: forpp.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/forpp.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** forpp.c	11 Apr 2006 16:24:09 -0000	1.4
--- forpp.c	8 Nov 2006 13:24:09 -0000	1.5
***************
*** 4,18 ****
  iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
  
- #ifdef _MSC_VER
- #pragma warning( disable : 4244 )
- #pragma warning( disable : 4305 )
- #endif
- 
  
  #include "m_pd.h"
  #include "iemlib.h"
- #include <math.h>
- #include <stdio.h>
- #include <string.h>
  
  /* ----------------------------- for++ -------------------------------- */
--- 4,10 ----
***************
*** 24,28 ****
    int       x_beg;
    int       x_end;
!   float     x_delay;
    int       x_cur;
    int       x_incr;
--- 16,20 ----
    int       x_beg;
    int       x_end;
!   t_float   x_delay;
    int       x_cur;
    int       x_incr;
***************
*** 109,113 ****
  }
  
! static void forpp_float(t_forpp *x, t_float beg)
  {
    x->x_beg = (int)beg;
--- 101,105 ----
  }
  
! static void forpp_float(t_forpp *x, t_floatarg beg)
  {
    x->x_beg = (int)beg;
***************
*** 118,122 ****
  }
  
! static void forpp_ft1(t_forpp *x, t_float end)
  {
    x->x_end = (int)end;
--- 110,114 ----
  }
  
! static void forpp_ft1(t_forpp *x, t_floatarg end)
  {
    x->x_end = (int)end;
***************
*** 127,131 ****
  }
  
! static void forpp_ft2(t_forpp *x, t_float delay)
  {
    if(delay < 0.0)
--- 119,123 ----
  }
  
! static void forpp_ft2(t_forpp *x, t_floatarg delay)
  {
    if(delay < 0.0)

--- 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 - 2005 */


#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: 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 - 2005 */


#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~"));
}

Index: gate.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/gate.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** gate.c	11 Apr 2006 16:24:09 -0000	1.4
--- gate.c	8 Nov 2006 13:24:09 -0000	1.5
***************
*** 2,18 ****
  * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
  
! iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2004 */
! 
! #ifdef _MSC_VER
! #pragma warning( disable : 4244 )
! #pragma warning( disable : 4305 )
! #endif
  
  
  #include "m_pd.h"
  #include "iemlib.h"
! #include <math.h>
! #include <stdio.h>
! #include <string.h>
  
  /* --------- gate ---------------------- */
--- 2,11 ----
  * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
  
! iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
  
  
  #include "m_pd.h"
  #include "iemlib.h"
! 
  
  /* --------- gate ---------------------- */
***************
*** 22,26 ****
  {
    t_object  x_obj;
!   float     x_state;
  } t_gate;
  
--- 15,19 ----
  {
    t_object  x_obj;
!   t_float   x_state;
  } t_gate;
  
***************
*** 68,72 ****
    floatinlet_new(&x->x_obj, &x->x_state);
    outlet_new(&x->x_obj, 0);
!   x->x_state = (f==0.0)?0:1;
    return (x);
  }
--- 61,65 ----
    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);
  }

--- 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 - 2005 */

#include "m_pd.h"
#include "iemlib.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_DEFSYM, 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: 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 - 2005 */

#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~"));
}

Index: biquad_freq_resp.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/biquad_freq_resp.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** biquad_freq_resp.c	11 Apr 2006 16:24:09 -0000	1.5
--- biquad_freq_resp.c	8 Nov 2006 13:24:09 -0000	1.6
***************
*** 4,18 ****
  iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
  
- #ifdef _MSC_VER
- #pragma warning( disable : 4244 )
- #pragma warning( disable : 4305 )
- #endif
- 
  
  #include "m_pd.h"
  #include "iemlib.h"
  #include <math.h>
- #include <stdio.h>
- #include <string.h>
  
  /* ------------------------ biquad_freq_resp ------------------- */
--- 4,11 ----
***************
*** 22,30 ****
  {
    t_object  x_obj;
!   float     a0;
!   float     a1;
!   float     a2;
!   float     b1;
!   float     b2;
    t_outlet  *x_out_re;
    t_outlet  *x_out_im;
--- 15,23 ----
  {
    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;
***************
*** 33,40 ****
  static t_class *biquad_freq_resp_class;
  
! static void biquad_freq_resp_float(t_biquad_freq_resp *x, t_float f)
  {
!   float re1, im1, re2, im2;
!   float c, s, a;
    
    if(f < 0.0f)
--- 26,33 ----
  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)

--- 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 - 2005 */


#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 - 2005 */

#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 - 2005 */

#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~"));
}

Index: iemlib1.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/iemlib1.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** iemlib1.c	11 Apr 2006 16:24:09 -0000	1.4
--- iemlib1.c	8 Nov 2006 13:24:09 -0000	1.5
***************
*** 4,12 ****
  iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
  
- #ifdef _MSC_VER
- #pragma warning( disable : 4244 )
- #pragma warning( disable : 4305 )
- #endif
- 
  
  #include "m_pd.h"
--- 4,7 ----
***************
*** 25,49 ****
  void db2v_setup(void);
  void f2note_setup(void);
  void forpp_setup(void);
  void gate_setup(void);
! void sigfilter_setup(void);
! void sigFIR_setup(void);
! void sighml_shelf_setup(void);
! void sigiem_cot4_setup(void);
! void sigiem_delay_setup(void);
! void sigiem_sqrt4_setup(void);
! void sigiem_pow4_setup(void);
! void siglp1_t_setup(void);
! void sigmov_avrg_kern_setup(void);
! void sigpara_bp2_setup(void);
! void sigpeakenv_setup(void);
! void sigprvu_setup(void);
! void sigpvu_setup(void);
! void sigrvu_setup(void);
! void sigsin_phase_setup(void);
! void sigvcf_filter_setup(void);
  void soundfile_info_setup(void);
  void split_setup(void);
  void v2db_setup(void);
  
  /* ------------------------ setup routine ------------------------- */
--- 20,44 ----
  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 ------------------------- */
***************
*** 57,81 ****
    db2v_setup();
    f2note_setup();
    forpp_setup();
    gate_setup();
!   sigfilter_setup();
!   sigFIR_setup();
!   sighml_shelf_setup();
!   sigiem_cot4_setup();
!   sigiem_delay_setup();
!   sigiem_sqrt4_setup();
!   sigiem_pow4_setup();
!   siglp1_t_setup();
!   sigmov_avrg_kern_setup();
!   sigpara_bp2_setup();
!   sigpeakenv_setup();
!   sigprvu_setup();
!   sigpvu_setup();
!   sigrvu_setup();
!   sigsin_phase_setup();
!   sigvcf_filter_setup();
    soundfile_info_setup();
    split_setup();
    v2db_setup();
    
  	post("iemlib1 (R-1.16) library loaded!   (c) Thomas Musil 05.2005");
--- 52,76 ----
    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.16) library loaded!   (c) Thomas Musil 05.2005");

--- 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 - 2005 */


#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~"));
}

Index: split.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/split.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** split.c	11 Apr 2006 16:24:09 -0000	1.5
--- split.c	8 Nov 2006 13:24:10 -0000	1.6
***************
*** 4,18 ****
  iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
  
- #ifdef _MSC_VER
- #pragma warning( disable : 4244 )
- #pragma warning( disable : 4305 )
- #endif
- 
  
  #include "m_pd.h"
  #include "iemlib.h"
! #include <math.h>
! #include <stdio.h>
! #include <string.h>
  
  /* --------- split is like moses ----------- */
--- 4,11 ----
  iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
  
  
  #include "m_pd.h"
  #include "iemlib.h"
! 
  
  /* --------- split is like moses ----------- */

--- 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 - 2005 */


#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 pow, 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 - 2005 */

#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: 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 - 2005 */

#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~"));
}

Index: v2db.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/v2db.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** v2db.c	11 Apr 2006 16:24:09 -0000	1.4
--- v2db.c	8 Nov 2006 13:24:10 -0000	1.5
***************
*** 4,18 ****
  iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
  
- #ifdef _MSC_VER
- #pragma warning( disable : 4244 )
- #pragma warning( disable : 4305 )
- #endif
- 
  
  #include "m_pd.h"
  #include "iemlib.h"
  #include <math.h>
! #include <stdio.h>
! #include <string.h>
  
  /* -------- v2db - a rms-value to techn. dB  converter. --------- */
--- 4,12 ----
  iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
  
  
  #include "m_pd.h"
  #include "iemlib.h"
  #include <math.h>
! 
  
  /* -------- v2db - a rms-value to techn. dB  converter. --------- */
***************
*** 20,24 ****
  static t_class *v2db_class;
  
! float v2db(float f)
  {
    return (f <= 0 ? -199.9 : 8.6858896381*log(f));
--- 14,18 ----
  static t_class *v2db_class;
  
! t_float v2db(t_float f)
  {
    return (f <= 0 ? -199.9 : 8.6858896381*log(f));

Index: f2note.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/f2note.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** f2note.c	11 Apr 2006 16:24:09 -0000	1.4
--- f2note.c	8 Nov 2006 13:24:09 -0000	1.5
***************
*** 4,18 ****
  iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
  
- #ifdef _MSC_VER
- #pragma warning( disable : 4244 )
- #pragma warning( disable : 4305 )
- #endif
- 
  
  #include "m_pd.h"
  #include "iemlib.h"
  #include <math.h>
- #include <stdio.h>
- #include <string.h>
  
  /* ------------------------- f2note ---------------------- */
--- 4,11 ----
***************
*** 26,32 ****
    void     *x_outlet_cent;
    int      x_centomidi;
!   float    x_refhz;
!   float    x_refexp;
!   float    x_reflog;
    t_symbol *x_set;
  } t_f2note;
--- 19,25 ----
    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;
***************
*** 34,43 ****
  static t_class *f2note_class;
  
! float f2note_mtof(t_f2note *x, float midi)
  {
    return(x->x_refexp * exp(0.057762265047 * midi));
  }
  
! float f2note_ftom(t_f2note *x, float freq)
  {
    return (freq > 0 ? 17.31234049 * log(x->x_reflog * freq) : -1500);
--- 27,36 ----
  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);
***************
*** 46,50 ****
  void f2note_calc_ref(t_f2note *x)
  {
!   float ln2=log(2.0);
    
    x->x_refexp = x->x_refhz*exp(-5.75*ln2);
--- 39,43 ----
  void f2note_calc_ref(t_f2note *x)
  {
!   t_float ln2=log(2.0);
    
    x->x_refexp = x->x_refhz*exp(-5.75*ln2);
***************
*** 141,154 ****
    i = (x->x_centomidi + 50)/100;
    j = x->x_centomidi - 100*i;
!   outlet_float(x->x_outlet_cent, (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.01*(float)(x->x_centomidi));
  }
  
  static void f2note_float(t_f2note *x, t_floatarg freq)
  {
!   x->x_centomidi = (int)(100.0*f2note_ftom(x, freq) + 0.5);
    f2note_bang(x);
  }
--- 134,147 ----
    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);
  }
***************
*** 164,171 ****
    t_f2note *x = (t_f2note *)pd_new(f2note_class);
    
!   if(ref == 0.0)
!     ref=440.0;
    x->x_refhz = ref;
!   x->x_centomidi = (int)(100.0*ref + 0.499);
    f2note_calc_ref(x);
    x->x_outlet_midi = outlet_new(&x->x_obj, &s_float);
--- 157,164 ----
    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);





More information about the Pd-cvs mailing list