osc/devices/examples/osc-device-examples.lisp
2022-08-24 18:25:04 +02:00

295 lines
8.6 KiB
Common Lisp

(cl:in-package #:osc)
(ql:quickload "osc")
;;;=====================================================================
;;; OSC UDP transmitter -> server
;;;=====================================================================
(defparameter *osc-server* (make-osc-server :protocol :udp
:debug-mode t))
(boot *osc-server* 57127)
(defparameter *osc-transmitter* (make-osc-transmitter
:debug-mode t))
(connect *osc-transmitter* 57127 :host-name "localhost")
(device-active-p *osc-transmitter*)
(device-socket-name *osc-transmitter*)
(address *osc-transmitter*)
(port *osc-transmitter*)
(device-socket-peername *osc-transmitter*)
(peer-address *osc-transmitter*)
(peer-port *osc-transmitter*)
(send-msg *osc-transmitter* "/bar" 1 2 9)
(send-bundle *osc-transmitter*
:time ; current real time
"/foo" 1 2 3)
(send-bundle *osc-transmitter*
:now ; immediately
"/foo" 1 2 3)
(send-bundle *osc-transmitter*
(unix-time->timetag 1234567890.1234567d0)
"/foo" 1 2 3)
;; The lower-level send function can be used to send message and
;; bundle objects directly. This allows more complex (nested) bundles
;; to be created.
(send *osc-transmitter* (message "/foo" 1 2 3))
(send *osc-transmitter* (bundle :now
(message "/foo" 1 2 3)))
(let ((bundle
(bundle :now
(message "/foo" '(1 2 3))
(bundle :now
(bundle :now
(message "/bar"
'(10 20 30)))))))
(send *osc-transmitter* bundle))
(quit *osc-transmitter*)
(quit *osc-server*)
;;;=====================================================================
;;; OSC UDP client <-> server
;;;=====================================================================
(defparameter *osc-server* (make-osc-server :protocol :udp
:debug-mode t))
(boot *osc-server* 57127)
(defparameter *osc-client* (make-osc-client
:protocol :udp
:debug-mode t))
(connect *osc-client* 57127 :host-name "localhost")
;; A UDP server can't know about a client unless it registers.
(print-clients *osc-server*)
(register *osc-client*)
(print-clients *osc-server*)
(quit *osc-client*) ; quit notifies the server
(print-clients *osc-server*)
(connect *osc-client* 57127 :host-name "localhost")
(send-msg *osc-client* "/foo" 2 99)
(send-bundle *osc-client*
(unix-time->timetag 1234567890.1234567d0)
"/foo" 1 2 3)
(send-bundle *osc-client* :now "/foo" 1)
(send-bundle *osc-client* :time "/foo" 1)
;; Using the server as a transmitter.
(send-msg-to *osc-server*
(address *osc-client*) (port *osc-client*)
"/bar" 1 2 3)
(send-bundle-to *osc-server*
(address *osc-client*) (port *osc-client*)
:now "/bar" 1 2 3)
;; If a client is registered...
(send-msg-to-client *osc-server* (make-name-string *osc-client*)
"/bar" 2 99)
(register *osc-client*)
(send-msg-to-client *osc-server* (make-name-string *osc-client*)
"/bar" 2 99)
(send-bundle-to-client *osc-server*
(make-name-string *osc-client*)
:time "/bar" 2 99)
(add-osc-responder *osc-server* "/echo-sum"
(cmd args dev addr port timetag bundle)
(send-msg-to dev addr port
"/echo-answer" (apply #'+ args)))
(add-osc-responder *osc-client* "/echo-answer"
(cmd args dev addr port timetag bundle)
(format t "Sum is ~a~%" (car args)))
(send-msg *osc-client* "/echo-sum" 1 2 3 4)
(add-osc-responder *osc-server* "/timetag+1"
(cmd args dev addr port timetag bundle)
(send-bundle-to dev addr port (timetag+ timetag 1) "/the-future"))
(send-bundle *osc-client* (get-current-timetag)
"/timetag+1")
;; Send a messages to all registered clients.
(send-msg-all *osc-server* "/foo" 1 2 3)
(send-bundle-all *osc-server* :now "/foo" 1 2 3)
(defparameter *osc-client2* (make-osc-client
:protocol :udp
:debug-mode t))
(connect *osc-client2* 57127)
(register *osc-client2*)
(add-osc-responder *osc-server* "/echo-sum"
(cmd args dev addr port timetag bundle)
(send-msg-all dev "/echo-answer" (apply #'+ args)))
(send-msg *osc-client* "/echo-sum" 1 2 3 4)
(quit *osc-client*)
(quit *osc-client2*)
(quit *osc-server*)
;;;=====================================================================
;;; OSC TCP client <-> server
;;;=====================================================================
(defparameter *osc-server* (make-osc-server :protocol :tcp
:debug-mode t))
(boot *osc-server* 57127)
(defparameter *osc-client* (make-osc-client
:protocol :tcp
:debug-mode t))
(connect *osc-client* 57127 :host-name "localhost")
(device-active-p *osc-client*)
(device-socket-name *osc-client*)
(device-socket-peername *osc-client*)
(send-msg *osc-client* "/foo" 1 2 3)
(send-msg-to-client *osc-server* (make-name-string
*osc-client*)
"/foo" 1 2 3)
(defparameter *osc-client2* (make-osc-client
:protocol :tcp
:debug-mode t))
(connect *osc-client2* 57127
:host-address "127.0.0.1"
:port 57666) ; choose local port
(device-socket-name *osc-client2*)
(send-msg *osc-client2* "/bar" 4 5 6 9)
(print-clients *osc-server*)
(add-osc-responder *osc-server* "/print-sum"
(cmd args dev addr port timetag bundle)
(format t "Sum = ~A~%" (apply #'+ args)))
(send-msg *osc-client2* "/print-sum" 4 5 6 9)
(add-osc-responder *osc-server* "/echo-sum"
(cmd args dev addr port timetag bundle)
(send-msg dev cmd (apply #'+ args)))
(send-msg *osc-client2* "/echo-sum" 4 5 6 9)
(send-msg-all *osc-server* "/bar" 1 2 3) ; send to all peers
(add-osc-responder *osc-server* "/echo-sum-all"
(cmd args dev addr port timetag bundle)
(send-msg-all dev cmd (apply #'+ args)))
; Send to all peers (including self).
(send-msg *osc-client2* "/echo-sum-all" 1 2 3)
(quit *osc-client*)
(quit *osc-client2*)
(quit *osc-server*)
;;;=====================================================================
;;; OSC UDP client <-> sclang
;;;=====================================================================
(defparameter *osc-client* (make-osc-client
:protocol :udp
:debug-mode t))
(connect *osc-client* 57120 :host-name "localhost" :port 57127)
(address *osc-client*)
(port *osc-client*)
(peer-address *osc-client*)
(peer-port *osc-client*)
;;---------------------------------------------------------------------
;; run in sc
c=OSCresponder(nil,
'/foo',
{|t,r,msg,addr| [t,r,msg,addr].postln}).add
;;---------------------------------------------------------------------
(send-msg *osc-client* "/foo" 1 2 3)
(send-bundle *osc-client*
(get-current-timetag)
"/foo" 3)
(add-osc-responder *osc-client* "/echo-sum"
(cmd args dev addr port timetag bundle)
(send-msg dev cmd (apply #'+ args)))
;;---------------------------------------------------------------------
;; Send /echo-sum from sc, and lisp returns the sum.
n=NetAddr("localhost", 57127)
e=OSCresponder(nil,
'/echo-sum',
{|t,r,msg,addr|
[t,r,msg,addr].postln;
}).add
n.sendMsg('/echo-sum', 1, 2, 3) // send numbers, lisp returns sum.
;;---------------------------------------------------------------------
(quit *osc-client*)
;;;=====================================================================
;;; OSC UDP client <-> scsynth
;;;=====================================================================
(defparameter *osc-client* (make-osc-client
:protocol :udp
:debug-mode t))
(connect *osc-client* 57110 :host-name "localhost" :port 57127)
(send-msg *osc-client* "/s_new" "default" 1001 0 0 "freq" 500)
(send-msg *osc-client* "/n_free" 1001)
(send-bundle *osc-client*
(timetag+ (get-current-timetag) 2) ; 2 secs later
"/s_new" "default" 1001 0 0 "freq" 500)
(send-msg *osc-client* "/n_free" 1001)
(quit *osc-client*) ; Sends default /quit notification which scsynth
; ignores. Ideally osc-client should be subclassed
; to allow scsynth specific behaviour to be
; implemented.