int main() { udata ud; sp_data *sp; sp_create(&sp); sp_vdelay_create(&ud.del); sp_ftbl_create(sp, &ud.ft, 2048); sp_osc_create(&ud.osc); sp_ftbl_create(sp, &ud.sine, 4096); sp_osc_create(&ud.lfo); sp_vdelay_init(sp, ud.del, 0.5); sp_gen_file(sp, ud.ft, "Formant04.wav"); sp_osc_init(sp, ud.osc, ud.ft, 0); ud.osc->freq = sp_midi2cps(50); sp_gen_sine(sp, ud.sine); sp_osc_init(sp, ud.lfo, ud.sine, 0); ud.lfo->freq = 0.2; sp->len = 44100 * 5; sp_process(sp, &ud, process); sp_vdelay_destroy(&ud.del); sp_ftbl_destroy(&ud.ft); sp_ftbl_destroy(&ud.sine); sp_osc_destroy(&ud.osc); sp_osc_destroy(&ud.lfo); sp_destroy(&sp); return 0; }
int sporth_gen_file(sporth_stack *stack, void *ud) { #ifndef NO_LIBSNDFILE plumber_data *pd = ud; sp_ftbl *ft; char *str; char *filename; int size; switch(pd->mode){ case PLUMBER_CREATE: plumber_add_ugen(pd, SPORTH_GEN_FILE, NULL); if(sporth_check_args(stack, "sfs") != SPORTH_OK) { fprintf(stderr, "Init: not enough arguments for gen_file\n"); return PLUMBER_NOTOK; } filename = sporth_stack_pop_string(stack); size = (int)sporth_stack_pop_float(stack); str = sporth_stack_pop_string(stack); sp_ftbl_create(pd->sp, &ft, size); if(sp_gen_file(pd->sp, ft, filename) == SP_NOT_OK) { fprintf(stderr, "There was an issue creating the ftable \"%s\".\n", str); stack->error++; return PLUMBER_NOTOK; } plumber_ftmap_add(pd, str, ft); break; case PLUMBER_INIT: filename = sporth_stack_pop_string(stack); size = (int)sporth_stack_pop_float(stack); str = sporth_stack_pop_string(stack); break; case PLUMBER_COMPUTE: sporth_stack_pop_float(stack); break; case PLUMBER_DESTROY: break; default: printf("Error: Unknown mode!"); break; } return PLUMBER_OK; #else return PLUMBER_NOTOK; #endif }
void samp_create(sp_data *sp, samp_data *sd, size_t size, char *file, char *dtrig, SPFLOAT tempo, SPFLOAT delay) { int i; SPFLOAT tscale = 60.0 / tempo; sp_ftbl_create(sp, &sd->delta, 1); sp_gen_vals(sp, sd->delta, dtrig); sp_dtrig_create(&sd->dt); for(i = 0; i < sd->delta->size; i++) { sd->delta->tbl[i] *= tscale; } sp_dtrig_init(sp, sd->dt, sd->delta); sd->dt->delay = delay * tscale; sp_ftbl_create(sp, &sd->ft, 5574); sp_gen_file(sp, sd->ft, file); sp_tevent_create(&sd->te); sp_tevent_init(sp, sd->te, samp_reinit, samp_compute, sd); sd->pos = 0; }