int sporth_tblrec(sporth_stack *stack, void *ud) { plumber_data *pd = ud; sp_tblrec *td; sp_ftbl *ft; const char *ftname; SPFLOAT trig = 0; SPFLOAT in = 0; SPFLOAT out = 0; switch(pd->mode){ case PLUMBER_CREATE: sp_tblrec_create(&td); plumber_add_ugen(pd, SPORTH_TBLREC, td); if(sporth_check_args(stack, "ffs") != SPORTH_OK) { plumber_print(pd,"Init: not enough arguments for tblrec\n"); return PLUMBER_NOTOK; } ftname = sporth_stack_pop_string(stack); trig = sporth_stack_pop_float(stack); in = sporth_stack_pop_float(stack); td->index = 0; td->record = 0; if(plumber_ftmap_search(pd, ftname, &ft) == PLUMBER_NOTOK) { plumber_print(pd, "tblrec: could not find table '%s'\n", ftname); stack->error++; return PLUMBER_NOTOK; } sp_tblrec_init(pd->sp, td, ft); sporth_stack_push_float(stack, in); break; case PLUMBER_INIT: td = pd->last->ud; ftname = sporth_stack_pop_string(stack); sporth_stack_pop_float(stack); in = sporth_stack_pop_float(stack); td->index = 0; td->record = 0; sporth_stack_push_float(stack, in); break; case PLUMBER_COMPUTE: td = pd->last->ud; trig = sporth_stack_pop_float(stack); in = sporth_stack_pop_float(stack); sp_tblrec_compute(pd->sp, td, &in, &trig, &out); sporth_stack_push_float(stack, out); break; case PLUMBER_DESTROY: td = pd->last->ud; sp_tblrec_destroy(&td); break; default: plumber_print(pd,"Error: Unknown mode!\n"); break; } return PLUMBER_OK; }
int sporth_pareq(sporth_stack *stack, void *ud) { plumber_data *pd = ud; SPFLOAT input; SPFLOAT out; SPFLOAT fc; SPFLOAT v; SPFLOAT q; SPFLOAT mode; sp_pareq *pareq; switch(pd->mode) { case PLUMBER_CREATE: #ifdef DEBUG_MODE fprintf(stderr, "pareq: Creating\n"); #endif sp_pareq_create(&pareq); plumber_add_ugen(pd, SPORTH_PAREQ, pareq); if(sporth_check_args(stack, "fffff") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for pareq\n"); stack->error++; return PLUMBER_NOTOK; } mode = sporth_stack_pop_float(stack); q = sporth_stack_pop_float(stack); v = sporth_stack_pop_float(stack); fc = 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, "pareq: Initialising\n"); #endif mode = sporth_stack_pop_float(stack); q = sporth_stack_pop_float(stack); v = sporth_stack_pop_float(stack); fc = sporth_stack_pop_float(stack); input = sporth_stack_pop_float(stack); pareq = pd->last->ud; sp_pareq_init(pd->sp, pareq); sporth_stack_push_float(stack, 0); break; case PLUMBER_COMPUTE: mode = sporth_stack_pop_float(stack); q = sporth_stack_pop_float(stack); v = sporth_stack_pop_float(stack); fc = sporth_stack_pop_float(stack); input = sporth_stack_pop_float(stack); pareq = pd->last->ud; pareq->fc = fc; pareq->v = v; pareq->q = q; pareq->mode = mode; sp_pareq_compute(pd->sp, pareq, &input, &out); sporth_stack_push_float(stack, out); break; case PLUMBER_DESTROY: pareq = pd->last->ud; sp_pareq_destroy(&pareq); break; default: fprintf(stderr, "pareq: Unknown mode!\n"); break; } return PLUMBER_OK; }
int sporth_mincer(sporth_stack *stack, void *ud) { plumber_data *pd = ud; SPFLOAT out = 0; sp_ftbl * ft = NULL; char *ftname = NULL; SPFLOAT time = 0; SPFLOAT amp = 0; SPFLOAT pitch = 0; sp_mincer *mincer = NULL; switch(pd->mode) { case PLUMBER_CREATE: #ifdef DEBUG_MODE fprintf(stderr, "mincer: Creating\n"); #endif sp_mincer_create(&mincer); plumber_add_ugen(pd, SPORTH_MINCER, mincer); if(sporth_check_args(stack, "fffs") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for mincer\n"); stack->error++; return PLUMBER_NOTOK; } ftname = sporth_stack_pop_string(stack); pitch = sporth_stack_pop_float(stack); amp = sporth_stack_pop_float(stack); time = sporth_stack_pop_float(stack); free(ftname); sporth_stack_push_float(stack, 0); break; case PLUMBER_INIT: #ifdef DEBUG_MODE fprintf(stderr, "mincer: Initialising\n"); #endif ftname = sporth_stack_pop_string(stack); pitch = sporth_stack_pop_float(stack); amp = sporth_stack_pop_float(stack); time = sporth_stack_pop_float(stack); mincer = pd->last->ud; if(plumber_ftmap_search(pd, ftname, &ft) == PLUMBER_NOTOK) { stack->error++; return PLUMBER_NOTOK; } free(ftname); sp_mincer_init(pd->sp, mincer, ft); sporth_stack_push_float(stack, 0); break; case PLUMBER_COMPUTE: pitch = sporth_stack_pop_float(stack); amp = sporth_stack_pop_float(stack); time = sporth_stack_pop_float(stack); mincer = pd->last->ud; mincer->time = time; mincer->amp = amp; mincer->pitch = pitch; sp_mincer_compute(pd->sp, mincer, NULL, &out); sporth_stack_push_float(stack, out); free(ftname); break; case PLUMBER_DESTROY: mincer = pd->last->ud; sp_mincer_destroy(&mincer); break; default: fprintf(stderr, "mincer: Uknown mode!\n"); break; } return PLUMBER_OK; }
int sporth_tenv2(sporth_stack *stack, void *ud) { plumber_data *pd = ud; SPFLOAT trig; SPFLOAT out; SPFLOAT atk; SPFLOAT rel; sp_tenv2 *tenv2; switch(pd->mode) { case PLUMBER_CREATE: #ifdef DEBUG_MODE fprintf(stderr, "tenv2: Creating\n"); #endif sp_tenv2_create(&tenv2); plumber_add_ugen(pd, SPORTH_TENV2, tenv2); if(sporth_check_args(stack, "fff") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for tenv2\n"); stack->error++; return PLUMBER_NOTOK; } rel = sporth_stack_pop_float(stack); atk = sporth_stack_pop_float(stack); trig = sporth_stack_pop_float(stack); sporth_stack_push_float(stack, 0); break; case PLUMBER_INIT: #ifdef DEBUG_MODE fprintf(stderr, "tenv2: Initialising\n"); #endif rel = sporth_stack_pop_float(stack); atk = sporth_stack_pop_float(stack); trig = sporth_stack_pop_float(stack); tenv2 = pd->last->ud; sp_tenv2_init(pd->sp, tenv2); sporth_stack_push_float(stack, 0); break; case PLUMBER_COMPUTE: rel = sporth_stack_pop_float(stack); atk = sporth_stack_pop_float(stack); trig = sporth_stack_pop_float(stack); tenv2 = pd->last->ud; tenv2->atk = atk; tenv2->rel = rel; sp_tenv2_compute(pd->sp, tenv2, &trig, &out); sporth_stack_push_float(stack, out); break; case PLUMBER_DESTROY: tenv2 = pd->last->ud; sp_tenv2_destroy(&tenv2); break; default: fprintf(stderr, "tenv2: Unknown mode!\n"); break; } return PLUMBER_OK; }
int sporth_randh(sporth_stack *stack, void *ud) { plumber_data *pd = ud; SPFLOAT out; SPFLOAT freq; SPFLOAT min; SPFLOAT max; sp_randh *randh; switch(pd->mode) { case PLUMBER_CREATE: #ifdef DEBUG_MODE fprintf(stderr, "randh: Creating\n"); #endif sp_randh_create(&randh); plumber_add_ugen(pd, SPORTH_RANDH, randh); if(sporth_check_args(stack, "fff") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for randh\n"); stack->error++; return PLUMBER_NOTOK; } freq = sporth_stack_pop_float(stack); max = sporth_stack_pop_float(stack); min = sporth_stack_pop_float(stack); sporth_stack_push_float(stack, 0); break; case PLUMBER_INIT: #ifdef DEBUG_MODE fprintf(stderr, "randh: Initialising\n"); #endif freq = sporth_stack_pop_float(stack); max = sporth_stack_pop_float(stack); min = sporth_stack_pop_float(stack); randh = pd->last->ud; sp_randh_init(pd->sp, randh); sporth_stack_push_float(stack, 0); break; case PLUMBER_COMPUTE: freq = sporth_stack_pop_float(stack); max = sporth_stack_pop_float(stack); min = sporth_stack_pop_float(stack); randh = pd->last->ud; randh->freq = freq; randh->min = min; randh->max = max; sp_randh_compute(pd->sp, randh, NULL, &out); sporth_stack_push_float(stack, out); break; case PLUMBER_DESTROY: randh = pd->last->ud; sp_randh_destroy(&randh); break; default: fprintf(stderr, "randh: Unknown mode!\n"); break; } return PLUMBER_OK; }
int sporth_ling(sporth_stack *stack, void *ud) { plumber_data *pd = ud; SPFLOAT tick = 0; sp_ling *ling; ling_func *fl = NULL; char *str; switch(pd->mode) { case PLUMBER_CREATE: #ifdef DEBUG_MODE fprintf(stderr, "ling: Creating\n"); #endif ling = malloc(sizeof(sp_ling)); plumber_add_module(pd, SPORTH_LING, sizeof(sp_ling), ling); break; case PLUMBER_INIT: #ifdef DEBUG_MODE fprintf(stderr, "ling: Initialising\n"); #endif if(sporth_check_args(stack, "fffs") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for ling\n"); stack->error++; return PLUMBER_NOTOK; } ling = pd->last->ud; str = sporth_stack_pop_string(stack); ling->mode = sporth_stack_pop_float(stack); ling->N = (uint32_t) sporth_stack_pop_float(stack); tick = sporth_stack_pop_float(stack); ling_init(&ling->ling); fl = ling_create_flist(&ling->ling); ling_register_func(&ling->ling, fl); ling->val = 0; ling->pos = 0; sporth_stack_push_float(stack, 0); #ifdef DEBUG_MODE printf("ling: the string is %s\n", str); #endif ling_parse_line(&ling->ling, str); free(str); break; case PLUMBER_COMPUTE: ling = pd->last->ud; ling->mode = sporth_stack_pop_float(stack); ling->N = (uint32_t) sporth_stack_pop_float(stack); tick = sporth_stack_pop_float(stack); switch(ling->mode) { case 0: if(tick != 0) { ling_seq_run(&ling->ling); ling->val = ling_stack_pop(&ling->ling.stack); ling->ling.t++; } break; case 1: if(tick != 0 ) { if(ling->N <= 0 || ling->N > 32) ling->N = 1; if(ling->pos == 0) { ling_seq_run(&ling->ling); ling->val = ling_stack_pop(&ling->ling.stack); ling->ling.t++; num_to_bin(ling->val, ling->bin, ling->N); } ling->val = ling->bin[ling->pos]; ling->pos++; ling->pos %= ling->N; } else { //fprintf(stderr, "we are here...\n"); ling->val = 0; } break; default: break; } sporth_stack_push_float(stack, (SPFLOAT)ling->val); break; case PLUMBER_DESTROY: ling = pd->last->ud; ling_destroy(&ling->ling); free(ling); break; default: fprintf(stderr, "ling: Uknown mode!\n"); break; } return PLUMBER_OK; }