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 write_osc(sp_data *data, void *ud) { udata *udp = ud; SPFLOAT trig = 0; if(udp->counter == 0){ trig = 1.0; } sp_tevent_compute(data, udp->te, &trig, &udp->osc->freq); sp_osc_compute(data, udp->osc, NULL, &data->out[0]); udp->counter = (udp->counter + 1) % 4410; }
void write_osc(sp_data *data, void *ud) { udata *udp = ud; SPFLOAT trig = 0; SPFLOAT env = 0; SPFLOAT osc = 0; sp_metro_compute(data, udp->met, NULL, &trig); sp_tevent_compute(data, udp->te, &trig, &udp->osc->freq); sp_osc_compute(data, udp->osc, NULL, &osc); sp_tenv_compute(data, udp->tenv, &trig, &env); data->out[0] = osc * env; }
int chord_cloud_compute(sp_data *sp, chord_cloud *cc, SPFLOAT *in, SPFLOAT *out) { int i; SPFLOAT dust = 0, osc = 0, env = 0, tmp = 0, dummy; for(i = 0; i < cc->notes->size; i++) { chord_grain *grain = &cc->grains[i]; sp_dust_compute(sp, grain->dust, NULL, &dust); sp_tenv_compute(sp, grain->env, &dust, &env); sp_osc_compute(sp, grain->osc, NULL, &osc); sp_tevent_compute(sp, grain->retrig, &dust, &dummy); tmp += osc * env * cc->ampmax * grain->amp; } *out = tmp; return SP_OK; }
int sp_tenv_compute(sp_data *sp, sp_tenv *p, SPFLOAT *in, SPFLOAT *out) { sp_tevent_compute(sp, p->te, in, out); return SP_OK; }