
Untitled
By: a guest on
Apr 23rd, 2012 | syntax:
None | size: 1.16 KB | hits: 11 | expires: Never
;; OSC listener. We use an agent containing a vector of encoder states.
(ns monome.listener
(:import (monome.types EncoderState))
(:refer monome.types :only [initial-arc-state do-button do-delta]))
;; (Using :refer because we're still manually loading files.)
(defn interpret [m state]
"Interpret an OSC message, apply to an arc state."
(let [address (.getAddress m)
encoder (.getValue (.getArgument m 0))
value (.getValue (.getArgument m 1))]
(cond
(= address "/example/enc/delta") (do-delta state encoder value)
(= address "/example/enc/key") (do-button state encoder (nth [:off :on] value))
:else state)))
(defn make-listener [port ag]
"Create a listener proxy which modifies the encoder state in agent ag according to the OSC message."
(proxy [net.loadbang.osc.comms.UDPReceiver] [port]
(consumeMessage [timestamp00 message] (send ag #(interpret message %1)))))
(def a (agent (initial-arc-state 4)))
(def r (make-listener 29078 a))
(defn service [r]
(loop []
(.take r)
(recur)))
(.open r)
(doseq []
(restart-agent a (initial-arc-state 4) :clear-actions true)
(.start (Thread. #(service r))))
(.close r)