void *nead_new(t_floatarg attack, t_floatarg decay) { t_nead *x = (t_nead *)pd_new(nead_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("attack")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("decay")); outlet_new(&x->x_obj, gensym("signal")); x->x_ctl.c_state = 0; x->x_ctl.c_target = 0; x->x_sr = sys_getsr(); x->x_ctl.c_attack.nsamp = ms2samps(attack, x->x_sr); f2axfade(1-(log(1.0/3.0)/log(ENVELOPE_RANGE)), &(x->x_ctl.c_attack), 0); /* 1/3 by default */ x->x_ctl.c_decay.nsamp = ms2samps(decay, x->x_sr); f2rxfade(0.0, &(x->x_ctl.c_decay), 0); return (void *)x; }
static void nead_any(t_nead *x, t_symbol *s, int argc, t_atom *argv) { if(!strcmp(s->s_name, "curves")) { switch(argc) { default:; case 2: if(argv[1].a_type == A_FLOAT) { f2rxfade(atom_getfloat(argv + 1), &(x->x_ctl.c_decay), 1); } case 1: if(argv[0].a_type == A_FLOAT) { f2axfade(atom_getfloat(argv), &(x->x_ctl.c_attack), 1); } case 0:; } } else { t_int samps; switch(argc) { default:; case 2: if(argv[1].a_type == A_FLOAT) { samps = ms2samps(atom_getfloat(argv + 1), x->x_sr); if(samps != x->x_ctl.c_decay.nsamp){ x->x_ctl.c_decay.nsamp = samps; ms2rxfade(&(x->x_ctl.c_decay)); } } case 1: if(argv[0].a_type == A_FLOAT) { samps = ms2samps(atom_getfloat(argv), x->x_sr); if(samps != x->x_ctl.c_attack.nsamp) { x->x_ctl.c_attack.nsamp = samps; ms2axfade(&(x->x_ctl.c_attack)); } } case 0:; } } }
static void nead_decay(t_nead *x, t_symbol *s, int argc, t_atom *argv) { t_int samps; int abool; if(argc > 0) { samps = ms2samps(atom_getfloat(argv), x->x_sr); abool = samps == x->x_ctl.c_decay.nsamp; if(argc > 1) { x->x_ctl.c_decay.nsamp = samps; f2rxfade(atom_getfloat(argv + 1), &(x->x_ctl.c_decay), abool); } else if(!abool) { x->x_ctl.c_decay.nsamp = samps; ms2rxfade(&(x->x_ctl.c_decay)); } } }
static void near_attack(t_near *x, t_symbol *s, int argc, t_atom *argv) { t_int samps; int abool; if(argc > 0) { samps = ms2samps(atom_getfloat(argv), x->x_sr); abool = samps == x->x_ctl.c_attack.nsamp; if(argc > 1) { x->x_ctl.c_attack.nsamp = samps; f2axfade(atom_getfloat(argv + 1), &(x->x_ctl.c_attack), abool); } else if(!abool) { x->x_ctl.c_attack.nsamp = samps; ms2axfade(&(x->x_ctl.c_attack)); } } }