     ;; TODO: Loop over the most recent four active cues, rendering information
     ;;       about them.
 
-    (let [metronome (:metronome (:show controller))
-          metronome-button (:metronome control-buttons)
-          tap-tempo-button (:tap-tempo control-buttons)
-          metronome-mode @(:metronome-mode controller)]
-      ;; Should the first cell display metronome information?
-      (if (seq metronome-mode)
-        (let [metronome (:metronome (:show controller))
-              marker (rhythm/metro-marker metronome)
-              bpm (format "%.1f" (float (rhythm/metro-bpm metronome)))
-              chars (+ (count marker) (count bpm))
-              padding (apply str (take (- 17 chars) (repeat " ")))]
-          (swap! (:next-text-buttons controller)
-                 assoc metronome-button (button-state metronome-button :bright))
-          (write-display-cell controller 3 0 (str marker padding bpm))
-          (write-display-cell controller 2 0 "Beat        BPM  ")
-          (when (:adjusting-beat metronome-mode)
-            (aset (get (:next-display controller) 2) (dec (count marker)) (byte 1)))
-          (when (:adjusting-bpm metronome-mode)
-            (aset (get (:next-display controller) 2) 16 (byte 1))))
-        (swap! (:next-text-buttons controller)
-               assoc metronome-button (button-state metronome-button :dim)))
-      ;; Regardless, flash the tap tempo button on beats
-      (swap! (:next-text-buttons controller)
-             assoc tap-tempo-button
-             (button-state tap-tempo-button
-                           (if (< (rhythm/metro-beat-phase metronome) 0.15)
-                             :bright :dim))))
+    (update-metronome-section controller)
+
+    ;; Reflect the shift button state
+    (swap! (:next-text-buttons controller)
+           assoc (:shift control-buttons)
+           (button-state (:shift control-buttons)
+                         (if @(:shift-mode controller) :bright :dim)))
     
     (update-text controller)
     (update-text-buttons controller)

    (doseq [[i val] (map-indexed vector bytes)]
      (aset (get (:next-display controller) row) (+ (* cell 17) i) (util/ubyte val)))))

(defn update-interface
  "Determine the desired current state of the interface, and send any
  changes needed to get it to that state."

         :last-text-buttons (atom {})
         :next-text-buttons (atom {})
         :metronome-mode (atom {:showing true})
         :shift-mode (atom false)
         :midi-handler (atom nil)
         :tap-tempo-handler (amidi/create-tempo-tap-handler (:metronome show))
         }]
