About 'correspondence'


My latest work correspondence is an audiovisual kaleidoscopic animation where layers of mathematical shapes and textures respond to music. My central goal was to provide an endlessly changing experience that provides an abstract narrative -- a feeling that something is happening, anticipation of what's next, the notion that it's all somehow connected.
For this work, I've collaborated with Snack Master (John Bowman), who composed the music and gave feedback as it came together with the animation. This has been a really fun collaboration, and we're excited to share it! First at Art Blocks' Marfa Weekend 2026, at the Artist Fair -- and soon as an Art Blocks Studio release / Bandcamp album release.
This is one of the more complex and long-running projects I've worked on -- so there were a number of goals for the work. Some of them include:
Kaleidoscopic rendering -- calculating one section of the screen, and reusing it for improved performance and exact symmetry
Improved composition -- outputs that read less as texture, and feel more intentional/composed
New and more performant techniques with cellular automata (CA), while not centering CA in the work
Integration of music with generative elements, that still feels pleasant and musical
Enhanced interactive controls that allow exploration of outputs and the algorithm as a whole
Improved emergent diversity -- ensuring each output feels like it has its own story to tell, while still feeling like a cohesive work. Giving the work nuance so it feels "lived-in"
Making use of my newly-built animation framework.
Read on to learn more about the work and how it was created
The Algorithm
Choosing an output
Visual Modes
Each output begins by choosing from one of the five "visual modes" that determine the style of the animation:
Automata - a field of cellular automata, perturbed by miscellaneous shapes
Equalizer - a series of vertical bars associated with different frequency ranges from the accompanying music
Mycelium - organic growth mimicking the growth of mycelial threads
Ripples - stacked shapes that spread outwards from their creation point like ripples
Voronoi - shifting voronoi diagrams
Each of these comes with a variety of additional characteristics to select from that change the behavior and appearance of the visual mode.

Kaleidoscopic Rendering
A symmetry for kaleidoscopic reflection is chosen. Often, this is no reflection at all -- just allowing the animation to play out in its pure form. Commonly, there may be 2-6 "wedges" in the output. Occasionally, there are 7-20, giving more of a pinwheel feel. Wedges either mirror each other, or are rotated copies. Only one wedge is calculated -- and then the pixels are directly copied to the other wedges for the frame.
Music
The music in correspondence combines a selection of track (the song), voice (the instruments), transposition (choice of key), and tempo. One of the thirteen tracks in the work is selected. Then, a compatible voice/transposition/tempo are selected.
Rendering Style
Choices are made about the sizing of the pixels in the work, their styling, and how much they fade between frames. In some outputs, cells are blended with their neighbors, or overlap with them. All outputs are scale- and aspect-ratio agnostic, but they do take on different characteristics at different scales.
The Music of correspondence
Tracks
The music for correspondence is an interpretation of music composed/created by John. I say interpretation, because our process for creating the tracks was as follows:
John created MIDI files for each track, and sent them to me
I created an algorithm for processing the MIDI files into a typescript file where musical information was stored as data
The processor also analyzed each track for its key, moments of "emotional impact" where pitch/volume/tempo changed dramatically, "minor/major" notes based on volume, and bucketed the notes into frequency ranges.
While each track was constructed using John's MIDI files as input, each bears the signature of the processing algorithm that converted it. At the time of playback, notes are shifted into a new key using an algorithm with its own quirks. Tempo is usually altered from the 108 BPM the original music was recorded at. The voices used are totally different from the instruments used for the originals. So the resulting music is no longer certain to align with John's intent, but is rather like a new shadow or perspective on it.
The input MIDI files for this process carried rich information on timing and amplitude, as they were recorded from real hands on a real keyboard. I feel that some of this nuance carried into the finished work, giving it a human/polished quality even after key/timing/instrument changes, which I find satisfying.

