void process(sp_data *sp, void *udata) { user_data *ud = udata; SPFLOAT dry; SPFLOAT kick, snare, hh, clk, dblclk, bar, dtrig, count; SPFLOAT revin, revout, rthrow, rgate, rpt, rvs, rvs_switch, foo; SPFLOAT reps; sp_metro_compute(sp, ud->clk, NULL, &clk); sp_metro_compute(sp, ud->dblclk, NULL, &dblclk); sp_count_compute(sp, ud->cnt, &clk, &count); bar = (count == 0 && clk); sp_dtrig_compute(sp, ud->snare.dt, &bar, &dtrig); sp_tevent_compute(sp, ud->snare.te, &dtrig, &snare); sp_maygate_compute(sp, ud->rthrow, &dtrig, &rthrow); revin = snare * rthrow; sp_revsc_compute(sp, ud->rev, &revin, &revin, &revout, &foo); sp_dtrig_compute(sp, ud->kick.dt, &bar, &dtrig); sp_tevent_compute(sp, ud->kick.te, &dtrig, &kick); sp_dtrig_compute(sp, ud->hh.dt, &bar, &dtrig); sp_tevent_compute(sp, ud->hh.te, &dtrig, &hh); dry = snare + kick + hh * 0.5 + revout * 0.1; sp_maygate_compute(sp, ud->rgate, &dblclk, &rgate); sp_tseq_compute(sp, ud->rpick, &dblclk, &reps); sp_rpt_compute(sp, ud->rpt, &rgate, &dry, &rpt); sp_reverse_compute(sp, ud->rvs, &rpt, &rvs); sp_maygate_compute(sp, ud->rvs_switch, &clk, &rvs_switch); sp->out[0] = (rvs_switch) ? rvs : rpt; }
void compute(sp_data *sp, void *udata){ UserData *ud = udata; SPFLOAT met, osc, env, rpt, maygate, trig, dry; sp_metro_compute(sp, ud->mt, NULL, &met); sp_tenv_compute(sp, ud->te, &met, &env); sp_osc_compute(sp, ud->osc, NULL, &osc); dry = osc * env; sp_maygate_compute(sp, ud->mg, &met, &maygate); trig = met * maygate; sp_rpt_compute(sp, ud->rpt, &trig, &dry, &rpt); sp->out[0] = rpt; }
int sporth_rpt(sporth_stack *stack, void *ud) { plumber_data *pd = ud; SPFLOAT trig; SPFLOAT input; SPFLOAT out; SPFLOAT maxdur; SPFLOAT bpm; int div; int rep; sp_rpt *rpt; switch(pd->mode) { case PLUMBER_CREATE: #ifdef DEBUG_MODE fprintf(stderr, "rpt: Creating\n"); #endif sp_rpt_create(&rpt); plumber_add_ugen(pd, SPORTH_RPT, rpt); if(sporth_check_args(stack, "ffffff") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for rpt\n"); stack->error++; return PLUMBER_NOTOK; } maxdur = sporth_stack_pop_float(stack); rep = (int)sporth_stack_pop_float(stack); div = (int)sporth_stack_pop_float(stack); bpm = sporth_stack_pop_float(stack); trig = sporth_stack_pop_float(stack); input = sporth_stack_pop_float(stack); sporth_stack_push_float(stack, 0); break; case PLUMBER_INIT: #ifdef DEBUG_MODE fprintf(stderr, "rpt: Initialising\n"); #endif maxdur = sporth_stack_pop_float(stack); rep = (int)sporth_stack_pop_float(stack); div = (int)sporth_stack_pop_float(stack); bpm = sporth_stack_pop_float(stack); trig = sporth_stack_pop_float(stack); input = sporth_stack_pop_float(stack); rpt = pd->last->ud; sp_rpt_init(pd->sp, rpt, maxdur); sporth_stack_push_float(stack, 0); break; case PLUMBER_COMPUTE: maxdur = sporth_stack_pop_float(stack); rep = (int)sporth_stack_pop_float(stack); div = (int)sporth_stack_pop_float(stack); bpm = sporth_stack_pop_float(stack); trig = sporth_stack_pop_float(stack); input = sporth_stack_pop_float(stack); rpt = pd->last->ud; rpt->bpm = bpm; rpt->div = div; rpt->rep = rep; sp_rpt_compute(pd->sp, rpt, &trig, &input, &out); sporth_stack_push_float(stack, out); break; case PLUMBER_DESTROY: rpt = pd->last->ud; sp_rpt_destroy(&rpt); break; default: fprintf(stderr, "rpt: Unknown mode!\n"); break; } return PLUMBER_OK; }