     (show/set-variable! :aim-group-b-y 0.0)
     (show/set-variable! :aim-group-b-z 2.0)
 
+    ;; Set up OSC bindings so Touch OSC can control these cues in a powerful way with XY pads.
+    (add-osc-var-binding :aim-group-a-x "/1/aim-a"
+                         :send-fn (fn [_ v]
+                                    (osc/osc-send @osc-client "/1/aim-a"
+                                                  (/ (- v left-wall) width)
+                                                  (/ (- (show/get-variable :aim-group-a-z) stage-wall) depth)))
+                         :receive-fn (fn [msg]
+                                       (show/set-variable! :aim-group-a-x
+                                                           (+ left-wall (* width (first (:args msg)))))
+                                       (show/set-variable! :aim-group-a-z
+                                                           (+ stage-wall (* depth (second (:args msg)))))))
+    (add-osc-var-binding :aim-group-a-z "/1/aim-a"
+                         :send-fn (fn [_ v]
+                                    (osc/osc-send @osc-client "/1/aim-a"
+                                                  (/ (- (show/get-variable :aim-group-a-x) left-wall) width)
+                                                  (/ (- v stage-wall) depth)))
+                         :receive-fn :none)
+
+    (add-osc-var-binding :aim-group-a-y "/1/aim-a-y"
+                         :send-fn (fn [_ v]
+                                    (osc/osc-send @osc-client "/1/aim-a-y" (/ v ceiling)))
+                         :receive-fn (fn [msg]
+                                       (show/set-variable! :aim-group-a-y (* ceiling (first (:args msg))))))
+
+    (add-osc-var-binding :aim-group-b-x "/1/aim-b"
+                         :send-fn (fn [_ v]
+                                    (osc/osc-send @osc-client "/1/aim-b"
+                                                  (/ (- v left-wall) width)
+                                                  (/ (- (show/get-variable :aim-group-b-z) stage-wall) depth)))
+                         :receive-fn (fn [msg]
+                                       (show/set-variable! :aim-group-b-x
+                                                           (+ left-wall (* width (first (:args msg)))))
+                                       (show/set-variable! :aim-group-b-z
+                                                           (+ stage-wall (* depth (second (:args msg)))))))
+    (add-osc-var-binding :aim-group-b-z "/1/aim-b"
+                         :send-fn (fn [_ v]
+                                    (osc/osc-send @osc-client "/1/aim-b"
+                                                  (/ (- (show/get-variable :aim-group-b-x) left-wall) width)
+                                                  (/ (- v stage-wall) depth)))
+                         :receive-fn :none)
+
+    (add-osc-var-binding :aim-group-b-y "/1/aim-b-y"
+                         :send-fn (fn [_ v]
+                                    (osc/osc-send @osc-client "/1/aim-b-y" (/ v ceiling)))
+                         :receive-fn (fn [msg]
+                                       (show/set-variable! :aim-group-b-y (* ceiling (first (:args msg))))))
+
     ;; Set up default transformation of a reflection over the Y axis
     (.setScale transform (Vector3d. -1.0 1.0 1.0))
     (show/set-variable! :aim-group-a-transform transform)

(defn make-cues
  "Create a bunch of example cues for experimentation."
  []
  (make-main-color-dimmer-cues 0 0)  ; Creates a sigle 8x8 page at the origin
  (make-torrent-cues 0 2)  ; Creates 2 8x8 pages: two pages up from the origin, and the next page to the right
  (make-ambient-cues 1 0)  ; Creates a single 8x8 page to the right of the origin

(defn osc-shutdown
  "Shut down osc server and clean up."
  []
  (clear-osc-var-bindings)
  (clear-osc-cue-bindings)
  (core/stop-osc-server))

(defn make-color-cue