Voices
correspondence has eight "voices" -- packages of instruments and logic that determine how a track is mapped to sound. Each is like its own program, making decisions about how to bucket notes into frequency ranges, and how to play the notes using its set of instruments. The voices are:
piano - a sampled grand piano in a small room, respecting the recorded note durations
square pad
bass: square wave / low pass / chorus / large room
mid: sine waves
treble: triangle pad / chorus / reverb -- note durations doubled
fm synth - more of an '80s synth sound
sub-bass: sine wave
bass: triangle wave / sine modulation / small room
mid: fm synth / chorus
treble: fm synth / echo / large room
forest - less musical, more nature sounds
bass: fm synth / wood creaks / brown noise water w/reverb
mid: leaf rustle / insect noise / pink noise animal sounds
high: fm bird chirps / white noise wind w/echo / wind pad / flute
warm analog - early '90s ambient, warm and rounded
bass: triangle / low pass filter
mid: sine wave / reverb
treble: triangle wave / amplitude modulation / low pass filter / large room + sine pad
vaporwave - slow and degraded -- note duration extended
bass: fm synth / tape wow / cassette filter / chorus / large room
mid: detuned triangle+sine pad / 8-bit crusher
lead: fm synth / pitched down / wow+flutter / large room
electric guitar - electric string instruments with some sine pads/drone
bass: electric bass / chorus / small room
mid: nylon-string guitar / light chorus+reverb+echo
treble: sine pad / large room / extended duration
strings - string instrument samples with compression/saturation/vinyl artifacts
bass: cello
mid: contrabass
treble: violin
Auditioning / Filtering
Roughly speaking, there are 13 tracks x 7 voices x 12 transpositions x 3 tempo buckets (80/108/140 BPM) = 3276 combinations. As part of the creation process, I auditioned all of these combinations to filter out the ones that didn't sound "right" to create an allowlist of combinations. Due to the way the voices work, there might be some combinations of transposition and track and voice that are unpleasant. Some examples:
a track might be transposed in such a way that most of its notes fall into the "mid" range, but just one or two fall into the "treble" range, resulting in an "out of nowhere" violin note or shrill synth.
A track transposed to low piano notes at high tempo might result in a "wall of noise" that is uncomfortable.

I tried to balance this filtering by removing anything that sounded dissonant/wrong/unintentional, while leaving outputs that were merely uncomfortable/weird included. I wanted to have combinations in a spectrum between "this sounds great" and "this sounds kind of odd" to allow diverse perspective on the underlying music, and room for reflection on whether the listener feels different combinations are interesting or surprising.
This was a very time-consuming process, since it takes listening to the track for ~30 seconds to at least get a feel for it and whether a dissonant note will come up later. This means roughly 1600 minutes (27 hours) of listening time. I was able to reduce this some by creating a voting harness to help me quickly audition pieces and record the verdict, but it still took many days. I think this curation helped a lot to ensure the quality of the outputs, while still ensuring good diversity in the resulting work.
Interacting with Animation
In general, the relationship between animation and audio is that they are independent processes, where the audio influences the animation. It is less the case that the animation "visualizes" the audio -- though the equalizer visual mode is something of an exception.
As the music plays, each note carries some additional information available to the animation:
is it a major/minor impact?
does it carry some greater emotional significance to the song?
what note is it?
is it a base/mid/treble note?
note duration
Depending on the visual mode, this information may cause specific effects: moving an equalizer bar, creating ripples, triggering mycelial growth, reconfiguring a voronoi diagram, etc. There are countless bespoke interactions between the notes and the visual mode algorithms, which give them emergent behaviors as they interact with different songs. Across all modes, it may cause color palettes to shift, or textures to change.
The frame rate for the animation and the pace of change in textures are connected to the tempo for an output, so that the animation "marches to the beat of the drum" for the music.

Colors
Each "palette" is sort of like its own little program, so there is some diversity in how they manifest. Each starts with a list of CMYK colors, some of which may be included only in some outputs. Depending on the palette, black may be inserted into the list in one or more spots. Then the palette is interpolated to create a spectrum of colors -- which may be smooth or coarse depending on the hash.
At runtime, the animation assigns a value to each cell of the canvas. This might be related to health of cellular automata textures, gradients showing distance from structures in the animation, recent audio, overlapping a visual element, etc. The value selected for the cell determines which color is pulled from the prepared color spectrum. Over time, how the colors are pulled may shift, creating gradual changes to how the palette manifests.
Depending on the animation parameters, cells may be drawn on top of each other, or may layer on top of earlier frames -- both of which blend the colors in the palette together. The resulting colors are an emergent property of the visual mode's behavior, the blur level of the output, and the chosen spectrum -- so there are very diverse ways that color can manifest in correspondence.
Interactive Controls
The interactive controls in correspondence were a late addition to the work, but are a pretty standard part of my presentation. In thinking of how I'd like to present it as a live activation at Art Blocks' annual artist fair in Marfa, TX (2026), I'd landed on including a couple of Intech Studio Grid MIDI controllers for an audience to control the audiovisual experience. MIDI control is something I'd experimented with before, so I knew it could work, but this was my first actual implementation.
To provide a good experience for MIDI control, I wanted an interface on the screen that could show what was actually being controlled on the board. After building one to match the appearance of my boards, I was satisfied with the result -- but I couldn't imagine not making this experience available to viewers with a mouse and keyboard.

