                  (handle-note-off [this controller message]
                    false))))
 
+(defn- enter-stop-mode
+  "The user has asked to stop the show. Suspend its update task
+  and black it out until the stop button is pressed again."
+  [controller]
+
+  (with-show (:show controller)
+    (show/stop!)
+    (Thread/sleep (:refresh-interval (:show controller)))
+    (show/blackout-show))
+  (clear-interface controller)
+
+  (add-overlay controller
+               (reify IOverlay
+                 (captured-controls [this] #{29})
+                 (captured-notes [this] #{})
+                 (adjust-interface [this controller]
+                   (write-display-cell controller 0 1 "")
+                   (write-display-cell controller 0 2 "")
+                   (write-display-cell controller 1 1 "         *** Show")
+                   (write-display-cell controller 1 2 "Stop ***")
+                   (write-display-cell controller 2 1 "       Press Stop")
+                   (write-display-cell controller 2 2 "to resume.")
+                   (write-display-cell controller 3 1 "")
+                   (write-display-cell controller 3 2 "")
+                   (swap! (:next-text-buttons controller)
+                          assoc (:stop control-buttons)
+                          (button-state (:stop control-buttons) :bright))
+                   true)
+                 (handle-control-change [this controller message]
+                   (when (pos? (:velocity message))
+                     ;; End stop mode
+                     (with-show (:show controller)
+                       (show/start!))
+                     :done))
+                 (handle-note-on [this controller message]
+                   false)
+                 (handle-note-off [this controller message]
+                   false))))
+
 (defn add-button-held-feedback-overlay
   "Adds a simple overlay which keeps a control button bright as long
   as the user is holding it down."

    (swap! (:next-text-buttons controller)
           assoc (:user-mode control-buttons)
           (button-state (:user-mode control-buttons) :bright))

    ;; Add any contributions from interface overlays, removing them
    ;; if they report being finished. Reverse the order so that the

    (reset! (:next-text-buttons controller) {})
    (Arrays/fill (:next-top-pads controller) 0)

    (update-effect-list controller)
    (update-metronome-section controller)

    ;; Reflect the shift button state
