Created
May 31, 2011 21:11
-
-
Save cassiel/1001294 to your computer and use it in GitHub Desktop.
monome listener in clojure
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; 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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment