Brooklyn, New York
member since February 13, 2009
profile picture

portfolio of
Kyle McDonald


I use this pattern all the time for checking whether a projector is keystoned or not.

LCD Strips

Lines that move left and right across the screen with (aliased) subpixel accuracy. Best viewed under a microscope.

LCD Travellers

Pixels that move across one plane (red, green, blue) of an LCD. Best viewed under a microscope.

Multiscale Turing Patterns

Based on the implementation at Ported to openFrameworks, then back to Processing, replacing OpenCv blur with an integral image blur. This uses the inhibitor from the current level as the activator for the next level. Each level blurs the level beneath it. Blurring is done "in place" with only three buffers (activator, inhibitor, integral image) making it possible to compute an arbitrary number of levels.

Click to reset. Parameters vary slightly each time.

Presentation Timer

This is a simple utility I wrote on the subway. I wanted to keep track of how much time I had for each section of a talk I was about to give. I didn't include any numbers, but instead focused on providing a quick visual description of where I was at that moment.

If something goes terribly wrong, you can click and drag to "reset the timer".

Gaussian Curve

Simple Gaussian curve demo replicating <a href="">an image from Wikipedia</a>.

Dashed Circle

Simple function for drawing a dashed circle.

Inverted Oceans

What would the Earth look like if every elevation was inverted? If oceans were mountains and vice versa?

Bathymetric (ocean depth) information from NASA is recolored here using topographic information and satellite imagery. Colors are based on a distance-based weighted average of similar elevations (other algorithms are available if the source code is modified).

<a href="">High resolution render on Flickr.</a>
<a href="">Source material from NASA.</a>

Fast Lens Blur Kernel

Towards a linear time lens blur filter using integral images. Edit: old version was centered on grid, new version is centered on pixel.

Vector Field

Uses a normalized radial basis function network to determine the structure of a 2d vector field.

In other words, a weighted average shapes the vector field.

Draw multiple lines for the full effect. Hitting any key deletes the control vectors.

Shuffle Enumeration Diagram

Using an iteratively applied one-to-one functions to create an alternative enumeration of all the 2^n binary numbers for a bit string of length n.

A version of this technique was used in "<a href="">Only Everything Lasts Forever</a>".

Click to pause.

Every Icon

A simple recreation of John F. Simon Jr.'s 1997 piece, one of the best known visual enumeration pieces (<a href="">explanation</a>, <a href="">original</a>).

The license for the original forbids reverse engineering.

Affine Transform

Given two triangles (red and blue), map another triangle (green) from one space to the other (purple). All the points, except the resulting triangle, are draggable.

This technique is regularly used in texture mapping.

No Noise

Working with a theme from <a href="">Jochem van der Spek</a>. Try moving the mouse around, pausing, and moving the mouse around some more.

Week End Traffic

Visualization of point cloud generated by Photosynth from a two and a half minute take in Godard's "Week End". Original Photosynth is <a href="">here</a>.

Controls: left click to rotate, right click to zoom, both or middle to pan.

Clouds Are Looming

Noise-based flocking with depth of field.

'p' pauses the particles, mouse for rotation/translation/zoom. All other controls in the control window.

Also on Vimeo

English Words

Random words based on patterns in the English language. Letter clusters are not based on probabilities, so uncommon words are just as common as probable words.

They might look like random letter combinations, but most of these are actually pronounceable!


A quick tribute to all the topographic maps out there.


Textual feedback. Resonance between the external visual encoding and internal ASCII encoding, executed at varying scales, creating fractals.

This will vary based on what font your system chooses.

Explore the space by moving the mouse horizontally. Some areas will be stable, others will oscillate.


Intentionally inducing and collaborating with the beloved java.lang.NullPointerException, encountered whenever accessing pixels[] without calling loadPixels() first.


This program outputs its own source as text.


Using Perlin noise to describe wind, acting as an attractor on "pollen" particles moving through it; trying to coax a 2D vector field from the 1D Perlin noise functions. If you let it run for a bit, you'll notice some repetition in form due to the nature of Perlin noise.

