Skip to content

Instantly share code, notes, and snippets.

@cassiel
Created May 31, 2011 21:11
Show Gist options
  • Save cassiel/1001294 to your computer and use it in GitHub Desktop.
Save cassiel/1001294 to your computer and use it in GitHub Desktop.
monome listener in clojure
;; 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