[PD-dev] Creating an external / sinewave equation example

Patrice Colet colet.patrice at free.fr
Sat Sep 10 11:06:20 CEST 2011


----- "Patrice Colet" <colet.patrice at free.fr> a écrit :

Also I've just figured out that amp variable isn't really needed since it can be performed by [*~]

> AFAIU you just need an output signal, would you mind trying something
> like this:
> 
> 
> static void sineq_tilde_amp (t_sineq_tilde *x, t_floatarg f)
> {
> 	if ((f >= 0) && (f <= 1))
> 		x->amp = f;
> 	else
> 		x->amp = 0;
> }
> 
> 
> static void sineq_tilde_freq (t_sineq_tilde *x, t_floatarg f)
> {
> 	if ((f > 0) && (f <= 20000))
> 		x->freq = f;
> 	else
> 		x->freq = 0;
> }
> 
> 
> 
> static void sineq_tilde_phase (t_sineq_tilde *x, t_floatarg f)
> {
> 	if ((f >= -1) && (f <= 1))
> 		x->phase = f;
> 	else
> 		if (f < -1) x->phase = -1;
> 		if (f > 1) x->phase = 1;
> }
> 
> 
> static void sineq_tilde_vertoff (t_sineq_tilde *x, t_floatarg f)
> {
> 	if ((f >= -1) && (f <= 1))
> 		x->vertoff = f;
> 	else
> 		if (f < -1) x->vertoff = -1;
> 		if (f > 1) x->vertoff = 1;
> }
> 
> 
> 
> 
> t_int *sineq_tilde_perform(t_int *w)
> {
>         t_sineq_tilde *x        = (t_sineq_tilde *)(w[1]);
>         t_sample           *out = (t_sample *)(w[2]);
>         int                   n = (int)           (w[3]);
> 
>         while (n--)
>         {
>                 *out++ =
> x->amp*sin(2*PI*x->freq+(deg2rad(x->phase)))+x->vertoff;
>         }
>         return (w+4);
> }
> 
> static void *sineq_tilde_new(t_symbol *s, int argc, t_atom *argv)
> {
> 	unsigned int numargs;
>     t_sineq_tilde *x = (t_sineq_tilde *)pd_new(sineq_tilde_class);
> 
> 	outlet_new(&x->x_obj, gensym("signal"));
>     return (x);
> }
> 
> 
> void sineq_tilde_dsp(t_sineq_tilde *x, t_signal **sp)
> {
>         dsp_add(sineq_tilde_perform, 3, x,
>                 sp[0]->s_vec, sp[0]->s_n);
> }
> 
> void sineq_tilde_setup(void)
> {
>         sineq_tilde_class = class_new(gensym("sineq~"),
>                 (t_newmethod)sineq_tilde_new, 0,
>                 sizeof(t_sineq_tilde), 0,
>                 A_DEFFLOAT, 0);
>         class_addmethod(sineq_tilde_class,
>                 (t_method)sineq_tilde_dsp, gensym("dsp"), 0);
>         CLASS_MAINSIGNALIN(sineq_tilde_class,t_sineq_tilde, f);
> 	class_addmethod(sineq_tilde, (t_method)sineq_tilde_amp,
> gensym("amp"), A_DEFFLOAT, 0);
> 	class_addmethod(sineq_tilde, (t_method)sineq_tilde_freq,
> gensym("freq"), A_DEFFLOAT, 0);
> 	class_addmethod(sineq_tilde, (t_method)sineq_tilde_phase,
> gensym("phase"), A_DEFFLOAT, 0);
> 	class_addmethod(sineq_tilde, (t_method)sineq_tilde_vertoff,
> gensym("vertoff"), A_DEFFLOAT, 0);
> }
> 
> 
> I didn't try this code but i think it should look like this
> 
> You might want to post this thread in pd_list, then more people that
> is able to help would interact.
> 
> 
> 
> 
> >
> >
> >
> >
> >
> > >
> > >
> > > >
> > > > It does a "make" successfully but I get this warning message
> > > > /usr/bin/ld: warning: cannot find entry symbol xport_dynamic;
> > > > defaulting to 00000000000007f0
> > > >
> > >
> > > it's certainly caused by your makefile during linking, it's rather
> > > export_dynamic, you've certainly made a typo ^^
> > >
> > >
> > >
> > > I thought so to but when I take a look at the make file it looks
> > fine
> > > here's a link to the code in (pastebin)
> > >
> >
> > Okay, in fact you should write:
> >
> > -Wl,-export-dynamic to pass it with gcc
> >
> >
> > This caused compilation to fail so I had to take it out
> >
> >
> 
> What does the console say?
> 
> >
> >
> >
> >
> >
> > > >
> > > > but when I try and add it in PD it says "couldn't create". I've
> > > looked
> > > > at the pan~ tutorial and the d_osc.c file as recommended, which
> > did
> > > > help. I tried to take pieces from the two which I thought were
> > > > applicable to my situation but I'm still having some issues.
> > > >
> > >
> > > maybe a little look into bassmu~ source code could also be
> > interesting
> >
> >
> >
> > I looked into it but this seems more complex than the d_osc.c file I
> > need easier at the moment not more complex
> >
> >
> 
> 
> I've found bassemu~.c perform part easier to understand than d_osc~.c
> that's why I suggested to have a look.
> 
> 
> 
> 
> >
> > >
> > >
> > >
> > > Do you know the name for the source file or know where I can find
> > it?
> > > I typed in bassmu~
> > > in PD and nothing came back.
> > >
> >
> > ah sorry I've made a typo :D
> > it's bassemu~
> >
> > you can get it in pd-extended externals sources
> >
> >
> >
> >
> > >
> > >
> > >
> > >
> > >
> > >
> > > >
> > > > Here's a link to the workflow (dropbox)
> > > > http://dl.dropbox.com/u/6576402/questions/pd/Sine_EQ_Diagram.jpg
> > > >
> > > >
> > > > Here's a link to the C code online (pastebin)
> > > > http://pastebin.com/9rK3szUE
> > > >
> > > >
> > > >
> > > >
> > > > My external is a reproduction of the sinewave equation with 4
> > inputs
> > > > and one output my logic is to have 4 inlets one for the
> > > > frequency,amplitude,phase and vertical offset and an output for
> > the
> > > > created signal. Granted this isn't the final equation but this
> > will
> > > > help me understand how to create the full equation once done. If
> > you
> > > > want to see the full equation I'll be using here's a link to it
> > > below.
> > > > Basically it's a 1 second periodic signal with the sample rate
> at
> > > > 44100 which the equation gives me control over the
> > > > frequency,amplitude,phase and vertical offset, which will be
> > > > controlled by a usb midi controller.
> > > >
> > > >
> > > > Another question I have is what do I use for the t (time) for my
> > > final
> > > > equation is that the t_sample object in PD? or do I need to
> create
> > a
> > > > for loop counting from 1-44100 for a 1 second 44100 sampled
> > > equation?
> > > >
> > > >
> > > > http://dl.dropbox.com/u/6576402/questions/eq1.txt
> > > >
> > > >
> > > >
> > > >
> > > > PS: I'm compiling on ubuntu 10.04 using gcc
> > > >
> > > > On Sun, Sep 4, 2011 at 12:13 PM, Martin Peach <
> > > > martin.peach at sympatico.ca > wrote:
> > > >
> > > >
> > > > On 2011-09-04 16:52, Rick T wrote:
> > > > ...
> > > >
> > > >
> > > >
> > > >
> > > > I've been able to find instructions on how to create a hello
> world
> > > > C-external but not one that creates a simple sine wave from a
> > > sinewave
> > > > equation like A*sin(w*t+p)
> > > > ( https://secure.wikimedia.org/ wikipedia/en/wiki/Sine_wave )
> Does
> > > > anyone
> > > > have one or know where to find one.
> > > >
> > > > The canonical reference is here:
> > > > http://iem.at/pd/externals- HOWTO/node6.html
> > > > You just need to plug your equation into the perform routine.
> > > > Also check the source for osc~ in d_osc.c of the Pd source,
> which
> > > uses
> > > > a fancy 32-bit float cosine table scanning method that was
> useful
> > > when
> > > > it mattered but is getting obsolete as a call to sin() is
> probably
> > > > just as fast nowadays.
> > > >
> > > > Martin
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > _______________________________________________
> > > > Pd-dev mailing list
> > > > Pd-dev at iem.at
> > > > http://lists.puredata.info/listinfo/pd-dev
> > >
> > > --
> > > Patrice Colet
> > >
> > >
> > >
> > > Aloha
> > > and thanks for the help every bit helps --
> >
> > --
> > Patrice Colet
> >
> >
> >
> >
> > aloha
> > Rick
> > _______________________________________________
> > Pd-dev mailing list
> > Pd-dev at iem.at
> > http://lists.puredata.info/listinfo/pd-dev
> 
> --
> Patrice Colet
> 
> _______________________________________________
> Pd-dev mailing list
> Pd-dev at iem.at
> http://lists.puredata.info/listinfo/pd-dev

-- 
Patrice Colet 



More information about the Pd-dev mailing list