Point-based rendering aesthetic inspired by Jared Tarbell.

Click to reset. Any key to debug.


Radial sections of the area surrounding Mt Fuji (north 35, east 138), using <a href="">SRTM 3 data</a>.

Fitter Happier

Like a pig, in a cage, using FFT bins to determine facial action unit weights.

~2MB, give it 20 seconds to download.

Ambiguous Monologue

Giving a face to some noise using the original Candide model.

Decompiled using Jad and simplified for Processing.

Standard 3D navigation with mouse.

Three Phase 3D Scanner

Technique from Song Zhang, coded in C++ by Alex Evans, ported to Processing by Florian Jennet. I rewrote the code and got rid of things that were unnecessary or didn't work. The original had a little less noise. I extrapolated out three variables instead of trying to compute them: zskew, zscale, and noiseTolerance.

Learn how to use this code to make your own 3D scans <a href="">on Instructables</a>.

Multishadow Error

Broken code from a few years ago that now reminds me of Robert Hodgin's very sphere-y 3D work over the last year.


A game of tag, played by an adaptive population. Click to reset. Each member of the population has a mind made up of nested code; for example:

(ifit (max (mod y (+ (min y (min (abs y) (iflte 0.252 y (* 0.0955 x) x))) y)) 0.252) (iflte y 0.005545 (iflte y (* y (min (* x x) 0.4767)) (* 0.05141 x) (* 0.1078 x)) 4.767))

Where x and y refer to the position of an important member (either one to pursue or run from, depending on the status of the member; the red one is it) in a local coordinate system. The output of the function is a single heading. These minds are generated at random.


A game of tag, played by an adaptive population.

click to pause
select a bar to see that mind/code tree
move within tagging distance to select a member
m mutates selected member
c crosses over to selected member
r to reset the game
d toggles display mode
e toggles extra display (crossovers, etc.)
f toggles statistics
s toggles sorting of statistics
t toggles display of code trees

Origami Butterfly

A modification of the Origami Butterfly Method by Jonathan McCabe. Use numbers 1-4 to switch source images. The modified algorithm can be paraphrased:

1 Fold a piece of paper (a few times)
2 Project an image onto the paper (like tie-dye)
3 Unfold the paper


0-9 for different presets
d toggles doubled colors
i inverts coloration
m uses modified line drawing algorithm
s spins the electrodes in 3d

Colors stolen from The Cafe Terrace on the Place du Forum, with van Gogh's first starry sky.

Fieldlines from Koen Mostert.


Font-dependent feedback loop. Click to toggle color. The internal representation of the screen is printed to the screen. A fractal pattern emerges from the font chosen for printing.


Don't move too fast, you might scare it.

Click to forgive and forget.


A simple self organizing system. Every termite (the things moving around) knows two things: if you run into a wood chip, pick it up; only drop it when you hit a pile. Using these rules, the piles eventually converge to one single pile.

Hit a key for an alternative visualization of transfers.

Chain Mail

Quick sketch, tracking one path of a chain email that happened to have locations noted next to ~1600 names. The email was a petition for George W. Bush to "lift the prohibition of prayer in schools".

The locations were combined with an approximation of state centers. You can barely make out the shape of the US from the map.

Mouse moves camera.

Unnamed Flower

A ton of randomly generated furry/fuzzy flowers. An exercise in describing to Processing an idea I would otherwise draw.

Particle Physics

50 particles, attracted to each other, with trails. My first Processing sketch, back from rev 30ish (old camera code swapped out with PeasyCam). Mouse moves camera.


Demonstration of Lorenz attractor using 25,000 color-coded points generated within the vicinity of the final loop. There are a lot of pictures of this system, but not enough moving simulations.

Use the mouse to move the camera. Keypress resets simulation.

More on Wikipedia:


Example of using k-means clustering to cluster random data.

Color Planets

