Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Apr 23rd, 2012  |  syntax: None  |  size: 1.16 KB  |  hits: 11  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. ;; OSC listener. We use an agent containing a vector of encoder states.
  2.  
  3. (ns monome.listener
  4.   (:import (monome.types EncoderState))
  5.   (:refer  monome.types :only [initial-arc-state do-button do-delta]))
  6.  
  7. ;; (Using :refer because we're still manually loading files.)
  8.  
  9. (defn interpret [m state]
  10.   "Interpret an OSC message, apply to an arc state."
  11.   (let [address (.getAddress m)
  12.         encoder (.getValue (.getArgument m 0))
  13.         value   (.getValue (.getArgument m 1))]
  14.     (cond
  15.      (= address "/example/enc/delta") (do-delta state encoder value)
  16.      (= address "/example/enc/key")   (do-button state encoder (nth [:off :on] value))
  17.      :else state)))
  18.  
  19. (defn make-listener [port ag]
  20.   "Create a listener proxy which modifies the encoder state in agent ag according to the OSC message."
  21.   (proxy [net.loadbang.osc.comms.UDPReceiver] [port]
  22.     (consumeMessage [timestamp00 message] (send ag #(interpret message %1)))))
  23.  
  24. (def a (agent (initial-arc-state 4)))
  25.  
  26. (def r (make-listener 29078 a))
  27.  
  28. (defn service [r]
  29.   (loop []
  30.     (.take r)
  31.     (recur)))
  32.  
  33. (.open r)
  34.  
  35. (doseq []
  36.   (restart-agent a (initial-arc-state 4) :clear-actions true)
  37.   (.start (Thread. #(service r))))
  38.  
  39. (.close r)