int main(){ sp_data *sp; UserData ud; sp_create(&sp); int tempo = 120; sp_rpt_create(&ud.rpt); sp_maygate_create(&ud.mg); sp_osc_create(&ud.osc); sp_ftbl_create(sp, &ud.ft, 4096); sp_metro_create(&ud.mt); sp_tenv_create(&ud.te); sp_maygate_init(sp, ud.mg); ud.mg->prob = 0.5; sp_gen_sine(sp, ud.ft); sp_osc_init(sp, ud.osc, ud.ft, 0); sp_metro_init(sp, ud.mt); ud.mt->freq = tempo / 60.0; sp_rpt_init(sp, ud.rpt, 1.0); ud.rpt->bpm = tempo; ud.rpt->div = 8; ud.rpt->rep = 4; sp_tenv_init(sp, ud.te); ud.te->atk = 0.001; ud.te->hold = 0.1; ud.te->rel = 0.1; sp_process(sp, &ud, compute); sp_tenv_destroy(&ud.te); sp_metro_destroy(&ud.mt); sp_ftbl_destroy(&ud.ft); sp_osc_destroy(&ud.osc); sp_rpt_destroy(&ud.rpt); sp_destroy(&sp); return 0; }
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; }
int main() { srand(time(NULL)); sp_data *sp; user_data ud; sp_create(&sp); SPFLOAT tempo = 144; ud.tempo = tempo; /* Create */ sp_count_create(&ud.cnt); sp_metro_create(&ud.clk); sp_metro_create(&ud.dblclk); samp_create(sp, &ud.snare, 5574, "snare.wav", "2 0.75 0.25", tempo, 1); samp_create(sp, &ud.kick, 7385, "kick.wav", "0.75 1.25 1 1", tempo, 0); samp_create(sp, &ud.hh, 4507, "hh.wav", "0.5 0.25 0.5 0.5 0.25 0.5 0.25 0.5 0.5 0.25", tempo, 0); sp_revsc_create(&ud.rev); sp_maygate_create(&ud.rthrow); sp_maygate_create(&ud.rgate); sp_rpt_create(&ud.rpt); sp_ftbl_create(sp, &ud.reps, 1); sp_tseq_create(&ud.rpick); sp_gen_vals(sp, ud.reps, "4 8 16 6"); sp_tseq_init(sp, ud.rpick, ud.reps); ud.rpick->shuf = 1.0; sp_reverse_create(&ud.rvs); sp_maygate_create(&ud.rvs_switch); /* Init */ sp->len = 44100 * (60.0 / tempo) * 32; sp_count_init(sp, ud.cnt); ud.cnt->count = 4; sp_metro_init(sp, ud.clk); ud.clk->freq = tempo / 60.0; sp_metro_init(sp, ud.dblclk); ud.dblclk->freq = tempo * 2 / 60.0; sp_revsc_init(sp, ud.rev); ud.rev->feedback = 0.9; ud.rev->lpfreq = 10000; sp_maygate_init(sp, ud.rthrow); ud.rthrow->prob = 0.5; sp_rpt_init(sp, ud.rpt, 1.0); //sp_rpt_set(ud.rpt, tempo, 8, 4); ud.rpt->bpm = tempo; ud.rpt->div = 8; ud.rpt->reps = 4; sp_maygate_init(sp, ud.rgate); ud.rgate->prob = 0.18; ud.rgate->mode = 1.0; sp_reverse_init(sp, ud.rvs, 60.0 / tempo); sp_maygate_init(sp, ud.rvs_switch); ud.rvs_switch->prob = 0.1; /* Process */ sp_process(sp, &ud, process); /* Destroy */ samp_destroy(&ud.snare); samp_destroy(&ud.kick); samp_destroy(&ud.hh); sp_revsc_destroy(&ud.rev); sp_maygate_destroy(&ud.rthrow); sp_maygate_destroy(&ud.rgate); sp_maygate_destroy(&ud.rvs_switch); sp_count_destroy(&ud.cnt); sp_metro_destroy(&ud.clk); sp_metro_destroy(&ud.dblclk); sp_rpt_destroy(&ud.rpt); sp_ftbl_destroy(&ud.reps); sp_tseq_destroy(&ud.rpick); sp_reverse_destroy(&ud.rvs); sp_destroy(&sp); return 0; }