예제 #1
0
파일: ex_pluck.c 프로젝트: aure/Soundpipe
int main() {
    srand(1234567);
    UserData ud;
    sp_data *sp;
    sp_create(&sp);

    sp_pluck_create(&ud.pluck);
    sp_osc_create(&ud.osc);
    sp_metro_create(&ud.met);
    sp_ftbl_create(sp, &ud.ft, 2048);

    sp_pluck_init(sp, ud.pluck, 110);
    sp_gen_sine(sp, ud.ft);
    sp_metro_init(sp, ud.met, 2);
    sp_osc_init(sp, ud.osc, ud.ft, 0);

    ud.osc->freq = 1;
    ud.osc->amp = 1;

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

    sp_pluck_destroy(&ud.pluck);
    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);
    sp_metro_destroy(&ud.met);

    sp_destroy(&sp);
    return 0;
}
예제 #2
0
int main() {
    UserData ud;
    sp_data *sp;
    sp_create(&sp);
    sp_srand(sp, 1234567);

    sp_metro_create(&ud.met);
    sp_trand_create(&ud.trand);
    sp_osc_create(&ud.osc);
    sp_ftbl_create(sp, &ud.ft, 2048);

    sp_metro_init(sp, ud.met);
    ud.met->freq = 20;
    sp_trand_init(sp, ud.trand);
    ud.trand->min = 40;
    ud.trand->max = 1000;

    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_trand_destroy(&ud.trand);
    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);
    sp_metro_destroy(&ud.met);

    sp_destroy(&sp);
    return 0;
}
예제 #3
0
int main() {
    srand(time(NULL));
    udata ud;
    SPFLOAT *freqp = &ud.freq;
    ud.freq = 400;
    sp_data *sp;
    sp_create(&sp);

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

    sp_tenv_init(sp, ud.tenv);
    ud.tenv->atk = 0.03;
    ud.tenv->hold = 0.01;
    ud.tenv->rel = 0.1;
    sp_metro_init(sp, ud.met);
    ud.met->freq = 3;
    sp_tevent_init(sp, ud.te, freq_reinit, freq_compute, freqp);
    sp_gen_sine(sp, ud.ft);
    sp_osc_init(sp, ud.osc, ud.ft, 0);
    ud.osc->freq = *freqp;
    sp->len = 44100 * 5;
    sp_process(sp, &ud, write_osc);

    sp_tenv_destroy(&ud.tenv);
    sp_metro_destroy(&ud.met);
    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);
    sp_tevent_destroy(&ud.te);
    sp_destroy(&sp);
    return 0;
}
예제 #4
0
int t_pluck(sp_test *tst, sp_data *sp, const char *hash) 
{
    uint32_t n;
    int fail = 0;

    UserData ud;
    sp_srand(sp, 1337); 
    SPFLOAT pluck = 0, met = 0;
    SPFLOAT notes[] = {60, 63, 67, 70, 74};

    sp_pluck_create(&ud.pluck);
    sp_metro_create(&ud.met);

    sp_pluck_init(sp, ud.pluck, 400);
    sp_metro_init(sp, ud.met);
    ud.met->freq = 4;

    for(n = 0; n < tst->size; n++) {
        pluck = 0, met = 0;
        sp_metro_compute(sp, ud.met, NULL, &met);
        if(met) {
            ud.pluck->freq = sp_midi2cps(notes[sp_rand(sp) % 5]);
        }
        sp_pluck_compute(sp, ud.pluck, &met, &pluck);
        sp_test_add_sample(tst, pluck);
    }
    
    fail = sp_test_verify(tst, hash);

    sp_pluck_destroy(&ud.pluck);
    sp_metro_destroy(&ud.met);

    if(fail) return SP_NOT_OK;
    else return SP_OK;
}
예제 #5
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;
}
예제 #6
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;
}
예제 #7
0
int sporth_metro(sporth_stack *stack, void *ud)
{
    plumber_data *pd = ud;

    SPFLOAT freq;
    SPFLOAT out;
    sp_metro *data;
    switch(pd->mode) {
    case PLUMBER_CREATE:
        sp_metro_create(&data);
        plumber_add_ugen(pd, SPORTH_METRO, data);
        if(sporth_check_args(stack, "f") != SPORTH_OK) {
            fprintf(stderr,"Not enough arguments for metro\n");
            stack->error++;
            return PLUMBER_NOTOK;
        }
        freq = sporth_stack_pop_float(stack);
        sporth_stack_push_float(stack, 0);
        break;
    case PLUMBER_INIT:
        data = pd->last->ud;
        sp_metro_init(pd->sp, data);
        sporth_stack_push_float(stack, 0);
        break;
    case PLUMBER_COMPUTE:
        freq = sporth_stack_pop_float(stack);
        data = pd->last->ud;
        data->freq = freq;
        sp_metro_compute(pd->sp, data, NULL, &out);
        sporth_stack_push_float(stack, out);
        break;
    case PLUMBER_DESTROY:
        data = pd->last->ud;
        sp_metro_destroy(&data);
        break;
    default:
        fprintf(stderr,"Error: Unknown mode!");
        break;
    }
    return PLUMBER_OK;
}
예제 #8
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;
}
예제 #9
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;
}
예제 #10
0
int main() {
    srand(time(NULL));
    sp_data *sp;
    user_data ud;
    sp_create(&sp);

    SPFLOAT tempo = 144;
    ud.tempo = tempo;

    /* Create */
    sp_count_create(&ud.cnt);
    sp_metro_create(&ud.clk);
    sp_metro_create(&ud.dblclk);
    samp_create(sp, &ud.snare, 5574, "snare.wav", "2 0.75 0.25", tempo, 1);
    samp_create(sp, &ud.kick, 7385, "kick.wav", "0.75 1.25 1 1", tempo, 0);
    samp_create(sp, &ud.hh, 4507, "hh.wav",
                "0.5 0.25 0.5 0.5 0.25 0.5 0.25 0.5 0.5 0.25",
                tempo, 0);
    sp_revsc_create(&ud.rev);
    sp_maygate_create(&ud.rthrow);
    sp_maygate_create(&ud.rgate);
    sp_rpt_create(&ud.rpt);
    sp_ftbl_create(sp, &ud.reps, 1);
    sp_tseq_create(&ud.rpick);
    sp_gen_vals(sp, ud.reps, "4 8 16 6");
    sp_tseq_init(sp, ud.rpick, ud.reps);
    ud.rpick->shuf = 1.0;
    sp_reverse_create(&ud.rvs);
    sp_maygate_create(&ud.rvs_switch);

    /* Init */
    sp->len = 44100 * (60.0 / tempo) * 32;
    sp_count_init(sp, ud.cnt);
    ud.cnt->count = 4;
    sp_metro_init(sp, ud.clk);
    ud.clk->freq = tempo / 60.0;
    sp_metro_init(sp, ud.dblclk);
    ud.dblclk->freq = tempo * 2 / 60.0;
    sp_revsc_init(sp, ud.rev);
    ud.rev->feedback = 0.9;
    ud.rev->lpfreq = 10000;
    sp_maygate_init(sp, ud.rthrow);
    ud.rthrow->prob = 0.5;
    sp_rpt_init(sp, ud.rpt, 1.0);
    //sp_rpt_set(ud.rpt, tempo, 8, 4);
    ud.rpt->bpm = tempo;
    ud.rpt->div = 8;
    ud.rpt->reps = 4;
    sp_maygate_init(sp, ud.rgate);
    ud.rgate->prob = 0.18;
    ud.rgate->mode = 1.0;
    sp_reverse_init(sp, ud.rvs, 60.0 / tempo);
    sp_maygate_init(sp, ud.rvs_switch);
    ud.rvs_switch->prob = 0.1;

    /* Process */
    sp_process(sp, &ud, process);

    /* Destroy */
    samp_destroy(&ud.snare);
    samp_destroy(&ud.kick);
    samp_destroy(&ud.hh);
    sp_revsc_destroy(&ud.rev);
    sp_maygate_destroy(&ud.rthrow);
    sp_maygate_destroy(&ud.rgate);
    sp_maygate_destroy(&ud.rvs_switch);
    sp_count_destroy(&ud.cnt);
    sp_metro_destroy(&ud.clk);
    sp_metro_destroy(&ud.dblclk);
    sp_rpt_destroy(&ud.rpt);
    sp_ftbl_destroy(&ud.reps);
    sp_tseq_destroy(&ud.rpick);
    sp_reverse_destroy(&ud.rvs);

    sp_destroy(&sp);
    return 0;
}
예제 #11
0
int main()
{
    srand(time(NULL));
    int i;
    UserData ud;
    ud.pdel = 0;
    sp_data *sp;
    sp_create(&sp);
    sp->len = 44100 * 40;
    char *notes[] = {
        "62 69 78",
        "55 62 69 71",
        "43 50"
    };


    for(i = 0; i < NUMLINE; i++) {
        sp_randi_create(&ud.line[i].randi);
        chord_cloud_create(&ud.line[i].cc);
        chord_cloud_init(sp, ud.line[i].cc, notes[i], 0.1);
        sp_randi_init(sp, ud.line[i].randi, rand());
        ud.line[i].randi->cps = 0.1 + randf(1.5);
    }
    sp_revsc_create(&ud.rev);
    sp_revsc_init(sp, ud.rev);
    ud.rev->feedback = 0.95;
    sp_metro_create(&ud.clk);
    sp_metro_init(sp, ud.clk);
    ud.clk->freq = 86.0 / 60.0;
    sp_count_create(&ud.meter);
    sp_count_init(sp, ud.meter);
    ud.meter->count = 5;
    sp_drip_create(&ud.drip);
    sp_drip_init(sp, ud.drip, 0.01);
    sp_vdelay_create(&ud.del);
    /* give some headroom for the delay */
    sp_vdelay_init(sp, ud.del, 0.4);
    ud.del->del = 0.3;

    sp_tenv_create(&ud.master);
    sp_tenv_init(sp, ud.master);
    ud.master->atk = 0;
    ud.master->hold = 30;
    ud.master->rel =  10;


    sp_progress_create(&ud.prog);
    sp_progress_init(sp, ud.prog);

    modal_create(&ud.mod);
    modal_init(sp, ud.mod);
    sp_ftbl_create(sp, &ud.notes, 1);
    sp_gen_vals(sp, ud.notes, "62 64 59 57");
    sp_tseq_create(&ud.seq);
    sp_tseq_init(sp, ud.seq, ud.notes);
    sp_maygate_create(&ud.mg);
    sp_maygate_init(sp, ud.mg);
    ud.mg->prob = 0.3;
    ud.mg->mode = 1;
    sp_process(sp, &ud, process);

    for(i = 0; i < NUMLINE; i++) {
        sp_randi_destroy(&ud.line[i].randi);
        chord_cloud_destroy(&ud.line[i].cc);
    }


    sp_drip_destroy(&ud.drip);
    sp_revsc_destroy(&ud.rev);
    sp_metro_destroy(&ud.clk);
    sp_count_destroy(&ud.meter);
    sp_vdelay_destroy(&ud.del);
    sp_tenv_destroy(&ud.master);
    modal_destroy(&ud.mod);
    sp_ftbl_destroy(&ud.notes);
    sp_tseq_destroy(&ud.seq);
    sp_maygate_destroy(&ud.mg);
    sp_progress_destroy(&ud.prog);

    sp_destroy(&sp);
    return 0;
}