src/aubiopitch~.c: add bufsize and hopsize arguments, clean up
[pd-aubio.git] / src / aubioquiet~.c
1 /**
2  *
3  * a puredata wrapper for aubioquiet
4  *
5  * Thanks to Johannes M Zmolnig for writing the excellent HOWTO:
6  *       http://iem.kug.ac.at/pd/externals-HOWTO/
7  *
8  * */
9
10 #include <m_pd.h>
11 #include <aubio/aubio.h>
12
13 char aubioquiet_version[] = "aubioquiet~ version " PACKAGE_VERSION;
14
15 static t_class *aubioquiet_tilde_class;
16
17 void aubioquiet_tilde_setup (void);
18
19 typedef struct _aubioquiet_tilde
20 {
21   t_object x_obj;
22   t_float silence;
23   t_int pos; /*frames%dspblocksize*/
24   t_int bufsize;
25   t_int hopsize;
26   t_int wassilence;
27   t_int issilence;
28   fvec_t *vec;
29   t_outlet *quietbang;
30   t_outlet *noisybang;
31 } t_aubioquiet_tilde;
32
33 static t_int *aubioquiet_tilde_perform(t_int *w)
34 {
35   t_aubioquiet_tilde *x = (t_aubioquiet_tilde *)(w[1]);
36   t_sample *in          = (t_sample *)(w[2]);
37   int n                 = (int)(w[3]);
38   int j;
39   for (j=0;j<n;j++) {
40     /* write input to datanew */
41     fvec_set_sample(x->vec, in[j], x->pos);
42     /*time for fft*/
43     if (x->pos == x->hopsize-1) {
44       /* block loop */
45       if (aubio_silence_detection(x->vec, x->silence)==1) {
46         if (x->wassilence==1) {
47           x->issilence = 1;
48         } else {
49           x->issilence = 2;
50           outlet_bang(x->quietbang);
51         }
52         x->wassilence=1;
53       } else {
54         if (x->wassilence<=0) {
55           x->issilence = 0;
56         } else {
57           x->issilence = -1;
58           outlet_bang(x->noisybang);
59         }
60         x->wassilence=0;
61       }
62       /* end of block loop */
63       x->pos = -1; /* so it will be zero next j loop */
64     }
65     x->pos++;
66   }
67   return (w+4);
68 }
69
70 static void aubioquiet_tilde_dsp(t_aubioquiet_tilde *x, t_signal **sp)
71 {
72   dsp_add(aubioquiet_tilde_perform, 3, x, sp[0]->s_vec, sp[0]->s_n);
73 }
74
75 static void aubioquiet_tilde_debug(t_aubioquiet_tilde *x)
76 {
77   post(aubioquiet_version);
78   post("aubioquiet~ bufsize:\t%d", x->bufsize);
79   post("aubioquiet~ hopsize:\t%d", x->hopsize);
80   post("aubioquiet~ silence:\t%f", x->silence);
81 }
82
83 static void *aubioquiet_tilde_new (t_floatarg f)
84 {
85   t_aubioquiet_tilde *x = (t_aubioquiet_tilde *)pd_new(aubioquiet_tilde_class);
86
87   x->silence = (f < -1000.) ? -70 : (f >= 0.) ? -70. : f;
88   x->bufsize   = 1024;
89   x->hopsize   = x->bufsize / 2;
90
91   x->vec = (fvec_t *)new_fvec(x->hopsize);
92   x->wassilence = 1;
93
94   floatinlet_new (&x->x_obj, &x->silence);
95   x->quietbang = outlet_new (&x->x_obj, &s_bang);
96   x->noisybang = outlet_new (&x->x_obj, &s_bang);
97   return (void *)x;
98 }
99
100 void aubioquiet_tilde_setup (void)
101 {
102   aubioquiet_tilde_class = class_new (gensym ("aubioquiet~"),
103       (t_newmethod)aubioquiet_tilde_new,
104       0, sizeof (t_aubioquiet_tilde),
105       CLASS_DEFAULT, A_DEFFLOAT, 0);
106   class_addmethod(aubioquiet_tilde_class,
107       (t_method)aubioquiet_tilde_dsp,
108       gensym("dsp"), 0);
109   class_addmethod(aubioquiet_tilde_class,
110       (t_method)aubioquiet_tilde_debug,
111       gensym("debug"), 0);
112   CLASS_MAINSIGNALIN(aubioquiet_tilde_class,
113       t_aubioquiet_tilde, silence);
114 }