[PD] copying tabwrite~ from d_array.c as an external, not working.

Matt Davey hard.off at gmail.com
Mon Sep 3 19:55:03 CEST 2018


sure.  it is literally just tabwrite~, but with the name changed to
tabwrite2~:


#include "m_pd.h"


static t_class *tabwrite2_tilde_class;


typedef struct _tabwrite2_tilde

{

    t_object x_obj;

    int x_phase;

    int x_nsampsintab;

    t_word *x_vec;

    t_symbol *x_arrayname;

    t_float x_f;

} t_tabwrite2_tilde;


static void tabwrite2_tilde_tick(t_tabwrite2_tilde *x);


static void *tabwrite2_tilde_new(t_symbol *s)

{

    t_tabwrite2_tilde *x = (t_tabwrite2_tilde *)pd_new(tabwrite2_tilde_class
);

    x->x_phase = 0x7fffffff;

    x->x_arrayname = s;

    x->x_f = 0;

    return (x);

}


static void tabwrite2_tilde_redraw(t_tabwrite2_tilde *x)

{

    t_garray *a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class);

    if (!a)

        bug("tabwrite2_tilde_redraw");

    else garray_redraw(a);

}


static t_int *tabwrite2_tilde_perform(t_int *w)

{

    t_tabwrite2_tilde *x = (t_tabwrite2_tilde *)(w[1]);

    t_sample *in = (t_sample *)(w[2]);

    int n = (int)(w[3]), phase = x->x_phase, endphase = x->x_nsampsintab;

    if (!x->x_vec) goto bad;



    if (endphase > phase)

    {

        int nxfer = endphase - phase;

        t_word *wp = x->x_vec + phase;

        if (nxfer > n) nxfer = n;

        phase += nxfer;

        while (nxfer--)

        {

            t_sample f = *in++;

            if (PD_BIGORSMALL(f))

                f = 0;

            (wp++)->w_float = f;

        }

        if (phase >= endphase)

        {

            tabwrite2_tilde_redraw(x);

            phase = 0x7fffffff;

        }

        x->x_phase = phase;

    }

    else x->x_phase = 0x7fffffff;

bad:

    return (w+4);

}


static void tabwrite2_tilde_set(t_tabwrite2_tilde *x, t_symbol *s)

{

    t_garray *a;



    x->x_arrayname = s;

    if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class)))

    {

        if (*s->s_name) pd_error(x, "tabwrite2~: %s: no such array",

                                 x->x_arrayname->s_name);

        x->x_vec = 0;

    }

    else if (!garray_getfloatwords(a, &x->x_nsampsintab, &x->x_vec))

    {

        pd_error(x, "%s: bad template for tabwrite2~", x->x_arrayname->
s_name);

        x->x_vec = 0;

    }

    else garray_usedindsp(a);

}


static void tabwrite2_tilde_dsp(t_tabwrite2_tilde *x, t_signal **sp)

{

    tabwrite2_tilde_set(x, x->x_arrayname);

    dsp_add(tabwrite2_tilde_perform, 3, x, sp[0]->s_vec, sp[0]->s_n);

}


static void tabwrite2_tilde_bang(t_tabwrite2_tilde *x)

{

    x->x_phase = 0;

}


static void tabwrite2_tilde_start(t_tabwrite2_tilde *x, t_floatarg f)

{

    x->x_phase = (f > 0 ? f : 0);

}


static void tabwrite2_tilde_stop(t_tabwrite2_tilde *x)

{

    if (x->x_phase != 0x7fffffff)

    {

        tabwrite2_tilde_redraw(x);

        x->x_phase = 0x7fffffff;

    }

}


static void tabwrite2_tilde_setup(void)

{

    tabwrite2_tilde_class = class_new(gensym("tabwrite2~"),

                                     (t_newmethod)tabwrite2_tilde_new, 0,

                                     sizeof(t_tabwrite2_tilde), 0, A_DEFSYM,
0);

    CLASS_MAINSIGNALIN(tabwrite2_tilde_class, t_tabwrite2_tilde, x_f);

    class_addmethod(tabwrite2_tilde_class, (t_method)tabwrite2_tilde_dsp,

                    gensym("dsp"), A_CANT, 0);

    class_addmethod(tabwrite2_tilde_class, (t_method)tabwrite2_tilde_set,

                    gensym("set"), A_SYMBOL, 0);

    class_addmethod(tabwrite2_tilde_class, (t_method)tabwrite2_tilde_stop,

                    gensym("stop"), 0);

    class_addmethod(tabwrite2_tilde_class, (t_method)tabwrite2_tilde_start,

                    gensym("start"), A_DEFFLOAT, 0);

    class_addbang(tabwrite2_tilde_class, tabwrite2_tilde_bang);

}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puredata.info/pipermail/pd-list/attachments/20180903/149a6a77/attachment-0001.html>


More information about the Pd-list mailing list