animation

Utility for creating animations from a series of images

  1. animation
    1. make-animator
      1. Examples
    2. About this egg
      1. Author
      2. Repository
      3. License
      4. Dependencies
      5. Versions
      6. Colophon

make-animator

[procedure] (make-animator #!key (magnitude 10000) (frames-per-second 4) (type png) (width 1600) (height 900)) → Two values: next-frame and finalize

Create an animator, which consists of two values: a frame-creator and a finalizer.

Next-frame is a niladic function which returns the filename of the next frame; finalize is a monadic function taking the name of the resultant animation (e.g. "graph.avi").

magnitude
Roughly the number of animations one anticipates
frames-per-second
Frames per second
type
The frame type; one of e.g. "png", "jpg"
width
The width of the frame in pixels (#f for no scaling)
height
The height of the frame (#f for no scaling)
(define (make-animator
         #!key
         (magnitude 10000)
         (frames-per-second 4)
         (type "png")
         (width 1600)
         (height 900))
  (let ((directory (create-temporary-directory))
        (current-frame 0)
        (digits (inexact->exact (ceiling (/ (log magnitude) (log 10))))))
    (define (next-frame)
      (let ((frame (make-pathname
                     directory
                     (format (format "~~~a,48d" digits) current-frame)
                     type)))
        (inc! current-frame)
        frame))
    (define (finalize animation)
      (let ((options
              (option-string
                (append
                  `((type unquote type) (fps unquote frames-per-second))
                  (if width `((w unquote width)) '())
                  (if height `((h unquote height)) '())))))
        (run (mencoder
               ,(format
                  "mf://~a"
                  (make-pathname directory (format "*.~a" type)))
               -mf
               ,options
               -ovc
               lavc
               -o
               ,animation))))
    (values next-frame finalize)))

Examples

In this hypothetical example, we're running a depth-first-search on a graph; outputting an animation frame every step.

(receive (next-frame finalize) (make-animator)
  (let ((graph (make-random-graph)))
    (call-for-each-frame (depth-first-search graph)
                         (lambda (graph)
                           (write-graph-as-png graph (next-frame))))
    (finalize "graph")))

About this egg

Author

Peter Danenberg

Repository

https://github.com/klutometis/animation

License

BSD

Dependencies

Versions

0.1
Initial release
0.2
Fix cock-invocation.
0.3
Add width and height.

Colophon

Documented by cock.