indy.io

seni-android (alpha)

Seni is going to be an Android app which generates unique wallpapers for your device.

It renders images from scripts written in a Scheme-like language. Genetic programming techniques are then used to generate variations of the image based on user feedback.

Here’s a very early screenshot, it’s using primitive drawing operations from the Canvas element, but the final release of the app will be based on an OpenGL renderer:

Whilst the seni scripts won’t be visible for end-users, here’s an example of their syntax. As you can see it’s based on Scheme but with additional square brackets, these are points in the program that can be modified by the runtime:

(metadata
  title "art1405c"
  description "a more volatile version of earlier scripts"
  author "indy"
  created "2014-02-04")
    
(define squ
  (lambda (angle colour box-radius)
    (begin (set-colour colour)
        (scope (rotate angle)
               (translate 0.0 (/ canvas-height 5))
               (circle 0.0 0.0 box-radius))
      (let ((br2 box-radius)
            (ang [20.0 (in-range 0.0 90.0)])
            (to-center-factor (/ (/ canvas-height 5) 
                                 [13.3333 (in-range 5.0 50.0)]))
            (shrink-factor [0.9 (in-range 0.1 2.1)])
            (ang-delta [8.0 (in-range 1.0 59.0)]))
        (do-times i 10
                  (set! br2 (* br2 shrink-factor))
                  (set! ang (+ ang ang-delta))
                  (scope (rotate (- angle ang))
                         (translate 0.0 (- (/ canvas-height 5) 
                                           (* (as-float i) 
                                              to-center-factor)))
                         (circle 0.0 0.0 br2))
                  (scope (rotate (+ angle ang))
                         (translate 0.0 (- (/ canvas-height 5) 
                                           (* (as-float i) 
                                              to-center-factor)))
                         (circle 0.0 0.0 br2)))))))
    
(let ((primary (colour [0.0] [0.9] [0.9] 0.3))
      (triads (triad primary))
      (box-radius (/ canvas-width 12.0))
      (focal-x (/ canvas-width 2.0))
      (focal-y (/ canvas-height 2.0))
      (angle [0.0 (in-range 0.0 360.0)]))
  (do-times i 3
            (scope (translate focal-x focal-y)
                   (squ angle (nth triads i) box-radius)
                   (set! angle (+ angle (/ 360.0 3.0))))))

The app is currently under development but the source code is on Github