;; ASCII Zones effect - different character sets for different brightness zones ;; Dark areas use simple chars, mid uses standard, bright uses blocks ;; @param char_size int [4, 32] default 8 ;; @param dark_threshold int [0, 128] default 80 ;; @param bright_threshold int [128, 255] default 180 ;; @param color_mode string default "color" (define-effect ascii_zones ((char_size 8) (dark_threshold 80) (bright_threshold 180) (color_mode "color")) (let* ((sample (cell-sample frame char_size)) (colors (nth sample 0)) (luminances (nth sample 1)) ;; Start with simple chars as base (base-chars (luminance-to-chars luminances "simple" 1.2)) ;; Map each cell to appropriate alphabet based on brightness zone (zoned-chars (map-char-grid base-chars luminances (lambda (r c ch lum) (cond ;; Bright zones: use block characters ((> lum bright_threshold) (alphabet-char "blocks" (floor (/ (- lum bright_threshold) 15)))) ;; Dark zones: use simple sparse chars ((< lum dark_threshold) (alphabet-char " .-" (floor (/ lum 30)))) ;; Mid zones: use standard ASCII (else (alphabet-char "standard" (floor (/ lum 4))))))))) (render-char-grid frame zoned-chars colors char_size color_mode (list 0 0 0))))