<div dir="ltr">FWIW, I&#39;m definitely interested in hearing more about CM-incudine on here! :-)<div><br></div><div>iain</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 5, 2021 at 7:31 AM Brandon Hale &lt;<a href="mailto:bthaleproductions@gmail.com">bthaleproductions@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I just got around to trying this out, and man, this is awesome! Being <br>
able to trigger common music events with the incudine responder is <br>
excellent.<br>
<br>
For the responders, you would have to create a new responder for each <br>
event you would want for different osc messages, right?<br>
<br>
Thanks for your help!<br>
<br>
On 4/1/21 1:46 PM, Brandon Hale wrote:<br>
&gt; Thanks so much Orm! I didn&#39;t know if the cmdist list would also <br>
&gt; support your cm-incudine, but it would be better to have an open <br>
&gt; discussion for others seeking help on this.<br>
&gt;<br>
&gt; I will play with this and report back if I have any questions. Thank <br>
&gt; you for the detailed explanation and the awesome example!<br>
&gt;<br>
&gt; On 4/1/21 11:58 AM, Orm Finnendahl wrote:<br>
&gt;&gt; Hey Brandon,<br>
&gt;&gt;<br>
&gt;&gt; Am Donnerstag, den 01. April 2021 um 09:29:16 Uhr (-0400) schrieb<br>
&gt;&gt; Brandon Hale:<br>
&gt;&gt;&gt; Hey Orm,<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I hope it&#39;s okay to send questions your way. I&#39;ve been really <br>
&gt;&gt;&gt; interested in<br>
&gt;&gt;&gt; trying to receive OSC messages into common music. I&#39;ve looked at your<br>
&gt;&gt;&gt; documentation in cm-incudine/README.org about opening the port for <br>
&gt;&gt;&gt; OSC and<br>
&gt;&gt;&gt; your README says to look into the common music docs for handling input<br>
&gt;&gt;&gt; events. Is that the (INPUT) function that I would look into from common<br>
&gt;&gt;&gt; music? I am really interested in triggering (EVENTS) from OSC messages.<br>
&gt;&gt;   it&#39;s ok to contact me, although the cmdist list should be an<br>
&gt;&gt; appropriate forum for such questions, even if it&#39;s CL and CM2 related.<br>
&gt;&gt;<br>
&gt;&gt; I therefore also forward my response to the cmdist list. Maybe there<br>
&gt;&gt; are people out there using CM2 on CL.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; In the current CM2 version on my github repository, OSC i/o is handled<br>
&gt;&gt; by incudine. Main reasons are:<br>
&gt;&gt;<br>
&gt;&gt; 1. incudine is optimized for OSC messages and<br>
&gt;&gt;<br>
&gt;&gt; 2. Although OSC had been implemented in Common Music 2, back then it<br>
&gt;&gt;     seems to have been mainly used for communication with super<br>
&gt;&gt;     collider, probably wasn&#39;t used very much and therefore isn&#39;t well<br>
&gt;&gt;     documented. I looked into the implementation before but remember<br>
&gt;&gt;     that I wasn&#39;t sure the implementation was very practical as you had<br>
&gt;&gt;     to define classes and methods for every message type. For your<br>
&gt;&gt;     purpose I guess it&#39;s more straightforward using incudine directly<br>
&gt;&gt;     for receiving OSC. You can call the events macro within the<br>
&gt;&gt;     responders.<br>
&gt;&gt;<br>
&gt;&gt; Below is an example. Let me know if that works for you. In case you<br>
&gt;&gt; want to avoid the incudine: prefix, you can (use-package :incudine) or<br>
&gt;&gt; maybe it is even sufficient with (use-package :incudine.osc).<br>
&gt;&gt;<br>
&gt;&gt; For more info on OSC handling you can refer to the incudine doc<br>
&gt;&gt; (<a href="http://incudine.sourceforge.net/incudine.html" rel="noreferrer" target="_blank">http://incudine.sourceforge.net/incudine.html</a>), and it should also be<br>
&gt;&gt; mentioned on one page of incudine&#39;s tutorials.<br>
&gt;&gt;<br>
&gt;&gt; Best,<br>
&gt;&gt; Orm<br>
&gt;&gt; ---------------------------------------------------------<br>
&gt;&gt;<br>
&gt;&gt; ;;; open a connection &quot;socket&quot;:<br>
&gt;&gt;<br>
&gt;&gt; (setf *osc-in* (incudine.osc:open :direction :input :host &quot;127.0.0.1&quot; <br>
&gt;&gt; :port 3091))<br>
&gt;&gt;<br>
&gt;&gt; ;;; start listening on the socket:<br>
&gt;&gt;<br>
&gt;&gt; (incudine:recv-start *osc-in*)<br>
&gt;&gt;<br>
&gt;&gt; ;;; define a responder (an association between the osc route/arg types<br>
&gt;&gt; ;;; and a function to call on the args). In this case an anonymus<br>
&gt;&gt; ;;; lambda function is used, but you could also specify a named<br>
&gt;&gt; ;;; function, using the #&#39; prefix on the function name.<br>
&gt;&gt;<br>
&gt;&gt; (defparameter *osc-responder*<br>
&gt;&gt;    (incudine:make-osc-responder *osc-in* &quot;/osc/test&quot; &quot;fff&quot;<br>
&gt;&gt;                                 (lambda (a b c)<br>
&gt;&gt;                                   (format t &quot;~f ~f ~f~%&quot; a b c))))<br>
&gt;&gt;<br>
&gt;&gt; ;;; add the responder to the list of responder functions to be invoked,<br>
&gt;&gt; ;;; when the socket receives input:<br>
&gt;&gt;<br>
&gt;&gt; (incudine:add-responder *osc-responder*)<br>
&gt;&gt;<br>
&gt;&gt; ;;; after this you should be able to send 3 floats to /osc/test over<br>
&gt;&gt; ;;; osc and the floats should be printed in the REPL.<br>
&gt;&gt;<br>
&gt;&gt; ;;; The previous 2 steps of course could be done in one step with:<br>
&gt;&gt;<br>
&gt;&gt; ;;; (incudine:add-responder<br>
&gt;&gt; ;;;   (incudine:make-osc-responder<br>
&gt;&gt; ;;;    ...<br>
&gt;&gt; ;;; ))<br>
&gt;&gt;<br>
&gt;&gt; ;;; the following two functions are for inspection<br>
&gt;&gt;<br>
&gt;&gt; ;;; check if osc-receiver is running:<br>
&gt;&gt;<br>
&gt;&gt; (incudine:recv-status *osc-in*)<br>
&gt;&gt;<br>
&gt;&gt; ;;; Check which functions are active in the receiver:<br>
&gt;&gt;<br>
&gt;&gt; (incudine:recv-functions *osc-in*)<br>
&gt;&gt;<br>
&gt;&gt; ;;; close connection by undoing the previous three steps in reverse<br>
&gt;&gt; ;;; order:<br>
&gt;&gt;<br>
&gt;&gt; (incudine:remove-responder *osc-responder*)<br>
&gt;&gt; (incudine:recv-stop *osc-in*)<br>
&gt;&gt; (incudine.osc:close *osc-in*)<br>
&gt;&gt;<br>
&gt;&gt; ;;; Although it sounds unnecessarily complicated the advantage of this<br>
&gt;&gt; ;;; modularized approach is that you can dynamically add/remove<br>
&gt;&gt; ;;; responders or stop/restart listening without having to remove and<br>
&gt;&gt; ;;; add the responders again.<br>
_______________________________________________<br>
Cmdist mailing list<br>
<a href="mailto:Cmdist@ccrma.stanford.edu" target="_blank">Cmdist@ccrma.stanford.edu</a><br>
<a href="https://cm-mail.stanford.edu/mailman/listinfo/cmdist" rel="noreferrer" target="_blank">https://cm-mail.stanford.edu/mailman/listinfo/cmdist</a><br>
</blockquote></div>