int main() { udata ud; sp_data *sp; sp_create(&sp); sp_ftbl_create(sp, &ud.ft, 4096); for(int i = 0; i < 8; i++) sp_posc3_create(&ud.posc[i]); for(int i = 0; i < 8; i++) sp_tenv_create(&ud.tenv[i]); sp_revsc_create(&ud.rev); sp_gen_sine(sp, ud.ft); for(int i = 0; i < 8; i++) sp_tenv_init(sp, ud.tenv[i], 0.01, 0.1, 0.1); for(int i = 0; i < 8; i++) sp_posc3_init(sp, ud.posc[i], ud.ft); ud.posc[0]->freq = sp_midi2cps(48); ud.posc[1]->freq = sp_midi2cps(52); ud.posc[2]->freq = sp_midi2cps(59); ud.posc[3]->freq = sp_midi2cps(62); ud.posc[4]->freq = sp_midi2cps(72); ud.posc[5]->freq = sp_midi2cps(71); ud.posc[6]->freq = sp_midi2cps(69); ud.posc[7]->freq = sp_midi2cps(66); sp_revsc_init(sp, ud.rev); sp->len = 44100 * 20; sp_process(sp, &ud, write_music); for(int i = 0; i < 8; i++) sp_posc3_destroy(&ud.posc[i]); for(int i = 0; i < 8; i++) sp_tenv_destroy(&ud.tenv[i]); sp_revsc_destroy(&ud.rev); sp_ftbl_destroy(&ud.ft); sp_destroy(&sp); return 0; }
int main() { srand(time(NULL)); udata ud; ud.counter = 0; sp_data *sp; sp_create(&sp); sp_ftbl_create(sp, &ud.ft, 1024); sp_posc3_create(&ud.posc3); sp_gen_sine(sp, ud.ft); sp_posc3_init(sp, ud.posc3, ud.ft); ud.posc3->freq = 500; sp->len = 44100 * 5; sp_process(sp, &ud, write_posc3); sp_ftbl_destroy(&ud.ft); sp_posc3_destroy(&ud.posc3); sp_destroy(&sp); return 0; }
int sporth_posc3(sporth_stack *stack, void *ud) { plumber_data *pd = ud; SPFLOAT out; sp_ftbl *tbl; const char *str; SPFLOAT freq; SPFLOAT amp; sp_posc3 *posc3; switch(pd->mode) { case PLUMBER_CREATE: #ifdef DEBUG_MODE plumber_print(pd, "posc3: Creating\n"); #endif sp_posc3_create(&posc3); plumber_add_ugen(pd, SPORTH_POSC3, posc3); if(sporth_check_args(stack, "ffs") != SPORTH_OK) { plumber_print(pd,"Not enough arguments for posc3\n"); stack->error++; return PLUMBER_NOTOK; } str = sporth_stack_pop_string(stack); amp = sporth_stack_pop_float(stack); freq = sporth_stack_pop_float(stack); if(plumber_ftmap_search(pd, str, &tbl) == PLUMBER_NOTOK) { stack->error++; return PLUMBER_NOTOK; } sp_posc3_init(pd->sp, posc3, tbl); sporth_stack_push_float(stack, 0); break; case PLUMBER_INIT: #ifdef DEBUG_MODE plumber_print(pd, "posc3: Initialising\n"); #endif str = sporth_stack_pop_string(stack); amp = sporth_stack_pop_float(stack); freq = sporth_stack_pop_float(stack); posc3 = pd->last->ud; sporth_stack_push_float(stack, 0); break; case PLUMBER_COMPUTE: amp = sporth_stack_pop_float(stack); freq = sporth_stack_pop_float(stack); posc3 = pd->last->ud; posc3->freq = freq; posc3->amp = amp; sp_posc3_compute(pd->sp, posc3, NULL, &out); sporth_stack_push_float(stack, out); break; case PLUMBER_DESTROY: posc3 = pd->last->ud; sp_posc3_destroy(&posc3); break; default: plumber_print(pd, "posc3: Unknown mode!\n"); break; } return PLUMBER_OK; }