         {:id (swap! controller-counter inc)
          :show show
          :origin (atom [0 0])
+         :effect-offset (atom 0)
          :refresh-interval refresh-interval
          :port-in (midi/midi-find-device (amidi/open-inputs-if-needed!) device-name)
          :port-out (midi/midi-find-device (amidi/open-outputs-if-needed!) device-name)


    44 ; Left arrow
    (when (pos? (:velocity message))
      (let [[x y] @(:origin controller)]
        (when (pos? x)
          (reset! (:origin controller) [(max 0 (- x 8)) y])
          (add-button-held-feedback-overlay controller (:left-arrow control-buttons)))))

    45 ; Right arrow
    (when (pos? (:velocity message))
      (let [[x y] @(:origin controller)]
        (when (> (- (controllers/grid-width (:cue-grid (:show controller))) x) 7)
          (reset! (:origin controller) [(+ x 8) y])
          (add-button-held-feedback-overlay controller (:right-arrow control-buttons)))))

    46 ; Up arrow
    (when (pos? (:velocity message))
      (let [[x y] @(:origin controller)]
        (when (> (- (controllers/grid-height (:cue-grid (:show controller))) y) 7)
          (reset! (:origin controller) [x (+ y 8)])
          (add-button-held-feedback-overlay controller (:up-arrow control-buttons)))))

    47 ; Down arrow
    (when (pos? (:velocity message))
      (let [[x y] @(:origin controller)]
        (when (pos? y)
          (reset! (:origin controller) [x (max 0 (- y 8))])
          (add-button-held-feedback-overlay controller (:down-arrow control-buttons)))))

    59 ; User mode button
    (when (pos? (:velocity message))

                         (if @(:shift-mode controller) :bright :dim)))
    
    (render-cue-grid controller)
    (update-scroll-arrows controller)
    
    ;; Make the User button bright, since we live in User mode
    (swap! (:next-text-buttons controller)
           assoc (:user-mode control-buttons)
