3 * a puredata wrapper for aubio tss detection functions
5 * Thanks to Johannes M Zmolnig for writing the excellent HOWTO:
6 * http://iem.kug.ac.at/pd/externals-HOWTO/
11 #define AUBIO_UNSTABLE 1
12 #include <aubio/aubio.h>
14 char aubiotss_version[] = "aubiotss~ version " PACKAGE_VERSION;
16 static t_class *aubiotss_tilde_class;
18 void aubiotss_tilde_setup (void);
20 typedef struct _aubiotss_tilde
24 t_int pos; /*frames%dspblocksize*/
28 t_outlet *outlet_trans;
29 t_outlet *outlet_stead;
42 static t_int *aubiotss_tilde_perform(t_int *w)
44 t_aubiotss_tilde *x = (t_aubiotss_tilde *)(w[1]);
45 t_sample *in = (t_sample *)(w[2]);
46 t_sample *outtrans = (t_sample *)(w[3]);
47 t_sample *outstead = (t_sample *)(w[4]);
51 /* write input to datanew */
52 fvec_set_sample(x->vec, in[j], x->pos);
54 if (x->pos == x->hopsize-1) {
56 /* test for silence */
57 //if (!aubio_silence_detection(x->vec, x->threshold2))
58 aubio_pvoc_do (x->pv, x->vec, x->fftgrain);
59 aubio_tss_set_threshold ( x->tss, x->thres);
60 aubio_tss_do (x->tss, x->fftgrain, x->ctrans, x->cstead);
61 aubio_pvoc_rdo (x->pvt, x->ctrans, x->trans);
62 aubio_pvoc_rdo (x->pvs, x->cstead, x->stead);
64 /* end of block loop */
65 x->pos = -1; /* so it will be zero next j loop */
68 *outtrans++ = x->trans->data[x->pos];
69 *outstead++ = x->stead->data[x->pos];
74 static void aubiotss_tilde_dsp(t_aubiotss_tilde *x, t_signal **sp)
76 dsp_add(aubiotss_tilde_perform, 5, x,
77 sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
80 static void aubiotss_tilde_debug(t_aubiotss_tilde *x)
82 post(aubiotss_version);
83 post("aubiotss~ bufsize:\t%d", x->bufsize);
84 post("aubiotss~ hopsize:\t%d", x->hopsize);
85 post("aubiotss~ threshold:\t%f", x->thres);
86 post("aubiotss~ audio in:\t%f", x->vec->data[0]);
87 post("aubiotss~ audio out:\t%f", x->stead->data[0]);
90 static void *aubiotss_tilde_new (t_floatarg f)
91 //, t_floatarg bufsize)
94 (t_aubiotss_tilde *)pd_new(aubiotss_tilde_class);
96 x->thres = (f < 1e-5) ? 0.01 : (f > 1.) ? 1. : f;
97 x->bufsize = 1024; //(bufsize < 64) ? 1024: (bufsize > 16385) ? 16385: bufsize;
98 x->hopsize = x->bufsize / 4;
100 x->vec = (fvec_t *)new_fvec(x->hopsize);
102 x->fftgrain = (cvec_t *)new_cvec(x->bufsize);
103 x->ctrans = (cvec_t *)new_cvec(x->bufsize);
104 x->cstead = (cvec_t *)new_cvec(x->bufsize);
106 x->trans = (fvec_t *)new_fvec(x->hopsize);
107 x->stead = (fvec_t *)new_fvec(x->hopsize);
109 x->pv = (aubio_pvoc_t *)new_aubio_pvoc(x->bufsize, x->hopsize);
110 x->pvt = (aubio_pvoc_t *)new_aubio_pvoc(x->bufsize, x->hopsize);
111 x->pvs = (aubio_pvoc_t *)new_aubio_pvoc(x->bufsize, x->hopsize);
113 x->tss = (aubio_tss_t *)new_aubio_tss(x->bufsize, x->hopsize);
115 x->inlet = floatinlet_new (&x->x_obj, &x->thres);
116 x->outlet_trans = outlet_new(&x->x_obj, gensym("signal"));
117 x->outlet_stead = outlet_new(&x->x_obj, gensym("signal"));
122 aubiotss_tilde_del (t_aubiotss_tilde *x)
124 inlet_free(x->inlet);
125 outlet_free(x->outlet_trans);
126 outlet_free(x->outlet_stead);
127 del_aubio_pvoc(x->pv);
128 del_aubio_pvoc(x->pvt);
129 del_aubio_pvoc(x->pvs);
130 del_aubio_tss(x->tss);
133 void aubiotss_tilde_setup (void)
135 aubiotss_tilde_class = class_new (gensym ("aubiotss~"),
136 (t_newmethod)aubiotss_tilde_new,
137 (t_method)aubiotss_tilde_del,
138 sizeof (t_aubiotss_tilde),
139 CLASS_DEFAULT, A_DEFFLOAT, 0);
140 class_addmethod(aubiotss_tilde_class,
141 (t_method)aubiotss_tilde_dsp,
143 class_addmethod(aubiotss_tilde_class,
144 (t_method)aubiotss_tilde_debug,
146 CLASS_MAINSIGNALIN(aubiotss_tilde_class,
147 t_aubiotss_tilde, thres);