Inverse square attraction on funny little fuzzy + colorful planets. Click to reset.


Left click: rotate, right click: zoom, both: pan. Key relase: new lint ball. Tab: momentarily make lint solid.

Based on the simple recursive rendering of spherical system with 10 faces.

Sparse Distributed Memory

A collaboration with Jason LaPorte ( implementing Kanerva's data structure as described by Peter Denning. The idea is to mimic human memory with a structure that can make connections between seemingly unrelated information, recall more salient information more accurately, and have quick recall of all information.

You might call it "holographic".

Right now it is just being used to store random pairs of 16-bit integers, and visualizing the memory as a 2D field of colors.

Phonetic Connection

Feel free to type (English) words and watch the sound-connections between them emerge.

Clicking clears the screen.

Colors visualize the phonemic structure of each word, and arcs connect equivalent phonemes.


Some early attempts at generating realistic human irises. Takes maybe five seconds to generate one blue iris right now. It's way too complicated, and needs to be thought over again from the ground up. Unfortunately, literature on iris development and anatomy is hard to come by.

Every Song

Plays every song as quickly as possible, using the 12 chromatic notes.

Binary Stacks

Stacking up binary numbers. Clicking at an x position determines the behavior.

An internal number is incremented using a user-defined value, and translated to a binary number. These numbers are stacked up, trying to maintain equally wide rows. Once you click an x position, the behavior is completely deterministic.

Tag Clustering

Tag similarity is visualized as spatial distance and color similarity, and frequency determines font size. Hit any key to reload. Select a beginning and end tag (which become highlighted red and green, respectively) to see the shortest path between them. Deselect by clicking again, or reselect the end by clicking a new tag. Tags come from old projects of mine I tagged. Distance from each tag to the three most significant and polarized tags determines RGB color. These three tags are found by taking the mode of multiple K-medoids runs for K = 3 using Dijkstra's algorithm as the distance metric.

Ring Ring

Space: improvise as conductor
Tab: everyone picks new musicians to watch
Left click: move musician
Right click: improvise as selected musician

You can also reassign who is watching whom by ctrl + left clicking or using the alphabet keys. For example, typing "a" then "w" will have the conductor listen to w, creating a loop. "a" then "a" will return the conductor to introversion.

Download and reroute to your favorite synth!

Life Fractal

Every point in a grid is mapped to a point in life-space (8x8 = 64 dimensional binary space) and run for a bit. Colors are generated to represent each game, with the intensity varying with respect to the number of cells alive. Lots of red means the game was fuller near the beginning than the end. More blue means the opposite.

Zoom varies between frames.

Life Attractor

Visualization of structure within the game of Life. The first top left point is mapped to the a game of life (an 8x8 = 64-dimension binary space) and run for a while. A color is returned representing its life cycle (red intensity for the amount of cells early in the game, green mid game, blue end game). The color is used to determine which game to pick for the next cell (top to bottom, left to right). Varying zooms are chosen.

Binned Strata

A mistake in computing distance while smoothing a curve for visualization leads to interesting results.


pppd is a highly formalized audiovisual composition built around the esoteric programming language p'' ("p prime prime"). During each brief scene, a random sequence of p'' code is generated and run, while the memory it uses is visualized and sonified. pppd is an artistic re-imagining of the otherwise academic field of computability theory. It functions simultaneously as an investigation of complex behavior emerging from formally simple systems, and as a playful exploration of computational dreams.

p'' is a subset of the programming language better known as Brainfuck.

DIY 3D Scanner

Some work towards a fast DIY 3D scanner. This sketch loads 18 640x480 jpgs and uses them to resolve the 3D coordinates of the scene. PeasyCam controls: left drag for rotate, right drag for zoom, both/middle for pan. More on <a href="">vimeo</a> and <a href="">flickr</a>.

Learn about structured light scanning, and contribute with your own work, on the <a href="">structured light wiki</a>.
followed by


Share Share Subscribe to sketches