Frank Barknecht hat gesagen:
Do you really need link in librt, libjack and libasound?
No, I just copied some of the makefile stuff from the pd/src directory
OK, so the -c option lets me build my external, but now I cant load it. im sure I didnt code something right, but I dont know what to do with this error message
/home/wade/pd/general/fft-bin~.pd_linux: /home/wade/pd/general/fft-bin~.pd_linux: ELF file's phentsize not the expected size
Below here lies my external code: fft-bin~.c-------------------------------------- #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_sample dummy; int x_bin; float x_f; } t_fftbin;
void *fftbin_tilde_new(t_floatarg f) { t_symbol *p_signal = gensym("signal"); t_symbol *p_float = gensym("float");
t_fftbin *ref = (t_fftbin *)pd_new(fftbin_tilde_class); ref->x_bin=f; ref->x_f=0; inlet_new(&ref->x_obj, &ref->x_obj.ob_pd, p_signal, p_signal); //signal/bang inlet inlet_new(&ref->x_obj, &ref->x_obj.ob_pd, p_float, p_float); //bin inlet outlet_new(&ref->x_obj, p_float); //bin value outlet return (void *)ref; }
t_int *fftbin_tilde_perform(t_int *w) { t_fftbin *ref = (t_fftbin *)(w[1]); //data structure t_sample *in1 = (t_sample *)(w[2]); //fft~ output int in2 = (int)(w[3]); //bin number t_sample *out = (t_float *)(w[4]); //outlet int n = (int)(w[5]); //number of samples in block
int bin = in2; //get bin number if (bin<0) bin = 0; //clip bin to between 0 and n-1 if (bin>=n) bin = n-1; ref->x_bin = bin; //set datstructure ref->x_f = (t_float)*in1+ref->x_bin; //again, set datastructure *out = ref->x_f; //output float value of bin
return (w+6); }
void fftbin_tilde_dsp(t_fftbin *ref, t_signal **sp) { dsp_add(fftbin_tilde_perform, 5, ref, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n); //trying to send datastructure, block of samples (inlet 1), and float (inlet 2) //to perform's t_int *w }
void fftbin_tilde_set(t_fftbin *x, t_floatarg f) { x->x_f = f; }
void fftbin_tilde_bang(t_fftbin *x) { outlet_float(x->x_obj.ob_outlet, x->x_f); }
void fftbin_tilde_setup(void) { fftbin_tilde_class = class_new(gensym("fft-bin~"), (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("fft-bin~: written by thewade with help from the PD list"); }