Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
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;
}