[PD-dev] Help with own external

thewade pdman at aproximation.org
Thu Apr 8 19:47:54 CEST 2004


Hello list!

I may have gotten it working. THanks for telling me about how dsp only gets called once. I also cleaned up the code a bit as far as casting goes. In the end it came down to getting the nth element if *in by using square brackets instead of using pointer arithmatic.

This code should return the Nth element of a sample, though Im still verifying it.

Thanks for all the help!
-thewade

/*begin fftbin~.c code here-------------------*/
#include <m_pd.h>

/*-------------------------------------------------------*/
/*fftbin~                                                */
/* A tool to extract specific bins from the output of    */
/* fft~. Inlets are (from left to right):                */
/* The output of fft~ and bang, the bin number to        */
/* capture.                                              */
/* The outlet is a control rate float equal to the value */
/* of the bin in question.                               */
/*-------------------------------------------------------*/

static t_class *fftbin_tilde_class;

typedef struct _fftbin {
  t_object  x_obj;
  t_float x_bin;
  t_float x_binval;
  float x_f;
} t_fftbin;

void *fftbin_tilde_new(t_floatarg f)
{
  t_fftbin *ref = (t_fftbin *)pd_new(fftbin_tilde_class);
  ref->x_bin = f;
  ref->x_binval=0;
  ref->x_f = 0;
  outlet_new(&ref->x_obj, &s_float);             //bin value outlet
  floatinlet_new(&ref->x_obj, &ref->x_bin);
  return (void *)ref;
}

t_int *fftbin_tilde_perform(t_int *w)
{
  t_fftbin *ref   = (t_fftbin *)(w[1]);
  t_sample *in1   = (t_float *)(w[2]);            //fft~ output
  int      n      = (int)(w[3]);

  int bin = (int)ref->x_bin;
  if (bin > n) bin = n;
  if (bin < 0) bin = 0;

  ref->x_binval = in1[bin];

  return (w+4);
}

void fftbin_tilde_dsp(t_fftbin *ref, t_signal **sp)
{
  dsp_add(fftbin_tilde_perform, 3, ref, sp[0]->s_vec, sp[0]->s_n);
}

void fftbin_tilde_set(t_fftbin *ref, t_floatarg f)
{
  ref->x_bin = f;
}

void fftbin_tilde_bang(t_fftbin *ref)
{
  outlet_float(ref->x_obj.ob_outlet, ref->x_binval);
}

void fftbin_tilde_setup(void) {
  fftbin_tilde_class = class_new(gensym(\"fftbin~\"),
        (t_newmethod)fftbin_tilde_new,
        0, sizeof(t_fftbin),
        CLASS_DEFAULT,
        A_DEFFLOAT, 0);

  class_addmethod(fftbin_tilde_class, 
        (t_method)fftbin_tilde_dsp, gensym(\"dsp\"), 0);
  class_addmethod(fftbin_tilde_class, 
        (t_method)fftbin_tilde_set, gensym(\"set\"), A_DEFFLOAT, 0);
  class_addbang(fftbin_tilde_class, fftbin_tilde_bang);
  
  CLASS_MAINSIGNALIN(fftbin_tilde_class, t_fftbin, x_f);
  post(\"fftbin~: written by thewade with help from the PD list\");
}




More information about the Pd-dev mailing list