;; Oscillating Spin Scan
;;
;; Accumulates rotation angle on each beat, reversing direction
;; periodically for an oscillating effect.
;;
;; Required context:
;;   - music: audio analyzer from (streaming:make-audio-analyzer ...)
;;
;; Provides scan: spin
;;   Bind with: (bind spin :angle)  ;; cumulative rotation angle
;;
;; Behavior:
;;   - Rotates 14.4 degrees per beat (completes 360 in 25 beats)
;;   - After 20-30 beats, reverses direction
;;   - Creates a swinging/oscillating rotation effect
;;
;; Usage:
;;   (include :path "../templates/scan-oscillating-spin.sexp")
;;
;; In frame:
;;   (rotate frame :angle (bind spin :angle))

(scan spin (streaming:audio-beat music t)
  :init {:angle 0 :dir 1 :left 25}
  :step (if (> left 0)
          (dict :angle (+ angle (* dir 14.4)) :dir dir :left (- left 1))
          (dict :angle angle :dir (* dir -1)
                :left (+ 20 (mod (streaming:audio-beat-count music t) 11)))))
