| 
#include "ext.h"
#include "z_dsp.h"
typedef struct {
   t_pxobject msp_data;
   float      lastinput, lastinput2;
   float      lastoutput, lastoutput2;
   float      a0, a1, a2, b1, b2;
} MyObject;
void* object_data;
void   main            (void);
void*  create_object   (void);
void   MessageDSP      (MyObject* mo, t_signal** signal, short* count);
void   MessageClear    (MyObject* mo);
void   InputA0         (MyObject* mo, float value);
void   InputA1         (MyObject* mo, float value);
void   InputA2         (MyObject* mo, float value);
void   InputB1         (MyObject* mo, float value);
void   InputB2         (MyObject* mo, float value);
t_int* Perform         (t_int *parameters);
void main(void) {
   setup((t_messlist**)&object_data, (method)create_object, (method)dsp_free,
         (short)sizeof(MyObject), NULL, A_NOTHING);
   addftx((method)InputB2, 1); addftx((method)InputB1, 2);
   addftx((method)InputA2, 3); addftx((method)InputA1, 4);
   addftx((method)InputA0, 5);
   addmess((method)MessageDSP,   "dsp",   A_CANT, A_NOTHING);
   addmess((method)MessageClear, "clear", A_NOTHING);
   dsp_initclass();
}
void* create_object(void) {
   MyObject *mo = (MyObject*)newobject(object_data);
   dsp_setup((t_pxobject*)mo, 1);
   outlet_new((t_pxobject*)mo, "signal");
   floatin(mo, 1); floatin(mo, 2); floatin(mo, 3); floatin(mo, 4); floatin(mo, 5);
   mo->a0 = 0.0; mo->a1 = 0.0; mo->a2 = 0.0; mo->b1 = 0.0; mo->b2 = 0.0;
   MessageClear(mo);
   return mo;
}
void InputA0 (MyObject* mo, float value) { mo->a0 = value; }
void InputA1 (MyObject* mo, float value) { mo->a1 = value; }
void InputA2 (MyObject* mo, float value) { mo->a2 = value; }
void InputB1 (MyObject* mo, float value) { mo->b1 = value; }
void InputB2 (MyObject* mo, float value) { mo->b2 = value; }
void MessageDSP(MyObject* mo, t_signal** signal, short* count) {
   #pragma unused(count)
   dsp_add(Perform, 5, 5, mo, signal[0]->s_vec, signal[1]->s_vec, signal[0]->s_n);
}
void MessageClear(MyObject *mo) {
   mo->lastinput = mo->lastinput2 = mo->lastoutput = mo->lastoutput2 = 0.0;
}
t_int* Perform(t_int *parameters) {
   long      pcount = (long)     (parameters[1]);
   MyObject *mo     = (MyObject*)(parameters[2]);
   t_float  *input  = (t_float*) (parameters[3]);
   t_float  *output = (t_float*) (parameters[4]);
   long      count  = (long)     (parameters[5]);
   long      i;
   for (i=0; i<count; i++) {
      output[i] = mo->a0 * input[i] + mo->a1 * mo->lastinput +
                  mo->a2 * mo->lastinput2 - mo->b1 * mo->lastoutput -
                  mo->b2 * mo->lastoutput2;
      mo->lastinput2  = mo->lastinput;
      mo->lastoutput2 = mo->lastoutput;
      mo->lastinput   = input[i];
      mo->lastoutput  = output[i];
   }
   return parameters+pcount+1;
}
 |