예제 #1
0
int main() {
    srand(time(NULL));
    udata ud;
    SPFLOAT *freqp = &ud.freq;
    ud.counter = 0;
    ud.freq = 400;
    sp_data *sp;
    sp_create(&sp);
    sp_tevent_create(&ud.te);
    sp_ftbl_create(sp, &ud.ft, 2048);
    sp_osc_create(&ud.osc);

    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);
    ud.osc->freq = *freqp;
    sp->len = 44100 * 5;
    sp_process(sp, &ud, write_osc);

    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);
    sp_tevent_destroy(&ud.te);
    sp_destroy(&sp);
    return 0;
}
예제 #2
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;
}
예제 #3
0
int sp_tenv_init(sp_data *sp, sp_tenv *p, SPFLOAT atk, SPFLOAT hold, SPFLOAT rel)
{
    p->pos = 0;
    p->last = 0;
    p->atk = atk;
    p->rel = rel;
    p->hold = hold;
    p->rel = rel;

    p->sr = sp->sr;
    p->atk_end = p->sr * atk;
    p->rel_start = p->sr * (atk + hold);
    p->atk_slp = 1.0 / p->atk_end;
    p->rel_slp = -1.0 / (p->sr * p->rel);
    p->totaldur = p->sr * (atk + hold + rel);
    sp_tevent_init(sp, p->te, sp_tenv_reinit, sp_tenv_comp, p);
    return SP_OK;
}
예제 #4
0
int chord_cloud_init(sp_data *sp, chord_cloud *cc, char *notes, SPFLOAT amp)
{
    int i;
    sp_osc *tmposc;
    sp_dust *tmpdust;
    sp_tenv *tmpenv;
    sp_tevent *tmpretrig;

    sp_ftbl_create(sp, &cc->sine, 4096);
    sp_gen_sinesum(sp, cc->sine, "1 0.5 0.3 0.25, 0.1625");
    sp_ftbl_create(sp, &cc->notes, 1);
    sp_gen_vals(sp, cc->notes, notes);
    cc->ampmax= amp;

    cc->grains= malloc(cc->notes->size * sizeof(chord_grain));

    for(i = 0; i < cc->notes->size; i++) {
        chord_grain *grain = &cc->grains[i];
        sp_osc_create(&grain->osc);
        sp_tenv_create(&grain->env);
        sp_dust_create(&grain->dust);
        sp_tevent_create(&grain->retrig);

        tmposc = grain->osc;
        tmpenv = grain->env;
        tmpdust = grain->dust;
        tmpretrig = grain->retrig;

        sp_dust_init(sp, tmpdust, 1, 8);
        sp_osc_init(sp, tmposc, cc->sine, 0);
        tmposc->freq = sp_midi2cps(cc->notes->tbl[i]);
        tmposc->amp = 1.0;
        grain->amp = 1.0;
        sp_tenv_init(sp, tmpenv);
        tmpenv->atk = 0.01;
        tmpenv->hold = 0;
        tmpenv->rel =  0.03;

        sp_tevent_init(sp, tmpretrig, cloud_reinit, cloud_compute, grain);
    }

    return SP_OK;
}
예제 #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;
}