Once I'd seen how satisfying it was to be able to tune the animation this way, I began thinking about how great it would be to capture the experience of watching it change without needing to control that. The existing menu provided enough surface area to add a Drift mode that allows parameters to gradually and randomly change.
This drift was something I'd explored to some extent with time-based mechanics in because unless until, but at a longer timescale. In correspondence, the time scale is shorter and tunable -- allowing the viewer to treat their hash as a jumping off point for an exploration of the entire generative algorithm. I really love this intersection of output and algorithm, state and system, which I feel is one of the central tensions in generative art. Each drift through the algorithm is non-deterministic, so it's never twice the same journey -- a feature I'm carrying forward from because unless until.

There's also an option to abruptly jump to a new hash on an interval, which is an option I wanted available for the activation -- but which I think is also a really great option for long-term viewing for the audience. This is something I explored with the Implications Infinite companion to my Implications project, each one an out-of-bounds (OOB) generator for the Implications algorithm -- except I would use a browser plugin to put it on a timer, instead. Now, that experience has been brought into the work itself.
I appreciate that what have become some of my favorite features in this work -- interactive control, drifting through the parameter space, new hashes on a timer -- were mostly driven/informed by the desire to support a live activation. This was an emergent part of the creation process that I feel has greatly contributed to the final result.
Process
Creating correspondence was a two-year process following a year of sketching and technical work on the underlying framework. I began work on the project that would become correspondence in January 2025, and am finishing it in October 2026. A lot has happened in that time that I'll cover in a future article, but I'd like to give a rough overview of the process involved.
Phase 1 (1/25 - 8/25): Technical / Conceptual Foundation
The first phase involved technical work to rebuild the engine I use for cellular automata (CA) to be more performant. In earlier works, I'd had automata where each cell can change based on neighbors up to two spaces away -- but in this work, CA can consider neighbors up to seven spaces away. I developed a new technique with "continuous CA" where each cell can have real values from 0-1, and rules are calculations across the weighted values of neighbors. I built a harness for rapidly classifying random rules based on their visual appeal.
During this phase I also developed a technique for kaleidoscopic rendering, where one section of the screen is drawn and then copied. This came with interesting challenges on correctness and performance. And I reworked my coloring algorithms to be more appealing / diverse. And I started with some visual modes for automata, ripples, and equalizer.

