294 lines
8.6 KiB
Common Lisp
294 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.
|