About "mono no aware"
What is "mono no aware"?
Project Link: https://beta.artblocks.io/project/175
"mono no aware" is an animated generative art work built for Art Blocks (artblocks.io) that will be minted as a set of 1024 NFTs and sold in a dutch auction starting at 2pm CT on October 15, 2021. The piece is constructed from a cellular automaton (CA) that has some rules in common with Conway's Game of Life, but with some important differences that make it a little more dynamic (more on this below). Each animation begins with a seed configuration of "living" and "dead" cells that determines how the animation will progress.
About the Name
"mono no aware" is a Japanese phrase translated as something like "the pathos of things" or "the sigh of the world." It's a bittersweet feeling felt when appreciating something beautiful in life, knowing that it's temporary and will one day be gone. To go further, it may be that the beauty of the thing is in part because it will one day be gone.
I often feel this way when looking at flowers. They have their inherent appeal, for sure, but there's something about knowing they have bloomed for a brief time -- and having fulfilled their purpose, will soon fade away -- that gives me a deeper appreciation for them. I've also felt this deeply when standing on a shore looking up at the moon on a nice night, and thinking about how the moon and sand and water will still be there long after I'm gone. In that sense, we are the flower. Every beautiful thing in life, having served its function, eventually fades away. But it lived, and it had a purpose, and that's really worth appreciating. That's one of the best parts of what it is to be alive.
I chose this name for this project because I found myself feeling "mono no aware" when watching it. There is a sense of anticipation for the shapes you see to collide or for new ones to burst forth. Watching them, you begin to feel a sense of attachment, wondering what will become of them. Will they survive? In most cases, in time, they don't -- but something else takes their place. It's a continuum of causality, with each moment leading into the next.
Making Art with Cellular Automata
In many generative art pieces, elements are positioned on the canvas in some sort of composition. The properties of the elements may change from one random seed to another, and the elements themselves may change over time -- but a lot of care goes into the design of where and how the elements might appear.
There's a key difference when working with a chaotic system like CA, though. Any elements initially present -- the "starting state" -- usually don't last for very long. There are some stable elements (such as "gliders" -- see https://www.wikiwand.com/en/Glider_(Conway%27s_Life), but these are an exception. The main design elements, instead, are the symmetry of the CA state, and the behavior of the CA rules. Building a CA is an exercise in carefully fine-tuning its rules so that the emergent behavior is both stable and visually appealing.
The Rules of "mono no aware"
Starting Point -- The Rules of Game of Life
The starting place for my CA rules was the classic Game of Life. The rules of the game are simple, and are used to determine how one state of the grid is transformed to the next. For each cell, they're based on the value of the cell's neighbors, and are as follows:
1) Dead cells become living if they have exactly three neighbors (growth)
2) Living cells become dead if they have less than two neighbors (loneliness)
3) Living cells become dead if they have more than three neighbors (overcrowding)
4) Otherwise, dead cells stay dead, and living cells stay living (stability)
Game of Life may be a classic -- but unfortunately it's not a great ruleset choice for an endlessly running animation. Given a "soup" of randomly initialized cells, the algorithm eventually settles into "still lifes" that don't move, or "oscillators" that toggle back and forth between a couple of shapes.
Game of Life settles into stability after ~30 seconds. Not particularly exciting.
Disrupting Stability - Introducing "Bloom"
My challenge was to come up with a ruleset with the visual interest of GoL, but that perturbs "still lifes" and "oscillators" back into motion. To accomplish this, I added a new behavior to the algorithm that I call "bloom," driven by a new attribute for living cells -- "age". The additional rules are:
5) For each frame that a living cell remains stable, its age increases by one (age)
6) Dead cells become living if their neighbors' total age is greater than some number (bloom)
These additional rules ensure that "still life" patterns are disrupted. Sometimes this means they continue to grow and spread, and for others it means they die out. Most "oscillators" are also centered around some static living cells, and so are disrupted by bloom.
Is Anybody There? Avoiding Empty Sets with "Burst of Growth"
For seed states covering smaller areas of the grid, it's sometimes possible that the disruption of stability trends towards... emptiness. Especially with symmetrical seeds (more on this later). While I was okay with this scenario, since it shows that sometimes change is for the worse and things don't work out, it was a little more prevalent than I wanted. And, I liked the idea of a miraculous recovery. But what would a comeback from the brink of death look like? Enter the "Burst of Growth" variation of the ruleset -- a modification of existing rules:
Phase 1 - Burst of Growth
Change rule 3) to 3b) Living cells become dead if they have more than four neighbors (overcrowding)
This makes it harder for cells to die, and tips the balance of the CA into uncontrolled growth that allows even small areas of life to spread over the grid. So far, so good. But a full canvas isn't particular exciting, either. Now that we're here, things need to be trimmed back a bit.
Phase 2 - Decay
Change rule 3b) to 3c) Living cells become dead if they have more than two neighbors (overcrowding)
This rule change quickly culls dense areas. Left unchecked, it will kill everything. It only runs for a couple of frames to get things back to a sensible place.
Finally, Phase 3 is another Burst of Growth. I'll note that this rule change adjusts the character of the animation substantially. While the default ruleset is fairly "organic," the Burst of Growth ruleset looks a lot more synthetic -- more like a circuitboard. I find the contrast appealing.
An example of phase 1 of the "burst of growth" trait in action.
The Topology of "mono no aware"
The animation grid is displayed on the screen as a square with well-defined edges -- but since the neighbors for a cell are a critical component of the algorithm, and changing even a single cell from symmetry will drive the entire animation into chaos, the treatment for those edges is really important. There are a few variations on how this is handled, each with their own character. Visually, they're easiest to identify when a glider crosses an edge.
The "bounded" trait treats the grid as a bounded square, where the edge of the square is the edge of the world. Cells in corners have only three neighbors. Cells on edges have only five neighbors. The edges tend to be mostly empty, since it's easier for living cells to die of "loneliness."
Bounded with Edge Generator trait
Like "bounded," except with some enforced living squares along the edges that break the trend towards loneliness. You may see waves of life radiating from the edges.
Uses cyclical indexing to connect the left side to the right (like rolling the square into a tube) and the top to the bottom (connecting the edges of the tube into a donut-shaped torus). All cells have exactly nine neighbors, so there is no difference in behavior between the center, edges, and corners.
Similar to "torroidal" with two sides wrapped around to form a cylinder. But the remaining two sides are flipped before being connected. This is higher-dimensional analogue of the Möbius strip that can only be connected without self-intersection in four dimensions.
Real Projective Plane
Similar to "klein" but with both sides flipped. This one is really mind-blowing -- it's a one-sided surface that can't be embedded in three-dimensional space at all. If you could glue the single side of a Möbius strip to itself without intersection, it would look like this.
The colors for "mono no aware" are RGB, and based on a few factors (besides, of course, the token seed):
- Frames elapsed (helps make animation more engaging as it evolves)
- Age (helps see when an area is about to bloom)
- Age of neighbors (helps see when an area is about to bloom)
- Time since death (adds a sense of continuity. See fade, below)
To ensure smooth changes, the RGB colors of living or fading cells are driven by independent trig functions (like sin) parameterized with values from the token seed, as well as the count of elapsed frames multiplied by coprime factors. The coprime factors help prevent the colors from developing a rapid "beat frequency" or repetition. I've prepared a visualization below showing how independent R/G/B values driven by sin functions and coprime arguments can be used to create continuous, fluctuating color. This is the same math that drives the colors in "mono no aware."
The diversity of colors in a single piece and how rapidly they change varies from high to low, for both living cells and their trails. At the extremes, these are described as "subtle" or "radiant."
An example of "radiant" life colors.
An example of "subtle" life colors.
As the animation progresses, a decision has to be made: should the canvas be totally erased before drawing the next frame? Or should that frame be overlaid on what's already there? And if so, how much of the existing image should bleed through? These considerations form a set of traits referred to as "blur."
"dreamy" blur, where each frame fades very gradually into the next
"off" blur, where each frame is totally independent from the one before. Also has "slow" fade (see below)
When a cell dies, should it immediately be drawn as black? Or should it transition through a series of colors that shows "where life has been?" Whether this happens, how long the trail of colors persists, and how dynamic they are is a set of traits known as "fade" that add visual interest and keep edges/contrast from being too extreme.
An example of "fast" fade -- barely any trails are visible.
An important property of this work is symmetry. Since there is a causal relationship between neighboring cells, the state of one cell causes changes to the surrounding grid that ripples outward over time, like a stone thrown into a pond. Even a single cell deviating from symmetry is enough to eventually throw the entire animation into chaos.
Seeds come in a variety of symmetries. Some are bilaterally symmetrical (either horizontal, vertical, diagonal, or all of these). Some have radial symmetry, like a pinwheel. Some have no symmetry at all.
Some start with a symmetrical configuration of living cells that have an asymmetric relationship to the space they're in -- so they start out looking orderly, and devolve into chaos. Consider, for example, the difference between a stone dropped exactly in the center of a perfectly round pond -- which would maintain perfect symmetry -- and a stone dropped nearer to the edge. The ripples may have symmetry at first, but asymmetric reflections from boundaries become chaotic.
For many of the traits, there is not a strict 1:1 correspondence to a given symmetry. In many cases, this is an emergent property of more subtle, hidden traits.
The piece comes with a few basic controls. Clicking the canvas will restart the animation from the beginning, so the brief starting state in the first few seconds can be better appreciated if desired.
The left and right arrows adjust the "level of detail" (LoD) -- the number of squares in the grid. Depending on how powerful the viewer's computer is, the animation may be taxing. Lowering the LoD improves the frame rate, at the expense of complexity. The highest available LoD is very slow on most machines -- but may be pretty interesting to leave overnight, or on the computers of 10-20 years from now!
Note that changing the LoD will change the behavior of the animation. It may begin with the same starting state (or in some cases a slightly different one), but the chaotic, resonant nature of CA means that a different grid size will result in different behavior. This is analogous to the behavior of guitar string -- the exact same pluck of a string in the exact same position eventually results in a different note based on which fret the string is held on. The different size of the string changes the way the vibration interferes with itself. This may be a good or bad thing, depending on the animation -- but worth keeping in mind.
There are no controls to pause or save a frame from the animation. I went back and forth on this, but ultimately decided the feeling of embracing and appreciating change is such a core part of the piece that it felt wrong to stop time. While I admit some of the individual frames are appealing, my intent was for this to be viewed as an animation.
Once the project concludes, I'll be following up with some more posts talking about the process of creating "mono no aware," and doing a deeper dive into some of the interesting mints and what makes them tick.