Beispiel #1
0
void process(sp_data *sp, void *udata) {
    user_data *ud = udata;
    SPFLOAT dry;
    SPFLOAT kick, snare, hh, clk, dblclk, bar, dtrig, count;
    SPFLOAT revin, revout, rthrow, rgate, rpt, rvs, rvs_switch, foo;
    SPFLOAT reps;
    sp_metro_compute(sp, ud->clk, NULL, &clk);
    sp_metro_compute(sp, ud->dblclk, NULL, &dblclk);
    sp_count_compute(sp, ud->cnt, &clk, &count);
    bar = (count == 0 && clk);
    sp_dtrig_compute(sp, ud->snare.dt, &bar, &dtrig);
    sp_tevent_compute(sp, ud->snare.te, &dtrig, &snare);

    sp_maygate_compute(sp, ud->rthrow, &dtrig, &rthrow);
    revin = snare * rthrow;
    sp_revsc_compute(sp, ud->rev, &revin, &revin, &revout, &foo);

    sp_dtrig_compute(sp, ud->kick.dt, &bar, &dtrig);
    sp_tevent_compute(sp, ud->kick.te, &dtrig, &kick);
    sp_dtrig_compute(sp, ud->hh.dt, &bar, &dtrig);
    sp_tevent_compute(sp, ud->hh.te, &dtrig, &hh);

    dry = snare + kick + hh * 0.5 + revout * 0.1;
    sp_maygate_compute(sp, ud->rgate, &dblclk, &rgate);
    sp_tseq_compute(sp, ud->rpick, &dblclk, &reps);

    sp_rpt_compute(sp, ud->rpt, &rgate, &dry, &rpt);
    sp_reverse_compute(sp, ud->rvs, &rpt, &rvs);
    sp_maygate_compute(sp, ud->rvs_switch, &clk, &rvs_switch);

    sp->out[0] = (rvs_switch) ? rvs : rpt;
}
Beispiel #2
0
void compute(sp_data *sp, void *udata){
    UserData *ud = udata;
    SPFLOAT met, osc, env, rpt, maygate, trig, dry;
    sp_metro_compute(sp, ud->mt, NULL, &met);
    sp_tenv_compute(sp, ud->te, &met, &env);
    sp_osc_compute(sp, ud->osc, NULL, &osc);
    dry = osc * env;
    sp_maygate_compute(sp, ud->mg, &met, &maygate);
    trig = met * maygate;
    sp_rpt_compute(sp, ud->rpt, &trig, &dry, &rpt);
    sp->out[0] = rpt;
}
Beispiel #3
0
int sporth_rpt(sporth_stack *stack, void *ud)
{
    plumber_data *pd = ud;
    SPFLOAT trig;
    SPFLOAT input;
    SPFLOAT out;
    SPFLOAT maxdur;
    SPFLOAT bpm;
    int div;
    int rep;
    sp_rpt *rpt;

    switch(pd->mode) {
        case PLUMBER_CREATE:

#ifdef DEBUG_MODE
            fprintf(stderr, "rpt: Creating\n");
#endif

            sp_rpt_create(&rpt);
            plumber_add_ugen(pd, SPORTH_RPT, rpt);
            if(sporth_check_args(stack, "ffffff") != SPORTH_OK) {
                fprintf(stderr,"Not enough arguments for rpt\n");
                stack->error++;
                return PLUMBER_NOTOK;
            }
            maxdur = sporth_stack_pop_float(stack);
            rep = (int)sporth_stack_pop_float(stack);
            div = (int)sporth_stack_pop_float(stack);
            bpm = sporth_stack_pop_float(stack);
            trig = 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, "rpt: Initialising\n");
#endif

            maxdur = sporth_stack_pop_float(stack);
            rep = (int)sporth_stack_pop_float(stack);
            div = (int)sporth_stack_pop_float(stack);
            bpm = sporth_stack_pop_float(stack);
            trig = sporth_stack_pop_float(stack);
            input = sporth_stack_pop_float(stack);
            rpt = pd->last->ud;
            sp_rpt_init(pd->sp, rpt, maxdur);
            sporth_stack_push_float(stack, 0);
            break;
        case PLUMBER_COMPUTE:
            maxdur = sporth_stack_pop_float(stack);
            rep = (int)sporth_stack_pop_float(stack);
            div = (int)sporth_stack_pop_float(stack);
            bpm = sporth_stack_pop_float(stack);
            trig = sporth_stack_pop_float(stack);
            input = sporth_stack_pop_float(stack);
            rpt = pd->last->ud;
            rpt->bpm = bpm;
            rpt->div = div;
            rpt->rep = rep;
            sp_rpt_compute(pd->sp, rpt, &trig, &input, &out);
            sporth_stack_push_float(stack, out);
            break;
        case PLUMBER_DESTROY:
            rpt = pd->last->ud;
            sp_rpt_destroy(&rpt);
            break;
        default:
            fprintf(stderr, "rpt: Unknown mode!\n");
            break;
    }
    return PLUMBER_OK;
}