|
3 | 3 | [spade.core :refer [defclass defkeyframes]] |
4 | 4 | [re-frame.core :as rf] |
5 | 5 | [clojure.string :as str] |
6 | | - [practaid.player :refer [playback-pos-refresh-interval-ms]])) |
| 6 | + [practaid.player :refer [playback-pos-refresh-interval-ms]] |
| 7 | + ["multiple.js" :as Multiple])) |
7 | 8 |
|
8 | 9 | (defclass playback-metadata-style [] |
9 | 10 | {:display "flex" |
|
28 | 29 | [:div {:class (playback-metadata-style)} |
29 | 30 | (and album-cover-url |
30 | 31 | [:div.album-cover-container |
31 | | - [:img.album-cover-image {:src album-cover-url}]]) |
| 32 | + [:img.album-cover-image {:src album-cover-url |
| 33 | + :crossOrigin "Anonymous" |
| 34 | + :on-load #(rf/dispatch [:practaid.events/album-cover-img-loaded |
| 35 | + (-> js/document |
| 36 | + (. querySelector "img.album-cover-image"))])}]]) |
32 | 37 | [:div.text-metadata-container |
33 | 38 | [:a {:href (str "https://open.spotify.com/track/" track-id) |
34 | 39 | :title "Play on Spotify"} |
|
111 | 116 | ;(defkeyframes) |
112 | 117 |
|
113 | 118 |
|
114 | | -(defn waveform [{:keys [loudnesses loop-start-frac loop-end-frac player-pos-frac handle-click should-smooth-motion]}] |
115 | | - [:div {:class (waveform-style) |
116 | | - :on-click handle-click} |
117 | | - [waveform-pos-marker {:location loop-start-frac :color "black"}] |
118 | | - [waveform-pos-marker {:location loop-end-frac :color "black"}] |
119 | | - [playback-pos-marker {:location player-pos-frac |
120 | | - :should-smooth-motion should-smooth-motion}] |
121 | | - (for [[i loudness] (map-indexed vector loudnesses)] |
122 | | - [:div.wave {:key i |
123 | | - :class (wave-style) |
124 | | - ;; TODO move me? |
125 | | - :style {:height (str (int (* loudness 100)) "%")}}])]) |
| 119 | +(defn waveform [{:keys [loudnesses loop-start-frac loop-end-frac player-pos-frac handle-click should-smooth-motion album-colors]}] |
| 120 | + (let [rgbs (map #(str "rgb(" (str/join ", " %) ")") |
| 121 | + album-colors) |
| 122 | + background (when rgbs (str "linear-gradient(to right," (str/join ", " rgbs) ")")) |
| 123 | + waveform-style (waveform-style) |
| 124 | + _ (when rgbs (new ^js Multiple (clj->js {:selector "div.wave" |
| 125 | + :background background})))] |
| 126 | + [:div {:class waveform-style |
| 127 | + :on-click handle-click} |
| 128 | + [waveform-pos-marker {:location loop-start-frac :color "black"}] |
| 129 | + [waveform-pos-marker {:location loop-end-frac :color "black"}] |
| 130 | + [playback-pos-marker {:location player-pos-frac |
| 131 | + :should-smooth-motion should-smooth-motion}] |
| 132 | + (for [[i loudness] (map-indexed vector loudnesses)] |
| 133 | + [:div.wave {:key i |
| 134 | + :class (wave-style) |
| 135 | + ;; TODO move me? |
| 136 | + :style {:height (str (int (* loudness 100)) "%")}}])])) |
126 | 137 |
|
127 | 138 |
|
128 | 139 |
|
|
181 | 192 | defaulted-loop-start-frac @(rf/subscribe [:practaid.subs/defaulted-loop-start-frac]) |
182 | 193 | defaulted-loop-end-frac @(rf/subscribe [:practaid.subs/defaulted-loop-end-frac]) |
183 | 194 | player-pos-frac @(rf/subscribe [:practaid.subs/player-pos-frac]) |
184 | | - should-smooth-motion @(rf/subscribe [:practaid.subs/should-smooth-motion])] |
| 195 | + should-smooth-motion @(rf/subscribe [:practaid.subs/should-smooth-motion]) |
| 196 | + album-colors @(rf/subscribe [:practaid.subs/album-colors])] |
185 | 197 | [page-wrapper |
186 | 198 | [:div {:class (looper-page-style)} |
187 | 199 | [:div.connection-status |
|
210 | 222 | defaulted-loop-end-ms]) |
211 | 223 | :on-commit #(rf/dispatch [:practaid.events/reset-looper]) |
212 | 224 | :disabled (not is-playback-ours)}] |
213 | | - [waveform {:loudnesses loudnesses |
| 225 | + [waveform {:album-colors album-colors |
| 226 | + :loudnesses loudnesses |
214 | 227 | :loop-start-frac defaulted-loop-start-frac |
215 | 228 | :loop-end-frac defaulted-loop-end-frac |
216 | 229 | :player-pos-frac player-pos-frac |
|
0 commit comments