<div dir="ltr"><div><span style="font-family:verdana,sans-serif;font-size:12.8px">> I found a way to simulate this behaviour </span><br></div><div><br></div>I just wanna publicly thank you for being awesome :)<div><br></div><div><span style="font-family:verdana,sans-serif;font-size:12.8px">> (only for floats, not for anythings)</span><br></div><div><br></div><div>it works for most of cyclone issues... more than in scope~, this is really crucial for other 4 objects in cyclone (bitand~, bitor~, bitxor~, delay~ [as in max7])</div><div><br></div><div>cheers</div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-07-14 13:29 GMT-03:00 Matt Barber <span dir="ltr"><<a href="mailto:brbrofsvl@gmail.com" target="_blank">brbrofsvl@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:verdana,sans-serif">​Hello list,</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Back in March we had a discussion about getting signal ​inlets other than the main one to use floats as messages rather than signals.</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">I found a way to simulate this behavior (only for floats, not for anythings). A little background:</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">If you have a signal inlet, when you send a float to it, it stores that float in a field that the ugen graph function retrieves if it notices that inlet has no signal connection: if there's at least one signal connected, those are used, but if not, the float scalar is promoted to a signal. You can update that scalar even while a signal is connected.</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">You need to #include "g_canvas.h" to get started.</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">So the idea here is:</div><div class="gmail_default" style="font-family:verdana,sans-serif">1) in the new() routine, get access to the float scalar for your inlet from within your object class.</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">2) in the new() routine, optionally set the scalar field with a default or a creation arg.<br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">3) check manually in your dsp() routine to see if that inlet has a signal connection feeding it. If so, then the scalar is ignored and you can use the signal as is. However, if you want the inlet to have zeroes when there's no signal inlet, rather than the scalar, you have to let your perform() routine know.</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">4) in the perform() routine, poll the scalar field for changes.</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">-------------------------------------------</div><div class="gmail_default" style="font-family:verdana,sans-serif">Before you can do 1) and 2), you need to keep the t_inlet pointer returned from inlet_new, something like:</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">x->x_rightinlet = inlet_new((t_object *)x, (t_pd *)x, &s_signal, &s_signal);</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">For 1), get a pointer to the float field and save it:</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">x->x_signalscalar = obj_findsignalscalar(x, 1); // second arg is the inlet index</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Then to use it simply dereference it:</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">float scalar = *x->x_signalscalar; // this probably goes in your perform() routine</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">---------------------------------------------<br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">For 2), you want to set the float in the field, so you can just call the default float routine for inlets:</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default"><font face="verdana, sans-serif">pd_float((t_pd *)x->x_rightinlet, f); // first arg is your inlet, cast as a (t_pd *), and the second is the input float</font><br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">---------------------------------------------</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">3) is the trickiest part. The cyclone code does it this way:</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default"><div class="gmail_default" style="font-family:verdana,sans-serif">int forky_hasfeeders(t_object *x, t_glist *glist, int inno, t_symbol *outsym)</div><div class="gmail_default" style="font-family:verdana,sans-serif">{</div><div class="gmail_default" style="font-family:verdana,sans-serif">    t_linetraverser t;</div><div class="gmail_default" style="font-family:verdana,sans-serif">    linetraverser_start(&t, glist);</div><div class="gmail_default" style="font-family:verdana,sans-serif">    while (linetraverser_next(&t))</div><div class="gmail_default" style="font-family:verdana,sans-serif"><span style="white-space:pre-wrap">    </span>if (t.tr_ob2 == x && t.tr_inno == inno</div><div class="gmail_default" style="font-family:verdana,sans-serif"><span style="white-space:pre-wrap">  </span>    && (!outsym || outsym == outlet_getsymbol(t.tr_outlet))</div><div class="gmail_default" style="font-family:verdana,sans-serif">           )</div><div class="gmail_default" style="font-family:verdana,sans-serif"><span style="white-space:pre-wrap"> </span>    return (1);</div><div class="gmail_default" style="font-family:verdana,sans-serif">    return (0);</div><div class="gmail_default" style="font-family:verdana,sans-serif">}</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Which is called like so:</div><div class="gmail_default"><font face="verdana, sans-serif">forky_hasfeeders((t_object *)x, x->x_glist, 1, &s_signal);</font><br></div><div class="gmail_default"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default"><font face="verdana, sans-serif">This basically says "if there's a connection to the inlet in the 3rd arg, and it's from a signal outlet, return true." x->x_glist is set this way in the new() routine:</font></div><div class="gmail_default"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default"><font face="verdana, sans-serif">x->x_glist = canvas_getcurrent();<br></font></div><div class="gmail_default"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default"><font face="verdana, sans-serif">--------------------------------------------</font></div><div class="gmail_default"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default"><font face="verdana, sans-serif">4) now in your perform() routine you can poll for changes:</font></div><div class="gmail_default"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default"><font face="verdana, sans-serif"><div class="gmail_default">t_float scalar = *x->x_signalscalar;</div><div class="gmail_default">if (scalar != x->x_scalar)</div><div class="gmail_default"><span style="white-space:pre-wrap">{</span></div><div class="gmail_default"><span style="white-space:pre-wrap">    x->x_scalar = scalar;</span></div><div class="gmail_default"><span style="white-space:pre-wrap">   // do other stuff, call functions, etc.</span></div><div class="gmail_default"><span style="white-space:pre-wrap">}</span></div></font></div></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">I don't have time right now, but I'll make a minimal object later to illustrate.</div></div>
<br>_______________________________________________<br>
<a href="mailto:Pd-list@lists.iem.at">Pd-list@lists.iem.at</a> mailing list<br>
UNSUBSCRIBE and account-management -> <a href="https://lists.puredata.info/listinfo/pd-list" rel="noreferrer" target="_blank">https://lists.puredata.info/listinfo/pd-list</a><br>
<br></blockquote></div><br></div>