                      (map-indexed #(-> [[id %] %2]) urls)))
         sound-req))
 
+(defn start-exercise-custom-sounds [this]
+  (go
+    (let [{::keys [custom-sounds-req]} (om/props this)
+          progress-chan (handle-progress (om/parent this) (async/chan 10))
+          sounds        (<! (audio/load-sound-library
+                              (flatten-request custom-sounds-req)
+                              progress-chan))]
+      (um/set-value! (om/parent this) ::custom-sounds sounds))
+    nil))
+
 (om/defui ^:once Exercise
   static uc/InitialAppState
   (initial-state [_ _] {::ex-answer              nil

          (dom/div #js {:style #js {"textAlign" "center"}}
            (dom/h1 nil "Make sure you have your volume up, many of our exercises play sound!")
            (if (and custom-sounds-req (not custom-sounds))
              (dom/div nil
                (some-> custom-sounds-progress progress-bar)
                (dom/div nil "Loading..."))
              (dom/a #js {:className "btn btn-primary"
                          :onClick   (fn [e]
                                       (.preventDefault e)

                        ::hints-used             0
                        ::play-notes             play-notes
                        ::started?               false
                        ::context-missing        false
                        ::custom-sounds-progress {:ui/progress-value 0
                                                  :ui/progress-total 1}
                        ::custom-sounds-req      nil})