This phase ended roughly during a week at the beach with my family, where I worked from an older laptop and spent some time aggressively optimizing performance to be acceptable for older devices -- making sure the core was strong.
Phase 2 (8/25 - 3/26) Audio Work, Collaboration, and Animation work
Until this point, including music in the work was a potential idea, but not a certainty. Working with audio was something I'd experimented with, but generative audio/music is challenging, and composing music is not something I have a ton of practice with. Another idea I'd had was to try a collaborating with another artist on the music for a work -- and this is the direction I went.
I reached out to John -- a friend I've known for many years, who both works in visual media and is a prolific musician -- and raised the idea of working together. We'd had a few conversations over the years on what a generative audiovisual collaboration might look like. I sent him my in-progress animation, and pitched having him compose some music that would somehow interact with the animation.
Some of the challenges we faced were:
Would it be difficult to integrate music without it feeling "bolted on"?
How would we get the music into the program?
Aligning two solo practices in a single work
We addressed these challenges mostly through a number of back-and-forth exchanges over email. Once he'd sent me some initial MIDI compositions to test with, I was able to build a working prototype demonstrating playback and having the animation react to sound. From there, John was able to sit with the randomized generative outputs on his screen, composing and recording tracks that I was able to integrate into the work.
There was this sort of back-and-forth; I would sit with the work and improve the animations while I listened to the music. I'd refine the music while I watched the animations. I'd send John the latest, and he'd compose a couple more tracks. I'd add those, and repeat. The work's name correspondence acknowledges this exchange and iteration as a core component (as well as the relationship between music and animation, one mirrored section to another).
For most of the compositions, John did not at the time know which voices, filters, or transpositions would be used to present them. I was building voices and audiovisual reactions before I had heard most of the tracks. So we had to have a sort of trust that our pieces were going to come together in a satisfying way. With some time and integration and polish, they've come together now in this work.
Phase 3 (3/26 - 10/26) Interactivity and Refinement
With the core in place, I continued to add new variations of visual output and smooth out rough edges. I find the tail end of a generative art project usually involves a lot of boots-on-the-ground time looking at random hashes, finding ones that don't work, and figuring out why. To help with this, I built a harness using a headless browser to generate random hashes and automatically flag low-quality (e.g. empty, noisy, etc.) ones for review. Another harness helped me to quickly audition different audio combinations and sort them into keep/remove.
At this point I had an idea that I'd like to finish the work roughly in fall of 2026, which lined up nicely with Art Blocks' Marfa Weekend '26 -- so I applied to participate in the Artist Fair. To make it more interactive and fun for a live audience, I thought MIDI controls for controlling the animation and audio could be interesting, and had a couple of Intech Studio Grid boards to play with.
As I built out the controls, I felt it was important to have a visual interface to see which features were being controlled, so I added a control menu to show this (I usually include these types of menus in my work, but had resisted adding one to this point). Once I saw it working, and how fun it was to play with, I felt it needed to support mouse/keyboard controls so that anyone could use it -- not just those with MIDI boards.

Moving through the parameter space using the controls was fascinating and brought a new dimension to the work, but I was also thinking about parts of the audience that might prefer to just watch some of these changes without needing to control them. This led me to adding a drift mode, where features get random automatic adjustments on a tunable cadence. This type of wander through the parameter space of the algorithm is a fascinating bridge between the individual editions and the overall algorithm, and ended up becoming (unexpectedly) one of my favorite features of the work.
For a live audience, I also added the ability to switch to new random hashes on a timer. I hadn't initially envisioned adding this (or the drift) to the work outside of the activation, but in time it began to feel so exciting and integral that I needed to keep it in the final work. Presenting an endlessly changing animated generative experience that people enjoy watching for a while or coming back to is a goal I aspire to, and this feature set aligned really well with that.
Activation and Release
For my activation at the Artist Fair, I'll be presenting the work on a 5'x5' rear projection screen. I have a couple of pairs of noise-canceling headphones I'll make available so that a couple of people can have a focused experience even in a crowded exhibition hall. Two MIDI boards will be available on a nearby table for controlling the art.

I'm envisioning some people using the MIDI boards, and others trying out the drift and randomized seed features. I'm curious how people will feel about listening to the music with a friend, or with a stranger. Will they play with the interactive features together, or "wait their turn" to try it? How will they feel about essentially performing for a stranger, using MIDI boards to control an experience someone else is trying to enjoy? What would it be like, as the creator of this work, to listen with people as they're experiencing the work for the first time? What will it be like to experience this together with noise cancellation, where it's difficult to speak to one another?
I've also built something of a harness around the work to present it, which allows for saving hashes of interest so that they (or others) can replay them later. It puts control for selecting the thumbnail into the hands of the user, capturing a snapshot when they press Like (or settable at any time). Will the audience make use of this feature to capture some of their favorite moments during the activation? How might a remote audience participate in this process, adding new favorites that may appear during the activation?

I'm planning to release this work on Art Blocks Studio shortly after the Artist Fair -- release date / edition size / pricing coming soon. A concurrent Snack Master album release with the original compositions used to create correspondence will be announced shortly. I'm excited for this, since I think it really rounds out the story of how this work came to be, and provides a purer look at John's solo practice that directly ties into it.
I also plan to continue building out the site where the work is living now to experiment with some new (to me) features for community curation and exploration of the algorithm. This is something I've been interested to try for a long time, so really looking forward to it.
I can't wait to share correspondence with you, whether in Marfa or online!

Comments