Beispiel #1
0
int sporth_gen_line(sporth_stack *stack, void *ud)
{
    plumber_data *pd = ud;

    int size;
    sp_ftbl *ft;
    char *str;
    char *args;

    switch(pd->mode){
        case PLUMBER_CREATE:
#ifdef DEBUG_MODE
            fprintf(stderr, "gen_line: create mode\n");
#endif
            plumber_add_ugen(pd, SPORTH_GEN_LINE, NULL);
            if(sporth_check_args(stack, "sfs") != SPORTH_OK) {
                fprintf(stderr, "Init: not enough arguments for gen_line\n");
                return PLUMBER_NOTOK;
            }
            args = sporth_stack_pop_string(stack);
            size = (int)sporth_stack_pop_float(stack);
            str = sporth_stack_pop_string(stack);
#ifdef DEBUG_MODE
            fprintf(stderr, "Creating line table %s of size %d\n", str, size);
#endif
            sp_ftbl_create(pd->sp, &ft, size);
            if(sp_gen_line(pd->sp, ft, args) == SP_NOT_OK) {
                fprintf(stderr, "There was an issue creating the line ftable \"%s\".\n", str);
                stack->error++;
                return PLUMBER_NOTOK;
            }
            plumber_ftmap_add(pd, str, ft);
            break;

        case PLUMBER_INIT:

            args = 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;
}
Beispiel #2
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
}
Beispiel #3
0
int sp_gen_line(sp_data *sp, sp_ftbl *ft, const char *argstring)
{
    uint16_t i, n = 0, seglen;
    SPFLOAT incr, amp = 0;
    SPFLOAT x1, x2, y1, y2;
    sp_ftbl *args;
    sp_ftbl_create(sp, &args, 1);
    sp_gen_vals(sp, args, argstring);

    if((args->size % 2) == 1 || args->size == 1) {
        fprintf(stderr, "Error: not enough arguments for gen_line.\n");
        sp_ftbl_destroy(&args);
        return SP_NOT_OK;
    } else if(args->size == 2) {
        for(i = 0; i < ft->size; i++) {
            ft->tbl[i] = args->tbl[1];
        }
        return SP_OK;
    }

    x1 = args->tbl[0];
    y1 = args->tbl[1];
    for(i = 2; i < args->size; i += 2) {
        x2 = args->tbl[i];
        y2 = args->tbl[i + 1];

        if(x2 < x1) {
            fprintf(stderr, "Error: x coordiates must be sequential!\n");
            break;
        }

        seglen = (x2 - x1);
        incr = (SPFLOAT)(y2 - y1) / (seglen - 1);
        amp = y1;

        while(seglen != 0){
            if(n < ft->size) {
                ft->tbl[n] = amp;
                amp += incr;
                seglen--;
                n++;
            } else {
                break;
            }
        }
        y1 = y2;
        x1 = x2;
    }

    sp_ftbl_destroy(&args);
    return SP_OK;
}
Beispiel #4
0
int sporth_gen_composite(sporth_stack *stack, void *ud)
{
    plumber_data *pd = ud;

    uint32_t size;
    sp_ftbl *ft;
    char *str, *args;

    switch(pd->mode){
        case PLUMBER_CREATE:
            plumber_add_ugen(pd, SPORTH_GEN_COMPOSITE, NULL);

            if(sporth_check_args(stack, "sfs") != SPORTH_OK) {
               fprintf(stderr,"composite: not enough arguments for gen_vals\n");
                return PLUMBER_NOTOK;
            }

            args = sporth_stack_pop_string(stack);
            size = (uint32_t)sporth_stack_pop_float(stack);
            str = sporth_stack_pop_string(stack);

            sp_ftbl_create(pd->sp, &ft, size);

            sp_gen_composite(pd->sp, ft, args);

            plumber_ftmap_add(pd, str, ft);

            free(args);
            free(str);
            break;

        case PLUMBER_INIT:
            args = sporth_stack_pop_string(stack);
            size = (uint32_t)sporth_stack_pop_float(stack);
            str = sporth_stack_pop_string(stack);
            free(str);
            free(args);
            break;

        case PLUMBER_COMPUTE:
            sporth_stack_pop_float(stack);
            break;

        case PLUMBER_DESTROY:
            break;

        default:
          fprintf(stderr,"Error: Unknown mode!");
           break;
    }
    return PLUMBER_OK;
}
Beispiel #5
0
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;
}
void WavePlayBack(uint32_t AudioFreq)
{ 
    /* note: these mallocs are NOT freed at the moment */
    sp_create(&sp);
    sp->sr = AudioFreq;

    sp_ftbl_create(sp, &ft, 8192);
    sp_gen_sine(sp, ft);

    sp_osc_create(&osc);

    sp_osc_init(sp, osc, ft, 0);
    osc->freq = 0.2f;
    osc->amp = 1.f;
    uint32_t i;

    for(i = 0; i < NOSCS; i++) {
        sp_fosc_create(&fosc[i]);
        sp_fosc_init(sp, fosc[i], ft);
        fosc[i]->freq = sp_midi2cps(scale[i]);
        fosc[i]->amp = 0.1f;
    }

    for(i = 0; i < MY_BUFSIZE; i++) {
        buf0[i] = 0;
        buf1[i] = 0;
    }

    sp_revsc_create(&revsc);
    sp_revsc_init(sp, revsc);

    /* Initialize wave player (Codec, DMA, I2C) */
    WavePlayerInit(AudioFreq);
    nextbuf = 1;

    compute_buffer(buf1, MY_BUFSIZE);
    Audio_MAL_Play((uint32_t)buf0, MY_BUFSIZE / 2);

    EVAL_AUDIO_Mute(AUDIO_MUTE_ON);
    while(1) {
        while(nextbuf == 1);
        if(please_play == 0) {
            EVAL_AUDIO_Mute(AUDIO_MUTE_OFF);
            please_play = 1;
        }
        compute_buffer(buf0, MY_BUFSIZE);
        while(nextbuf == 0);
        compute_buffer(buf1, MY_BUFSIZE);
    };

}
Beispiel #7
0
int t_delay(sp_test *tst, sp_data *sp, const char *hash)
{
    uint32_t n;
    int fail = 0;
    SPFLOAT osc = 0, delay = 0, met = 0, tenv = 0;
    UserData ud;

    sp_delay_create(&ud.delay);
    sp_osc_create(&ud.osc);
    sp_ftbl_create(sp, &ud.ft, 2048);
    sp_metro_create(&ud.met);
    sp_tenv_create(&ud.tenv);

    sp_delay_init(sp, ud.delay, 0.75 * 0.5);
    ud.delay->feedback = 0.5;
    sp_gen_sine(sp, ud.ft);
    sp_osc_init(sp, ud.osc, ud.ft, 0);
    ud.osc->amp = 0.5;
    sp_metro_init(sp, ud.met);
    ud.met->freq = 1;
    sp_tenv_init(sp, ud.tenv);
    ud.tenv->atk = 0.005;
    ud.tenv->hold = 0.1;
    ud.tenv->rel =  0.1;



    for(n = 0; n < tst->size; n++) {
        osc = 0, delay = 0, met = 0, tenv = 0;
        sp_metro_compute(sp, ud.met, NULL, &met);
        sp_tenv_compute(sp, ud.tenv, &met, &tenv);
        if(met) {
            ud.osc->freq = 100 + sp_rand(sp) % 500;
        }
        sp_osc_compute(sp, ud.osc, NULL, &osc);
        osc *= tenv;
        sp_delay_compute(sp, ud.delay, &osc, &delay);

        sp_test_add_sample(tst, osc + delay);
    }

    if(sp_test_compare(tst, hash) == SP_NOT_OK) {
        printf("Generated hash %s does not match reference hash %s\n",
               tst->md5string, hash);
        fail = 1;
    }

    if(fail) return SP_NOT_OK;
    else return SP_OK;
}
Beispiel #8
0
int t_pitchamdf(sp_test *tst, sp_data *sp, const char *hash) 
{
    uint32_t n;
    int fail = 0;
    SPFLOAT freq = 0, amp = 0, blsaw = 0, randh = 0, osc = 0;

    sp_srand(sp, 1234567);
    UserData ud;

    sp_pitchamdf_create(&ud.pitchamdf);
    sp_osc_create(&ud.osc);
    sp_ftbl_create(sp, &ud.ft, 2048);
    sp_blsaw_create(&ud.blsaw);
    sp_randh_create(&ud.randh);

    sp_pitchamdf_init(sp, ud.pitchamdf, 200, 500);
    sp_randh_init(sp, ud.randh);
    ud.randh->max = 500;
    ud.randh->min = 200;
    ud.randh->freq = 6;

    sp_blsaw_init(sp, ud.blsaw);

    sp_gen_sine(sp, ud.ft);
    sp_osc_init(sp, ud.osc, ud.ft, 0);


    for(n = 0; n < tst->size; n++) {
        freq = 0, amp = 0, blsaw = 0, randh = 0, osc = 0;
        sp_randh_compute(sp, ud.randh, NULL, &randh);
        *ud.blsaw->freq = randh;
        sp_blsaw_compute(sp, ud.blsaw, NULL, &blsaw);
        sp_pitchamdf_compute(sp, ud.pitchamdf, &blsaw, &freq, &amp);
        ud.osc->freq = freq;
        sp_osc_compute(sp, ud.osc, NULL, &osc);
        sp_test_add_sample(tst, osc);
    }

    fail = sp_test_verify(tst, hash);

    sp_blsaw_destroy(&ud.blsaw);
    sp_randh_destroy(&ud.randh);
    sp_pitchamdf_destroy(&ud.pitchamdf);
    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);

    if(fail) return SP_NOT_OK;
    else return SP_OK;
}
Beispiel #9
0
int main() {
    srand(time(NULL));
    int i;
    UserData ud;
    sp_data *sp;
    sp_create(&sp);
    sp_ftbl_create(sp, &ud.ft, 4096);
    for(i = 0; i < 3; i++) sp_osc_create(&ud.osc[i]);
    sp_lpf18_create(&ud.lpf);
    sp_osc_create(&ud.lfo);
    sp_ftbl_create(sp, &ud.sine_ft, 4096);
    sp_gen_sine(sp, ud.sine_ft);

    sp_gen_line(sp, ud.ft, "0 1 4096 -1");
    sp_osc_init(sp, ud.osc[0], ud.ft);
    ud.osc[0]->freq = sp_midi2cps(40 - 0.05);
    sp_osc_init(sp, ud.osc[1], ud.ft);
    ud.osc[1]->freq = sp_midi2cps(40 - 12);
    sp_osc_init(sp, ud.osc[2], ud.ft);
    ud.osc[2]->freq = sp_midi2cps(40 + 0.05);
    sp_lpf18_init(sp, ud.lpf);
    sp_osc_init(sp, ud.lfo, ud.sine_ft);
    ud.lfo->freq = 0.4;

    sp->len = 44100 * 5;
    sp_process(sp, &ud, write_osc);

    sp_ftbl_destroy(&ud.ft);
    for(i = 0; i < 3; i++) sp_osc_destroy(&ud.osc[i]);
    sp_lpf18_destroy(&ud.lpf);
    sp_osc_destroy(&ud.lfo);
    sp_ftbl_destroy(&ud.sine_ft);

    sp_destroy(&sp);
    return 0;
}
Beispiel #10
0
int main() 
{
    UserData ud;

    /* allocate and initialize */
    sp_create(&ud.sp);
    plumber_register(&ud.pd);
    plumber_init(&ud.pd);

    /* create an ftable with a size 1, which will be expanded with gen_vals */
    sp_ftbl_create(ud.sp, &ud.seq, 1);
    /* Gen_vals will create a table from a string of numbers */
    sp_gen_vals(ud.sp, ud.seq, "60 63 67 72");
    
    /* Sporth code to be parsed, using a ftable generated in c called 'seq' */
    char *str = 
        "0.1 dmetro "
        "0 'seq' tseq "
        "0.01 port mtof "
        "0.5 1 1 1 fm";

    /* Tell plumber that that we will take care of removing the following ftables */
    /* This is needed for persistant ftables that don't get cleaned for 
     * recompilation */
    plumber_ftmap_delete(&ud.pd, 0);
    /* add ftable to plumber and call it "seq" */
    plumber_ftmap_add(&ud.pd, "seq", ud.seq);
    /* Turn automatic deletion back "on" */
    plumber_ftmap_delete(&ud.pd, 1);

    /* make plumber know about the soundpipe instance */
    ud.pd.sp = ud.sp;

    /* parse string and allocate plumbing */
    plumber_parse_string(&ud.pd, str);

    /* initialize the plumbing */
    plumber_compute(&ud.pd, PLUMBER_INIT);
    /* run */
    sp_process(ud.sp, &ud, process);
    /* Cleanup */
    /* Plumber will handle freeing the memory of the ftable we added */
    /* no need to call sp_ftbl_destroy */
    plumber_clean(&ud.pd);
    sp_ftbl_destroy(&ud.seq);
    sp_destroy(&ud.sp);
    return 0;
}
Beispiel #11
0
int sporth_gen_sine(sporth_stack *stack, void *ud)
{
    plumber_data *pd = ud;

    int size;
    sp_ftbl *ft;
    char *str;

    switch(pd->mode){
        case PLUMBER_CREATE:
            plumber_add_ugen(pd, SPORTH_GEN_SINE, NULL);

            if(sporth_check_args(stack, "sf") != SPORTH_OK) {
                fprintf(stderr, "Init: not enough arguments for gen_sine\n");
                return PLUMBER_NOTOK;
            }
            size = (int)sporth_stack_pop_float(stack);
            str = sporth_stack_pop_string(stack);
#ifdef DEBUG_MODE
            fprintf(stderr, "Creating sine table %s of size %d\n", str, size);
#endif
            sp_ftbl_create(pd->sp, &ft, size);
            sp_gen_sine(pd->sp, ft);
            plumber_ftmap_add(pd, str, ft);
            free(str);
            break;

        case PLUMBER_INIT:
            size = (int)sporth_stack_pop_float(stack);
            str = sporth_stack_pop_string(stack);
            free(str);
            break;

        case PLUMBER_COMPUTE:
            size = (int)sporth_stack_pop_float(stack);
            break;

        case PLUMBER_DESTROY:
            break;

        default:
           printf("Error: Unknown mode!");
           break;
    }
    return PLUMBER_OK;
}
Beispiel #12
0
int main() {
    sp_data *sp;
    sp_create(&sp);
    sp_ftbl *ft;
    sp_ftbl_create(sp, &ft, 4096);
    sp_gen_line(sp, ft, "0 -1 2048 1 4096 -1");
    int i;
    FILE *fp= fopen("plot.dat", "w");
    for(i = 0; i < ft->size; i++) {
        fprintf(fp, "%d %g\n", i, ft->tbl[i]);
    }
    printf("%d plot points written to plot.dat. Run write_plot.sh to see the result.\n", ft->size); 
    fclose(fp);
    sp_ftbl_destroy(&ft);
    sp_destroy(&sp);
    return 0;
}
Beispiel #13
0
int main() {
    srand(time(NULL));
    udata ud;
    sp_data *sp;
    sp_create(&sp);
    sp_ftbl_create(sp, &ud.ft, 2048);
    sp_gbuzz_create(&ud.buzz);

    sp_gen_sine(sp, ud.ft);
    sp_gbuzz_init(sp, ud.buzz, ud.ft);
    sp->len = 44100 * 5;
    sp_process(sp, &ud, process);

    sp_ftbl_destroy(&ud.ft);
    sp_gbuzz_destroy(&ud.buzz);
    sp_destroy(&sp);
    return 0;
}
Beispiel #14
0
int main() {
    srand(time(NULL));
    udata ud;
    sp_data *sp;
    sp_create(&sp);
    sp_ftbl_create(sp, &ud.ft, 4096);
    sp_osc_create(&ud.osc);

    sp_gen_sinesum(sp, ud.ft, "1 0 0 1");
    sp_osc_init(sp, ud.osc, ud.ft);
    ud.osc->freq = 500;
    sp->len = 44100 * 5;
    sp_process(sp, &ud, write_osc);

    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);
    sp_destroy(&sp);
    return 0;
}
Beispiel #15
0
int sporth_zeros(sporth_stack *stack, void *ud)
{
    plumber_data *pd = ud;

    int size;
    sp_ftbl *ft;
    const char *str;

    switch(pd->mode){
        case PLUMBER_CREATE:
            plumber_add_ugen(pd, SPORTH_ZEROS, NULL);
            if(sporth_check_args(stack, "sf") != SPORTH_OK) {
                plumber_print(pd, "Init: not enough arguments for zeros\n");
                return PLUMBER_NOTOK;
            }
            size = (int)sporth_stack_pop_float(stack);
            str = sporth_stack_pop_string(stack);
#ifdef DEBUG_MODE
            plumber_print(pd, "Zeros: creating table %s of size %d\n", str, size);
#endif
            sp_ftbl_create(pd->sp, &ft, size);
            plumber_ftmap_add(pd, str, ft);
            break;

        case PLUMBER_INIT:
            size = (int)sporth_stack_pop_float(stack);
            str = sporth_stack_pop_string(stack);
            break;

        case PLUMBER_COMPUTE:
            size = (int)sporth_stack_pop_float(stack);
            break;

        case PLUMBER_DESTROY:
            break;

        default:
           plumber_print(pd, "Error: Unknown mode!\n");
           break;
    }
    return PLUMBER_OK;
}
Beispiel #16
0
int t_mode(sp_test *tst, sp_data *sp, const char *hash) 
{
    uint32_t n;
    int fail = 0;
    UserData ud;
    SPFLOAT met = 0, mod = 0, nn;

    modal_create(&ud.mod);
    modal_init(sp, ud.mod);

    sp_metro_create(&ud.met);
    sp_metro_init(sp, ud.met);
    ud.met->freq = 3.0;

    sp_ftbl_create(sp, &ud.notes, 1);
    sp_gen_vals(sp, ud.notes, "60 67 62 69 76");

    sp_tseq_create(&ud.seq);
    sp_tseq_init(sp, ud.seq, ud.notes);

    for(n = 0; n < tst->size; n++) {
        met = 0; 
        mod = 0; 
        nn = 0;
        sp_metro_compute(sp, ud.met, NULL, &met);
        sp_tseq_compute(sp, ud.seq, &met, &nn);
        *ud.mod->freq = sp_midi2cps(nn);
        modal_compute(sp, ud.mod, &met, &mod);
        sp->out[0] = mod;
        sp_test_add_sample(tst, sp->out[0]);
    }

    fail = sp_test_verify(tst, hash);
    
    modal_destroy(&ud.mod);
    sp_metro_destroy(&ud.met);
    sp_ftbl_destroy(&ud.notes);
    sp_tseq_destroy(&ud.seq);

    if(fail) return SP_NOT_OK;
    else return SP_OK;
}
Beispiel #17
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;
}
Beispiel #18
0
int t_tseg(sp_test *tst, sp_data *sp, const char *hash) 
{
    uint32_t n;
    int fail = 0;
    sp_srand(sp, 1234567);
    UserData ud;
    SPFLOAT osc = 0, tseg = 0;
    SPFLOAT trig = (sp->pos == 0);

    sp_tseg_create(&ud.tseg);
    sp_osc_create(&ud.osc);
    sp_ftbl_create(sp, &ud.ft, 2048);

    sp_tseg_init(sp, ud.tseg, 0.0001);
    ud.tseg->end = 1.0;
    ud.tseg->type = 3.0;
    ud.tseg->dur = 4.0;

    sp_gen_sine(sp, ud.ft);
    sp_osc_init(sp, ud.osc, ud.ft, 0);

    for(n = 0; n < tst->size; n++) {
        osc = 0; 
        tseg = 0;
        trig = (sp->pos == 0);
        sp_tseg_compute(sp, ud.tseg, &trig, &tseg);
        ud.osc->freq = 100 + (tseg * 1000);
        sp_osc_compute(sp, ud.osc, NULL, &osc);
        sp_test_add_sample(tst, osc);
    }

    fail = sp_test_verify(tst, hash);

    sp_tseg_destroy(&ud.tseg);
    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);

    if(fail) return SP_NOT_OK;
    else return SP_OK;
}
Beispiel #19
0
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;
}
Beispiel #20
0
int sp_gen_rand(sp_data *sp, sp_ftbl *ft, const char *argstring)
{
    sp_ftbl *args;
    sp_ftbl_create(sp, &args, 1);
    sp_gen_vals(sp, args, argstring);
    int n, pos = 0, i, size = 0;

    for(n = 0; n < args->size; n += 2) {
        size = round(ft->size * args->tbl[n + 1]);
        for(i = 0; i < size; i++) {
            if(pos < ft->size) {
                ft->tbl[pos] = args->tbl[n];
                pos++;
            }
        }
    }
    if(pos <= ft->size) {
        ft->size = pos;
    }
    sp_ftbl_destroy(&args);
    return SP_OK;
}
Beispiel #21
0
int t_tenv2(sp_test *tst, sp_data *sp, const char *hash) 
{
    uint32_t n;
    int fail = 0;
    sp_srand(sp, 1234567);
    UserData ud;
    SPFLOAT osc = 0, tenv2 = 0, tick = 0;

    sp_tenv2_create(&ud.tenv2);
    sp_osc_create(&ud.osc);
    sp_ftbl_create(sp, &ud.ft, 2048);

    sp_tenv2_init(sp, ud.tenv2);
    ud.tenv2->atk = 3;
    ud.tenv2->rel = 1;
    sp_gen_sine(sp, ud.ft);
    sp_osc_init(sp, ud.osc, ud.ft, 0);
    ud.osc->amp = 0.6;

    for(n = 0; n < tst->size; n++) {
        osc = 0, tenv2 = 0, tick = 0;

        if(sp->pos == 0 || sp->pos == sp->sr * 1) tick = 1;

        sp_osc_compute(sp, ud.osc, NULL, &osc);
        sp_tenv2_compute(sp, ud.tenv2, &tick, &tenv2);
        sp->out[0] = osc * tenv2;
        sp_test_add_sample(tst, sp->out[0]);
    }

    fail = sp_test_verify(tst, hash);
    
    sp_tenv2_destroy(&ud.tenv2);
    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);

    if(fail) return SP_NOT_OK;
    else return SP_OK;
}
Beispiel #22
0
int main() {
    srand(1234567);
    UserData ud;
    sp_data *sp;
    sp_create(&sp);

    sp_thresh_create(&ud.thresh);
    sp_osc_create(&ud.osc);
    sp_osc_create(&ud.lfo);
    sp_tenv_create(&ud.tenv);
    sp_ftbl_create(sp, &ud.ft, 2048);

    sp_thresh_init(sp, ud.thresh);
    ud.thresh->mode = 1;
    sp_gen_sine(sp, ud.ft);
    sp_osc_init(sp, ud.osc, ud.ft, 0);

    sp_osc_init(sp, ud.lfo, ud.ft, 0);
    ud.lfo->freq = 3;
    ud.lfo->amp = 1;

    sp_tenv_init(sp, ud.tenv);
    ud.tenv->atk = 0.01;
    ud.tenv->hold = 0.01;
    ud.tenv->rel = 0.01;

    sp->len = 44100 * 5;
    sp_process(sp, &ud, process);

    sp_thresh_destroy(&ud.thresh);
    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);
    sp_osc_destroy(&ud.lfo);
    sp_tenv_destroy(&ud.tenv);

    sp_destroy(&sp);
    return 0;
}
Beispiel #23
0
static int sporth_huion(plumber_data *pd, sporth_stack *stack, void **ud)
{
    huion_d *hd;
    char *str;
    switch(pd->mode) {
        case PLUMBER_CREATE:
            fprintf(stderr, "Creating our custom gain plugin!\n");
            if(sporth_check_args(stack, "s") != SPORTH_OK) {
                fprintf(stderr,"Incorrect arguments for huion\n");
                stack->error++;
                return PLUMBER_NOTOK;
            }
            /* malloc and assign address to user data */
            str = sporth_stack_pop_string(stack);
            hd = malloc(sizeof(huion_d));
            *ud = hd;
            sp_ftbl_create(pd->sp, &hd->data, P_MAX);
            plumber_ftmap_add(pd, str, hd->data);
            huion_start(hd);
            break;
        case PLUMBER_INIT:
            str = sporth_stack_pop_string(stack);
            break;

        case PLUMBER_COMPUTE:
            break;

        case PLUMBER_DESTROY:
            hd = *ud;
            huion_stop(hd);
            free(hd);
            break;
        default:
            fprintf(stderr, "Huion: unknown mode %d\n", pd->mode);
            break;
    }
    return PLUMBER_OK;
}
Beispiel #24
0
int main() {
    srand(1234567);
    UserData ud;
    sp_data *sp;
    sp_create(&sp);

    sp_dmetro_create(&ud.dmetro);
    sp_osc_create(&ud.osc);
    sp_osc_create(&ud.lfo);
    sp_ftbl_create(sp, &ud.ft, 2048);
    sp_tenv_create(&ud.tenv);

    sp_dmetro_init(sp, ud.dmetro);
    ud.dmetro->time = 0.05;
    sp_gen_sine(sp, ud.ft);
    sp_osc_init(sp, ud.osc, ud.ft, 0);
    sp_osc_init(sp, ud.lfo, ud.ft, 0);
    ud.lfo->freq = 0.3;
    ud.lfo->amp = 0.5;
    sp_tenv_init(sp, ud.tenv);
    ud.tenv->atk = 0.001;
    ud.tenv->hold = 0.03;
    ud.tenv->rel =  0.001;


    sp->len = 44100 * 5;
    sp_process(sp, &ud, process);

    sp_dmetro_destroy(&ud.dmetro);
    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);
    sp_osc_destroy(&ud.lfo);
    sp_tenv_destroy(&ud.tenv);

    sp_destroy(&sp);
    return 0;
}
Beispiel #25
0
int t_line(sp_test *tst, sp_data *sp, const char *hash) 
{

    sp_srand(sp, 1234567);
    uint32_t n;
    int fail = 0;
    SPFLOAT osc = 0, line = 0;
    UserData ud;

    sp_line_create(&ud.line);
    sp_osc_create(&ud.osc);
    sp_ftbl_create(sp, &ud.ft, 2048);

    sp_line_init(sp, ud.line, 100, 3, 400);
    sp_gen_sine(sp, ud.ft);
    sp_osc_init(sp, ud.osc, ud.ft, 0);

    sp->len = 44100 * 5;

    for(n = 0; n < tst->size; n++) {
        sp_line_compute(sp, ud.line, NULL, &line);
        ud.osc->freq = line;
        sp_osc_compute(sp, ud.osc, NULL, &osc);
        sp->out[0] = osc;

        sp_test_add_sample(tst, sp->out[0]);
    }

    fail = sp_test_verify(tst, hash);

    sp_line_destroy(&ud.line);
    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);
 
    if(fail) return SP_NOT_OK;
    else return SP_OK;
}
Beispiel #26
0
int main() {
    srand(1234567);
    UserData ud;
    sp_data *sp;
    sp_create(&sp);

    sp_delay_create(&ud.delay);
    sp_osc_create(&ud.osc);
    sp_ftbl_create(sp, &ud.ft, 2048);
    sp_metro_create(&ud.met);
    sp_tenv_create(&ud.tenv);

    sp_delay_init(sp, ud.delay, 0.75 * 0.5);
    ud.delay->feedback = 0.5;
    sp_gen_sine(sp, ud.ft);
    sp_osc_init(sp, ud.osc, ud.ft, 0);
    ud.osc->amp = 0.5;
    sp_metro_init(sp, ud.met);
    ud.met->freq = 1;
    sp_tenv_init(sp, ud.tenv);
    ud.tenv->atk = 0.005;
    ud.tenv->hold = 0.1;
    ud.tenv->rel =  0.1;


    sp->len = 44100 * 5;
    sp_process(sp, &ud, process);

    sp_delay_destroy(&ud.delay);
    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);
    sp_metro_destroy(&ud.met);
    sp_tenv_destroy(&ud.tenv);

    sp_destroy(&sp);
    return 0;
}
Beispiel #27
0
/* based off of GEN 19 */
int sp_gen_composite(sp_data *sp, sp_ftbl *ft, const char *argstring)
{
    SPFLOAT phs, inc, amp, dc, tpdlen = 2 * M_PI/ (SPFLOAT) ft->size;
    int i, n;
    
    sp_ftbl *args;
    sp_ftbl_create(sp, &args, 1);
    sp_gen_vals(sp, args, argstring);

    for(n = 0; n < args->size; n += 4) {
        inc = args->tbl[n] * tpdlen;
        amp = args->tbl[n + 1];
        phs = args->tbl[n + 2] * tpd360;
        dc = args->tbl[n + 3];

        for (i = 0; i <ft->size ; i++) {
            ft->tbl[i] += (SPFLOAT) (sin(phs) * amp + dc);
            if ((phs += inc) >= 2 * M_PI) phs -= 2 * M_PI;
        }
    }

    sp_ftbl_destroy(&args);
    return SP_OK;
}
Beispiel #28
0
int main() {
    srand(1234567);
    UserData ud;
    sp_data *sp;
    sp_create(&sp);

    sp_foo_create(&ud.foo);
    sp_osc_create(&ud.osc);
    sp_ftbl_create(sp, &ud.ft, 2048);

    sp_foo_init(sp, ud.foo);
    sp_gen_sine(sp, ud.ft);
    sp_osc_init(sp, ud.osc, ud.ft, 0);

    sp->len = 44100 * 5;
    sp_process(sp, &ud, process);

    sp_foo_destroy(&ud.foo);
    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);

    sp_destroy(&sp);
    return 0;
}
Beispiel #29
0
int sporth_gen_eval(sporth_stack *stack, void *ud)
{
    plumber_data *pd = ud;
    plumber_data my_pd;

    uint32_t size;
    sp_data *sp;
    sp_ftbl *ft;
    char *ftname;
    char *str;
    uint32_t n;

    switch(pd->mode){
        case PLUMBER_CREATE:
            plumber_add_ugen(pd, SPORTH_GEN_EVAL, NULL);

            if(sporth_check_args(stack, "sfs") != SPORTH_OK) {
                plumber_print(pd, "Init: not enough arguments for gen_sine\n");
                return PLUMBER_NOTOK;
            }
            str = sporth_stack_pop_string(stack);
            size = (uint32_t) sporth_stack_pop_float(stack);
            ftname = sporth_stack_pop_string(stack);
            sp_ftbl_create(pd->sp, &ft, size);
            plumber_ftmap_add(pd, ftname, ft);
#ifdef DEBUG_MODE
            plumber_print(pd, "gen_sporth: compiling file %s to table of size %d\n", 
                    filename, size);
#endif
            plumber_register(&my_pd);
            plumber_init(&my_pd);
            sp_create(&sp);
            sp->sr = pd->sp->sr;
            sp_srand(sp, pd->seed);
            my_pd.sp = sp;
            my_pd.sp->len = size;
            if(plumber_parse_string(&my_pd, str) == PLUMBER_OK) {
                plumber_compute(&my_pd, PLUMBER_INIT);
                for(n = 0; n < ft->size; n++) {
                    plumber_compute(&my_pd, PLUMBER_COMPUTE);
                    ft->tbl[n] = sporth_stack_pop_float(&my_pd.sporth.stack);
                }
            }
            plumber_clean(&my_pd);
            sp_destroy(&sp);
            break;

        case PLUMBER_INIT:
            sporth_stack_pop_string(stack);
            sporth_stack_pop_float(stack);
            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;
}
 void setUpTable(float *table, UInt32 size) {
     ftbl_size = size;
     sp_ftbl_create(sp, &ftbl, ftbl_size);
     ftbl->tbl = table;
 }