3.1.3. Common Lisp​/Incudine

Zum Senden von OSC Nachrichten mit incudine wird die Verbindung hergestellt, indem mit der Funktion incudine.osc:open ein output Port initialisiert wird:

(defparameter *oscout* (incudine.osc:open :direction :output :port 3002))

(* 45 32) ; => 1440 (11 bits, #x5A0)

Anschließend kann eine Nachricht mit dem Macro incudine.osc:message gesendet werden:

(incudine.osc:message *oscout* "/orgel02/amplitude" "f" 0.4)

Hierbei ist zu beachten, dass nach der OSC Adresse ("​/orgel02​/amplitude") auch die Signatur der nachfolgenden Daten gesendet werden muss ("f" für eine Fließkommazahl).

Auch für das Empfangen von OSC Nachrichten muss zunächst ein input Port initialisiert werden:

(defparameter *oscin* (incudine.osc:open :direction :input :port 3001))

Anschließend muss das Empfangen über diesen Port mit dem Befehl incudine:rcv-start gestartet werden:

(incudine:recv-start *oscin*)

Das Empfangen von Messages auf bestimmten OSC Adressen wird in incudine mit sogenannten respondern realisiert. Diese Responder werden mit dem Macro incudine:make-osc-responder eingerichtet. Dieses Macro erhält als Argumente den OSC Port, über den empfangen wird, die OSC Adresse als string, die Signatur der zu empfangenden Daten und eine Funktion, die aufgerufen wird, sobald Nachrichten über den Port auf der angegebenen OSC Adresse eintreffen. Daher muss die Funktion die der Signatur entsprechenden Argumente akzeptieren. Im folgenden Beispiel wird ein responder auf der OSC Adresse "​/orgel01​/level" für den Port ​oscin​ eingerichtet, der die empfangenen Nachrichten in der Lisp REPL ausdruckt:

(incudine:make-osc-responder *oscin* "/orgel01/level" "ff"
 (lambda (f1 f2) (format t "~&orgel01 level in: ~a ~a" f1 f2)))

Hinweis: Wenn der obenstehende Befehl mehrfach ausgeführt wird, werden mehrere Responder eingerichtet, so dass bei Empfang einer Nachricht die Ausgabe mehrmals erfolgt. Um Responder wieder zu entfernen, verwendet kann man den Befehl incudine:remove-all-responders verwenden, der allerdings alle aktiven Responder entfernt:

(incudine:remove-all-responders)

Möchte man einen spezifischen Responder entfernen, so muss dieser bei Einrichtung an ein Symbol gebunden werden, mit Hilfe dessen er dann mit der Funktion incudine:remove-responder gezielt entfernt werden kann:

;;; gezieltes Einrichten/Entfernen eines OSC Responders in incudine:

(defparameter *orgelresponder01*
  (incudine:make-osc-responder *oscin* "/orgel01/level" "ff"
                               (lambda (f1 f2) (format t "~&orgel01 level in: ~a ~a" f1 f2))))

;;; Entfernen:

(incudine:remove-responder *orgelresponder01*)

Mit dem Befehl incudine:recv-stop kann der Empfang von OSC Nachrichten über einen bestimmten Port temporär gestoppt (und anschließend mit incudine:recv-start wieder gestartet) werden, ohne die Responder zu entfernen:

;;; Den Empfang von OSC Nachrichten über *oscin* stoppen:

(incudine:recv-stop *oscin*)

;;; Den Empfang wieder starten:

(incudine:recv-start *oscin*)

Wenn der Port, auf der OSC Nachrichten empfangen werden, wieder freigegeben werden soll, muss er mit der Funktion incudine.osc:close geschlossen werden:

;;; OSC Ports wieder freigeben:

(incudine.osc:close *oscin*)
(incudine.osc:close *oscout*)

Wichtiger Hinweis: Man sollte unbedingt darauf achten, einen Port, der noch nicht geschlossen wurde, nicht erneut zu öffnen! Insbesondere, wenn man diesen neu geöffneten Port an dasselbe Symbol bindet, an den der noch nicht geschlossene Port gebunden war, gibt es keine Möglichkeit mehr, den Port zu schließen. In einem solchen Fall bleibt dieser Port geöffnet, bis der Lisp Prozess beendet wurde und kann nicht erneut geöffnet werden. Einziger Ausweg in einem solchen Fall ist der Neustart von Lisp oder die Verwendung einer anderen Portnummer für das Öffnen einer neuen Verbindung.

Aufgabe: Stelle eine OSC Verbindung zwischen pd und incudine auf Port 3010 her, bei der das Senden der Nachricht "/play" "iff" 62 0.5 2 von pd an incudine dazu führt, dass von incudine ein Ton mit der Keynum 62, der Amplitude 0.5 und der Dauer 2 Sekunden gespielt wird.

results matching ""

    No results matching ""