     return fract(sin(uv.x * 15.78 + uv.y * 35.14) * 43758.23);
 }
 
+vec3 hsv2rgb(vec3 c)
+{
+    vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
+    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
+    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
+}
+
 void main( void ) {
     vec4 col = texture2D(uSampler, vTextureCoord);
 

    ;; bouncing name
    ;;
    (sprite/set-alpha! test-text 0.0)
    (sprite/set-scale! test-text 6)
    (set! (.-filters test-text) #js [(make-test)])
    (.addChild (-> canvas :layer :ui) test-text)
    (resources/fadein test-text :duration 5)

    ;;
    (sprite/set-scale! scroll-text 4)
    (.addChild (-> canvas :layer :ui) scroll-text)
    (go (loop [n -3600]
          (let [h (.-innerHeight js/window)
                hh (/ h 2)
                qh (/ h 4)]
            (sprite/set-pos! scroll-text (* n -5) (- hh 80)))
          (<! (events/next-frame))
          (recur (if (> n 3600) -3600 (inc n)))))

    ;;
    ;; parallax stars
