1
/******************************************************
3
* zexy - implementation file
5
* copyleft (c) IOhannes m zm�lnig
7
* 1999:forum::f�r::uml�ute:2004
9
* institute of electronic music and acoustics (iem)
11
******************************************************
13
* license: GNU General Public License v.2
15
******************************************************/
19
/* ------------------------ blockswap~ ----------------------------- */
21
/* swaps a signalblock around it's center:
22
{x[0], x[1], ... x[n-1]} --> {x[n-1], x[n-2], ... x[0]}
25
static t_class *blockswap_class;
27
typedef struct _blockswap
32
t_sample *blockbuffer;
35
static void blockswap_float(t_blockswap *x, t_floatarg f)
40
static t_int *blockswap_perform(t_int *w)
42
t_blockswap *x = (t_blockswap *)(w[1]);
43
t_sample *in = (t_sample *)(w[2]);
44
t_sample *out = (t_sample *)(w[3]);
49
t_sample *dummy=x->blockbuffer;
50
while(n--)*dummy++=*in++;
52
while(n--)*out++=*in++;
55
while(n--)*out++=*dummy++;
56
} else while (N--) *out++=*in++;
60
static void blockswap_dsp(t_blockswap *x, t_signal **sp)
62
if (x->blocksize*2<sp[0]->s_n){
63
if(x->blockbuffer)freebytes(x->blockbuffer, sizeof(*x->blockbuffer)*x->blocksize);
64
x->blocksize = sp[0]->s_n/2;
65
x->blockbuffer = getbytes(sizeof(*x->blockbuffer)*x->blocksize);
67
dsp_add(blockswap_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
70
static void blockswap_helper(t_blockswap *x)
72
post("\n%c blockswap~-object for blockwise-swapping of a signal ", HEARTSYMBOL);
73
post("'help' : view this\n"
75
post("outlet : signal~");
78
static void blockswap_free(t_blockswap *x)
81
freebytes(x->blockbuffer, sizeof(*x->blockbuffer)*x->blocksize);
86
static void *blockswap_new(void)
88
t_blockswap *x = (t_blockswap *)pd_new(blockswap_class);
89
outlet_new(&x->x_obj, gensym("signal"));
95
void blockswap_tilde_setup(void)
97
blockswap_class = class_new(gensym("blockswap~"), (t_newmethod)blockswap_new, (t_method)blockswap_free,
98
sizeof(t_blockswap), 0, A_NULL);
99
class_addmethod(blockswap_class, nullfn, gensym("signal"), 0);
100
class_addmethod(blockswap_class, (t_method)blockswap_dsp, gensym("dsp"), 0);
102
class_addfloat(blockswap_class, blockswap_float);
104
class_addmethod(blockswap_class, (t_method)blockswap_helper, gensym("help"), 0);
105
zexy_register("blockswap~");