kind of a question, kind of an answer.

playing around with sending / receiving osc messages during performances. what I'd like to do is attach certain functions to certain osc messages, with varying numbers of arguments. so I did. how does this look? is there a better way of doing this?

2 files included here, run 2 instances of fluxus and try sending osc msgs back and forth to make the "mouse cursor" move on one while you move the mouse on the other.

cheers
evan



;----- begin osc-send-test.scm
;----- send some mouse data


(osc-destination "osc.udp://localhost:3333")

(define (send-mouse)
    (osc-send "/mouse" "ii" (list (mouse-x) (mouse-y)))
    )

(every-frame (send-mouse))





;----- begin osc-receive-test.scm
;----- attach a function to an osc message and a list of expected values

(osc-source "3333")

;--- this is just a utility function for printing out the 1st osc message
(define (print-osc-msgs path val)
    (cond [(not (osc-msg path))
            val]
        [else
            (let [(result (osc 0))]
                (printf "~s: ~s" path result)
                (print-osc-msgs path result)
                )
            ]
        )
    )


;--- run a function on an osc message with a list of arguments (osc values indices) ;--- ex: to get both values of the osc message "/mouse 10 20" you'll need to match the
;--- path "/mouse" and then two arguments, index 0 (10) and index 1 (20)

(define (osc-func path func args val)
    (cond [(not (osc-msg path))
            #f]
        [else
            (let [(osc-args (list))]
                (for [(n args)]
                    ;(printf "~s: ~s ~s" path msg0 msg1)(newline)
                    (set! osc-args (append osc-args (list (osc n))))
                    )
                (func osc-args)
                (osc-func path func args #t)
                )

            ]
        )
    )


;--- scale a mouse x value to world coordinates

(define (mouse-pos-x x)
    (* 20 (- (/ x (vector-ref (get-screen-size) 0)) 0.5)))

;--- scale a mouse y value to world coordinates

(define (mouse-pos-y y)
    (* 15 (- (- 1 (/ y (vector-ref (get-screen-size) 1))) 0.5)))

;--- make something visual
(define p (build-plane))


(define (render)
    ;(printf "~a~n" (osc-peek))

    (osc-func "/mouse"
        (lambda (args)
            (cond [args
                    (with-primitive p
(let [(x (list-ref args 0)) (y (list-ref args 1))]
                            (identity)
(translate (vector (mouse-pos-x x) (mouse- pos-y y) 0))
                            ))
                    ])
            )
        (list 0 1)
        #t)

    (print-osc-msgs "/volume" 0)
    (print-osc-msgs "/pitch" 0)
    (print-osc-msgs "/key_note" 0)
    )

(every-frame (render))

Reply via email to