About "because unless until"
Updated: Sep 18
Project Link: because unless until on Art Blocks Curated
Release Date: October 11, 2023
because unless until is a work that explores the relationship between the flow of time and the weave of cyclic changes, seen through the lens of shifting mathematical shapes and textures. It's a generative "system of systems," where each output is a generative system driven by the current date. Events synchronized across outputs encourage exploration and discussion of the series.
Visually, it uses a pixelated style that makes me nostalgic for the sprite-based graphics of NES and Super Nintendo games I grew up with -- and invites comparisons between the discrete pixels and textures of evolving cellular automata (CA), and the larger-scale shapes moving through each animation. Where do the cells stop, and the shapes begin? Changes to the degree of pixelation with each day encourages a deeper investigation of this question.
Sensuous, fluid motion, color gradients, and gradual change bring a relaxing energy to the work. At times, the canvas may gradually empty and quiet, before new waves of texture burst forth. The complexity of the system allows a large number of emergent textures -- like clouds, repeating patterns, and irregular structures.
The animations in because unless until are driven by a number of mathematical systems: fractals, polar inversions, spirals, regular and irregular polygons; even CA (at a much larger scale than those used for textures). These too have emergent characteristics -- especially when stacked: branching treelike structures, complex spirals, mazes, stripes, grids, and even moiré.
A "Swirl" animation demonstrating emergent moiré patterns
In this work, I'm revisiting some of my earlier techniques from a prolific period between 2010-11, where I was using them to make static art. During the project's development, I built a Deca gallery for my 100 Days of Ixnay collection containing work from that period, which served as a significant source of inspiration.
Word by word, the name references: "because" -- similar to Implications, referring to a system based on rules; "unless" -- in reference to the stacked animations that each alter the section of the output where they lie; and "until," referring to the open-ended nature of each animation, and of the series over time.
The name consists solely of conjunctions normally associated with another word or phrase, which I'm hoping will leave gaps in the reader's imagination that they're working to fill in as they view the art. Because what? Unless what? Until when?
Altogether, the name starts out sounding like a phrase -- "because unless" -- but a series of conjunctions alone can't be taken as a whole; "because unless until" doesn't make sense as a phrase. My hope is that reading it will create a moment of confusion, encouraging the reader to stop and think more deeply about what it means.
I had a number of goals for this work -- relating to its concept, the current social and technical context it's placed in, and improvements to my craft.
A Feeling of Discovery
A common thread in my recent animated work is the use of chaotic systems like CA that endlessly evolve in unpredictable ways. The sense that you're discovering something new as you watch feels compelling to me. Unfortunately, some of the allure is lost after you've seen the same animation many times. I wanted to make use of time-based mechanics, so that each day could bring something new, preserving the novelty.
Fractals and CA, endlessly evolving. But what might they look like tomorrow?
Different Views over Time
I've always found it interesting that the ideas of "here" and "now" are relative to your perspective. Is "here" where you're sitting as you read this? Your house? Your town? Your country? The Earth? Our solar system, or galaxy? Is "now" the moment you read this word? Is it the hour? Today? This month or year? A lifetime? The blip in geological history where humans have existed that had written words to read?
Sometimes when I'm out for a walk, I look at the trees and try to picture them not in the "now of today," but instead in the "now of their existence." If you can imagine a seed growing into a sapling, a small tree, one that towers, and finally, its collapse into rotting logs and twigs that feed the forest -- and in your mind's eye see it happening over the course of a minute -- is that perspective any less real?
The world we live in is inseparable from change. Nothing lasts forever. But much of art (including my own) is fixed, eternal, and divorced from the flow of time -- especially when embedded in the blockchain, which by design freezes content at the point of upload. A central goal for this work was to represent the flow of time, and its relationship with change.
Representing Concepts from Long Form Generative (LFG) Art
I've heard it said (and wholeheartedly agree) that in a generative [algorithmic] system "the algorithm is the art." There's a tension between the abstraction of the system and the specific details of its outputs, as to which is actually "the art." I wanted to explore this tension by encapsulating a generative system in each output, so that both concepts could play an active role in each token.
With Implications, I examined that balance with the Implications Infinite companion collection, where each token was an "out-of-bounds generator" (OOB) capable of generating random outputs from the Implications algorithm. In because unless until, each output is itself a generative system driven by the passage of time -- abstract over time, but concrete on any given day.
Alignment with Web3 Context
I believe community -- namely the discussion of and participation in projects by an audience -- plays a central role in our shared appreciation and understanding of blockchain-based LFG art. I wanted some of the time-based mechanics in because unless until to be synchronized across the series, to encourage discussion and of some (or all) outputs at certain times.
This series also mirrors the excitement of minting mechanisms in common use for LFG art, with some time-based mechanics that have unpredictable results (they might be great -- or less so). I'd like people to be curious about "what will it do?" at certain points in time, aligning with my goal of enshrining the feeling of discovery.
Animated art currently (and, sure, probably since its inception) faces unique display constraints that are a challenge for both artists and collectors to navigate -- some of which I've previously discussed on Art Blocks' Minters & Makers podcast. It was very important to me to address these challenges with my work.
The first of these is satisfying performance. Maintaining smooth animation while doing continuous, intense computation is difficult, and required a lot of optimization and design in the algorithm. Some artists approach this via the use of shaders and other techniques that make use of a GPU to provide acceleration, often to great effect; but besides not being my forte, this doesn't help much if you have a weak/integrated GPU. My [then] top-of-the-line 2019 MacBook Pro sometimes verges on self-destructing into a pool of molten slag when viewing projects described as "GPU-intensive" as they crawl along at 1 fps. What about all the people out there who don't have access to powerful computers? I wanted them to be able to enjoy this art at 4K resolution, so I kept my focus to CPU-driven multithreading, which feels a little more accessible to me.
Another challenge is the lack of 1:1 aspect ratio displays for square art like mono no aware or Implications. They exist, but they're extremely expensive, and don't have much utility beyond displaying square art. I wanted to use a default 16:9 aspect ratio that works with the screens people have -- like televisions, and computer monitors. Interactive controls allow display at a variety of aspect ratios (including responsive) so that people can enjoy the series where they are. Relaxing my constraints on symmetry was helpful here.
Fear not -- 1:1 aspect ratios (or whichever your screen uses) are available
Improvement of Artistic Practice
Every artwork or project is an opportunity for learning and growth, and there were a number of these I focused on with this work.
One concept central in my mind during development was that of "bringing forward" elements of my practice to play a more central role in the series. Whereas in previous projects, "Detail Level" was an interactive control for users to play with, it's now a core time-based mechanic that plays a more prominent role in the presentation. The sidecar OOB generator has been embedded, with each output its own system. The interactive menu is necessary for displaying current time-based features, rather than merely helpful. Technically speaking, multi-threading isn't used for a specific calculation, but was redesigned to be useful for a wide variety of them.
In parallel to "bringing forward" was the concept of "pushing back" -- making aspects of my art less of a focus. My intent is that work is less about CA than it merely uses CA (in contrast to earlier work). I've dropped my focus on symmetry. I've decreased the number of exposed features (while increasing diversity) to emphasize features that are more interesting to focus on.
While this work is less about CA, I also wanted to deepen my expertise with CA by exploring new techniques, adding more diverse behavior, and improving performance. CA are a really rich and interesting space to investigate -- near and dear to my heart -- so I devoted a lot of effort to this.
I entered the world of algorithmic art through the computer science door, so to speak (rather than through the art door). As a result, my understanding of color is a weak point for me. Improved color relative to my previous work was a central focus. I did some actual book-reading, Genuary-hacking research before starting on this work, and developed some new techniques to help manage colors. This was my first time using the CMYK color space, which I've really enjoyed.
This series contains 8 "animation sets" (described in features as Animation). One is selected for each output, and it's the most impactful feature, since it decides which shapes and textures will appear. Each has a primary focus on a particular animation, but in most cases also contains a number of "subanimations" that complement the primary animation. The animation set is responsible for coordinating all of the animations it contains, and blending them together (in a way specific to the set) for rendering.
Most of the animations appear in more than one set, so there's a fair amount of overlap between them. But each has its own characteristics, described below.
SubAnimations: Warp, Intersect, Auto
This animation set focuses on the Invert polar inversion animation. There are always two copies of the animation included, which usually have most of their properties synced. A couple -- like placement relative to the center of the screen or speed of movement -- are varied, allowing for a complex interaction between the two that look like magnetic field lines. Sometimes, the animations are stacked, and look like a single inversion with complex behavior. Occasionally, the animations aren't synced at all, giving a wide range of appearances.
Invert animation set with Intersect subanimation
SubAnimations: Swirl, Invert, Julia, Diamond, Intersect
This animation set is focused around the Warp polar inversion animation, which true to its name, warps a polar inversion (or sometimes a spiral) in a variety of ways depending on output. Stripes gradually move in and out of the inversion point(s), giving a "breathing" character, as the inversion changes shape. When paired with a Swirl or Invert animation, may show complex intersections or moiré. Rapid movements may leave trails.
Warp animation set with Swirl subanimation, showing moiré
This set focuses on a pair of Swirl animations -- mostly synced, with a couple of randomly chosen variables altered for one member of the pair. Like Invert, has a breathing behavior, and shows interesting patterns where the animations intersect. The "cleanest" of the polar inversion animations, with a predictable movement and appearance. Probably the set that generates moiré most often.
Swirl animation set
This set includes 3-4 stacked Julia animations, each showing a Julia set. Hidden features determine if each animation chooses regions based on iterations until bailout, or displays isolines. The input point for the Julia set may be chosen from a list of hand-selected presets, or may be an arbitrary point chosen along the boundary of the Mandelbrot set's main cardioid bulb or period-2 bulb.
Sometimes, the animations zoom or rotate. Complex intersecting fractal shapes can get busy, but often leave large open areas to fill with texture.
Julia animation set demonstrating isolines
SubAnimations: Mandelbrot, Julia, Invert, Intersect
Usually contains 3 Scan animations, but may include just 1 or 2. For subanimations, includes either: Julia and Mandelbrot, Invert, or Intersect animations. The animation is an extremely zoomed-in polar inversion, which looks like gradually rotating stripes that may show mild curvature. When multiple copies appear, their intersections may take on the appearance of diamonds, squares, or other quadrilaterals.
The stripes gradually move across the screen, which is where this animation gets its name. The stripes may be spaced close together, or may be so large that only one is on the screen at a time.
Scan animation set, showing characteristic sweeping behavior across fractal subanimations
3-6 Auto animations stacked on top of each other. Each animation contains a maze-like CA with one of several rulesets, which is used to divide the canvas into regions. Each CA may have different cell sizes relative to the canvas, which yields a variety of differently-shaped pieces as they intersect. The time between state changes varies by animation, which causes intermittent shifts in the composition.
Stack animation set
SubAnimations: Mandelbrot, Julia, Swirl, Diamond
A single Auto animation, with 1-4 subanimations (of either Mandelbrot, Julia, Swirl, or Diamond -- only one type is used for each output). The blocky shapes of the maze-like CA peek out from between organic-looking fractals and curves. Probably the most prominent use of Diamond, which only appears as a subanimation. A diamond appears as a point in the center of the screen, before growing to roughly the size of the canvas, and pausing for a while. Eventually, it splits into two diamonds that slide across the canvas and disappear.
Auto animation set with fractal subanimations
SubAnimations: Mandelbrot, Julia, Swirl, Auto, Linear
Features four copies of the Intersect animation -- which draw regular or irregular polygons with 3-6 sides -- sometimes rotating. They use Brownian motion to wander around, but changes to their velocity are weighted towards the center of the canvas, causing the polygons to swarm loosely around it. In blurrier outputs, the edges of the polygons are barely visible, giving them a dreamy appearance and sometimes leaving trails.
This is the only appearance of the Linear animation -- a heavily warped polar inversion that sometimes shows rapid motion, and very small vertical/horizontal stripes that blur the lines between shape and texture.
Intersect animation set with Swirl subanimation
The first type of time-based mechanic in because unless until involves cyclic changes. These are aspects of the output that change at the start of each day, and repeat on a weekly/monthly schedule; or change each month, and repeat on a yearly schedule. These cycles illustrate what I'm thinking of when I mention "the weave of time," since their alignment gives a new effect with each combination. Some examples demonstrating what I mean: every Friday the 13th has traits in common for an output; every Monday in May, too; holidays falling on a specific month and day like Halloween (October 31) have characteristics that repeat.
Weekly Cycle, Daily Change: Coloring Mode
Each day, the coloring mode used for each region of the animation changes, slightly shifting the colors and textures used. Each week, the same modes are used for each day of the week in the same order, in a cycle that repeats. The effect is generally pretty subtle, but for certain CA/palette combinations, may be a little more noticeable.
I wanted to have at least one time-based mechanic that had a low impact on the output, so the viewer might have a slightly different experience without being able to put their finger on what's changed. They might ask "how is this different today?" -- or for more noticeable changes "the colors look different today -- something has changed." Many aspects of our world change almost imperceptibly from day to day, and you'd have to look really closely to see them. I wanted to achieve a similar effect here.
Two videos of the same animation, with different coloring modes enabled. Note the different coloration of the lines in the background, and on the edges of the solid-colored areas.
Monthly Cycle, Daily Change: Detail Level
Each day, the detail level used for the animation changes, changing the number of cells and the balance of textures and shape. On low detail days, the output is blockier, and individual cells and their behaviors are easier to see. On high detail days, the CA look more like textures or patterns, and the emphasis is more on the shapes of the animation. Since the ordering of detail levels is randomly selected for the output, subsequent days may have a similar appearance, or may look very different.
Each month, all 31 detail levels are used in an order specific to each output. Every month, the same detail levels are used for the same day of each month in the same order, in a cycle that repeats.
An output seen at its lowest and highest detail levels
Yearly Cycle, Monthly Change: Animation Traits
While many variables in the algorithm remain fixed to provide an output its identity (in the sense of hypokeimenon), the shapes and behaviors for the output's animations are malleable. Each month, the random seed for the algorithm is changed just before the animations are created, giving them a new appearance. The appearance may be similar to the month before, or it might look very different. Every year, the same animation appearance is used for the same month of the year in the same order, in a cycle that repeats. What sorts of changes are available varies by the output, and according to its chosen animation set.
Two outputs seen in different months, showing the sort of changes that might be expected monthly
While I consider the ongoing daily and monthly cyclic changes to the output the most integral time-based mechanics for the series, I wanted to include some more dramatic changes that occur only occasionally.
The first category of these are features that may be present in some outputs on a particular day of the week. Each output has a chance to have each of these features (and all outputs have at least one). For many of us, the weekly cycle of our lives is one of the most prominent. It's interesting to think about how an output that punctuates each week with an event can fit into our weekly cycle. How does the choice of day for each feature affect our perception of it? Do psychedelic color changes have a different impact on a Friday than they would on a Tuesday? Will you even notice art that changes on a Saturday, if you're never there to see it?
How does it affect our perception of an output if it includes just one of these weekly events? Or if it includes five? If an output has dramatic changes on most days, is that exciting, or does it feel distracting? I hope that this mechanic will naturally drive interest in exploring different parts of the series throughout the week, as people look to see how these features manifest.
Yearly Events (Holidays)
The second category of special days are holidays that occur once each year. There are two of these: Glitchmas, a holiday that occurs on the same day for all outputs and falls on a different day each year; and Fiesta Day, a holiday that is randomly selected for each output, and falls on the same day each year (more details on these below).
The annual cycle is critically important to everything living on Earth, people included. Each year is another paragraph in the story of our lives, punctuated by holidays. They're waypoints for us -- the source of many happy memories, something to look forward to, something to share with the people around us. A way to mark time. It felt key to represent that concept in a work about daily change, since it's fundamental to how people experience the days of an annual cycle -- in every culture, since we started keeping written records.
Below are ten examples of a specific output with all variables fixed -- except for the presence of the various special days -- for the sake of explanation and comparison.
The standard appearance for the output. This is how the it appears when there is no Special Day active -- either because one isn't available in the output, or because it's been suppressed with the Daily Mode: Off control (press D).
The colors in each palette are rotated before the animation begins, so that they appear at different positions in the palette. This causes each color to be used for different conditions than it normally would, giving the animation an alternative coloration (but still using the same colors). Each palette is rotated a different amount; how much each is rotated depends on the output.
Manifests as a difference in color that changes the feeling of the animation; may be subtle or significant. In this animation, the effect is subtle. In some cases, it may be more prominent -- especially when large regions of solid color receive an alternative appearance.
Coloring Mode Monday
Gradually shifts the Coloring Mode used in each region through all 18 available modes. How quickly it shifts depends on the output. The modes always progress in the same order, but different combinations may occur based on the starting mode selected for each region in the output.
Manifests as a subtle shift in color and texture across the animation as it evolves. May be more prominent in regions with solid color.
Rotates colors like Shifty Sunday -- but some of the colors are then swapped between palettes to mix colors in the animation in a way that changes its feel.
The colors in each palette rotate continuously as the animation progresses -- changing their position in the palette, and which conditions in the animation cause them to appear. Sometimes, the rotation pauses for a while, before resuming again. Each palette rotates at a different rate, and the rates depend on the output.
Manifests as shifting, sometimes psychedelic color changes that significantly change the viewing experience. How it feels depends on which palettes and textures are in the output. Note that while it gives the feeling of shifting color, the colors in the palette are themselves unchanged.
Instead of using the usual automata hand-selected for the output's animation and neighborhoods, the output uses a random selection of all possible automata instead. Which ones are selected depends on the output. The number of available automata for each region (which is dependent on the animation), and the placement of full and empty space, remain unchanged.
Manifests as an alternative appearance for the output's textures that may be more (or less) attractive than normal. The unexpected combination of automata and neighborhoods that aren't normally allowed means textures may appear that don't exist anywhere else.
Each color in the animation continuously shifts hue as the animation evolves. How quickly is determined by the output's "festiveness" -- which varies by output.
Manifests as shifting, psychedelic colors that significantly change the output. The visual impact of hue shifts varies for each palette, based on its colors and their relative position. Striking on large areas of solid color; in general, how it looks depends on the textures in use. Displays colors and color combinations that aren't normally available. In outputs with high blur, may give a "lightening" effect as many different colors are blended together.
All automata are replaced with the "fill" and "empty" textures, which are placed to give a balance of positive and negative space.
Manifests as bold, clear colors and a lack of fine-grained textures. Provides a detailed view of the output's animations that may be less prominent on a normal day.
The rows and columns of pixels in the output are randomly swapped in each frame -- in a way that gradually and chaotically shifts. The degree of randomization and rate of change depend on the output. This mode is activated for all outputs in the series on the same day (Glitchmas). The timing of Glitchmas changes each year, according to a math equation:
((24 + YEARS_ELAPSED_SINCE_2023 * 7 - 1) % 31) + 1
Manifests as glitchy, chaotic corruptions of the animation. In some outputs, it has a subtle, texture-altering appearance (it looks like threads in fabric to me sometimes). In others, the output looks like a pay-per-view channel that you don't have access to; fragments of the output are visible, but distorted or scrambled. The most extreme manifestations of this effect tend almost to static. Colors and the balance of full/empty cells proceed as usual, and the output feels deterministic (even if a bit messy).
I wanted this feature to provide a shared sense of anticipation for the series' audience. It's a hat tip to the social experience that feels so core to (and in some cases, inseparable from) web3 art in the here and now. I'm hoping people will be excited to "see what they get for Glitchmas," and to see how other people's outputs have changed.
I wanted this feature to have an effect that could be beneficial or detrimental, as a parallel to the experience of minting a new output in a long-form generative collection. Something unexpected and very different from the output on a typical day; controversial, provocative, playful.
Enables the effects from Shifty Sunday, Coloring Mode Monday, and Festive Friday. "Festiveness" is decreased a bit from the usual values for a Friday, to reduce blurring into a lightening effect and preserve bolder colors. Automata are swapped out 5x as often as usual. Default framerate is increased by 1.5x.
Manifests as bold, psychedelic, continuously changing colors and textures. More dynamic and fluid than a typical day. Sometimes intense. The speed and visual impact depends on the output.
Unlike Glitchmas, Fiesta Day varies depending on the output. Like Glitchmas, I wanted this feature to be something to look forward to and share with others. Aside from anticipation, I hope it's something people will accidentally stumble onto when viewing a specific output and say "whoa, what's this one doing?" or "cool, I found one that's having a Fiesta today!"
Ideally, each day of the year can be represented across the series 1-3 times. I'd like there to almost always be some output in the series that's having a Fiesta on a given day. The rarity of each day's availability as a Fiesta Day is interesting from a collecting perspective -- whether to match a birthday, or some other personally important occasion or holiday. Will outputs with a Fiesta on New Years Eve or other holidays be sought after? I'm not certain, but I'm interested to see how it plays out.
Displaying Time-Based Features
If the "features" of an output from a LFG collection's system are the fixed attributes that define its characteristics -- typically displayed on a website alongside the output -- what are the features used in each of because unless until's outputs' time-based generative systems, and where can they be displayed?
Here, I leaned on the interactive help menu included in Implications and Zoologic to try a new concept -- dynamic information displayed in an HTML menu. This is a step towards the marriage of art and application I find exciting when building for the web. Each output has a "Today menu" (accessible by pressing [H]).
Today menu, describing detail level and active effects for the day -- as well as upcoming holidays
As is more typical for my menus, static Help and Controls content is available -- explaining time-based mechanics and available interactive controls.
Comparison to other Time-Based Art
Much of the LFG art I'm most familiar with is on the Art Blocks platform, where there are a few time-based works I considered as context in relation to my own work during development. There were also some earlier, non-algorithmic works that I considered.
On Art Blocks, there are a few prominent "clock-based" series that tie the representation of time, minute-by-minute and hour-by-hour, to our existing concepts of a clock: 720 Minutes by Alexis André; Alien Clock by Shvembldr (which, in fairness, is pretty creative in its interpretation of what a clock might be); Timepiece by WAWAA; and Time Atlas by Paolo Tonon. At one point I experimented with an animation that depicted a clock, but ultimately decided I wanted to focus more on representing the weave and flow of cycles and changes over time -- as experienced over the course of days/weeks/months/years -- and less on the measurement of time in the moment. These works didn't have much influence on my work.
A couple of projects I considered examine time on longer scales. The first of these is Bloom by Blockchance, which considers the "fleeting nature of life" via a finite timeline where a flower loses its petals over the course of weeks, months, or years. While very interesting, I felt this was a pretty different concept from the endless flow of time and cycles I was working with, so this project didn't have much influence.
When considering pre-algorithmic, non-LF generative art, I often think of Hans Haacke's Condensation Cube as a great illustration of the breadth of systems generative art encompasses. I find it interesting that before the involvement of algorithms, time often played a central role in the evolution of generative systems -- not because they represented clocks in any way, but because the passage of time is inseparable from the evolution of a physical system. Without time, there is no evolution. This idea of "time, but not as a clock" from early generative art played a significant role in my concept for because unless until, and in my avoidance of visual depictions of clocks or calendars.
Comparing and Contrasting with Concepts in Gazers
That brings me to Matt Kane's Gazers, which was the most relevant LFG series to my considerations for the time-based mechanics in because unless until. Both are calendar-based works, though Gazers is tied more closely to a lunar calendar, whereas because unless until uses the closely-related Julian calendar. Both works anticipate how collectors will experience them over time: in Gazers, the art changes over the course of hours and days using a time-based algorithm, to inspire delight in subtle changes; in because unless until, the output depends on the chaos and emergence of the algorithm to provide "the joy of discovery" over the course of minutes and hours, and uses a time-based mechanic that varies more discretely over days.
One major point of difference is that, like other "clock-based" series, Gazers depicts a physical representation of a sort of clock (the moon), albeit on a monthly scale, whereas because unless until doesn't contain visual depictions of clocks or other metrics of time, instead representing the passage or cycles of time as a concept or manifested changes to existing animation. Another is that events in Gazers are tied to the artist in a personal way as a "conceptual self-portrait," but the events in because unless until are a little more arbitrary -- intended not to memorialize important days in history, but instead to serve as moments of punctuation or social coordination in an ongoing flow of time.
Another key difference is that Gazers starts with 1 fps from the "origin moon" of an output and gradually increases the framerate to account for "anticipated advances in technology" and at the start reflecting the appearance of a "slowly evolving painting." In because unless until a realtime framerate-targeting algorithm is used to attempt maintaining a constant frame rate ideal for showing fluid animation in a way that will scale with advances in technology, without limiting the appeal of the animation in the present day. This was part of my core goal of accessibility -- that the outputs should ideally be performant and appealing with the computers and display methods that people have available to them today. Representing the advance of technology was not a conceptual consideration for because unless until.
As I mentioned in the goals section, improving my use of color was a priority for me in this series. One of the first places I started was with research. At some point I saw Ippsketch's recommendation to check out Nature's Palette -- a fantastic book illustrating the origin of many colors in nature. Nature is a big source of inspiration for me, so it seemed like an interesting place to start. I ordered a copy, and enjoyed perusing it -- highly recommended. I also really appreciated the list of CMYK colors provided in the back as a reference.
I hadn't worked with CMYK color before, so I put together some code for it during Genuary. I tried out some of the colors in Nature's Palette -- and while I found them satisfying, overall I felt many of them were a little muted for my taste (at least, in this project). But it was a stepping stone on my way to CMYK, which I'm grateful for, because I've discovered that I love the way they "feel" relative to RGB and HSL. Gradients through the CMYK color space are pleasing to me. CMY gradients allow variations in hue and saturation in three dimensions without much impact to luminance (which is mostly driven by K's black level). Very helpful -- and totally avoids the unpleasantness of HSL's "green wasteland" across a third of the H axis.
In Implications and Zoologic, I took a very literal approach to color palettes, deviating from the algorithmic color used in mono no aware. It helped me constrain my color and learn/think about how colors should look together, but with because unless until I wanted to make some steps back towards algorithmic color. The high number of neighbors for each cell in the algorithm provide some really rich data that can be used to color cells, so it felt like I wouldn't be taking full advantage of that with a palette of 10 or even 20 colors.
This work uses a hybrid approach, combining palettes with algorithms to generate a list of colors forming connected gradients -- something I thought of as a "palettoid" while I was working. For each palette, I chose ~7-25 "key colors" that I wanted to play a central role. I used interpolation to fill the gaps between each pair of colors with a gradient, such that the resulting list of color had many colors -- anywhere from 50-3000.
Half of outputs use palettoids with 50-300 colors, and the other half have 300-3000 colors -- sort of a hidden feature. Not all of these colors are ultimately used, but it's really important to have so many to achieve an effect I conceptualized as gradient aliasing.
Consider a cell with 0-32 neighbors, some of which are at different distances, and how you can use these variables to derive a sort of "score" for each cell to use for it's color. The choice of algorithm to derive this score is known as coloring mode. A score between 0 and 1 can be used to select a color some percentage of the way through the list of colors.
In theory, if the score is something like 0.33757, the color chosen from a continuous/infinite list of colors would always be the same. In reality, the color that will be chosen is being selected from a discrete list, so the exact choice may differ slightly due to which color is the closest after rounding. This means every palettoid may have subtle differences in its expression of color depending on output -- and more visibly when the number of colors to choose from is small (e.g. ~50) and when the selected coloring mode produces a smaller number of possible scores (e.g., "how many adjacent cells do you have, out of the possible 8" would yield 9 possible scores -- 0, 0.125, 0.25, etc. -- and therefore 9 possible colors).
The colors that end up on the screen reflect a mathematical relationship between the palettoid gradient, coloring mode, and automaton characteristics. Every output and texture has its own nuance depending on these. There are millions of ways for colors to be chosen for an output, which I think helps give each output a sense of haecceity (which I consider one of the most important things to strive for in a LFG series).
Whether or not I ended up using colors from Nature's Palette, nature was still a primary inspiration for color. When I think about colors, I think about scenes from nature -- which is reflected in palettes like Seafoam, Riverine, or Blue Skies. Times of day were also inspirations, with palettes like Dusk and Golden Hour. Purple (Last Light, Midnight) and red-orange (Ember, Scorch, Asiimov) are two of my favorite colors, so some of the palettes make use of them as key colors. It would be generous to say there are 17 palettes in this series. Many of them have significant overlap with one another (e.g., Graphite, Charcoal, and Black and White are all black and white palettes).
Palette usage is determined by region, and as many as four can be used in a given output. Each output has a palette mode determining how many will be used:
Mono: The same palette is used for all regions. Only allowed for some palettes.
Highlight: A palette is used for three regions, and another is used for the fourth.
Duo: A palette is used for regions 1 and 3, and another for regions 2 and 4
Trio: One palette is used for region 1, another for region 3, and a third for regions 2 and 4
Quartet: Four palettes are used -- one for each region
Swirl animation, Quartet palette mode with Sunbeam, Graphite, Blue Skies, and Seafoam palettes
With four palettes containing hundreds of colors, choosing random palettes is a dangerous game without some constraints. Some palettes look great with certain others, but terrible with different ones. To solve this, I made use of a technique called enemy detection. For each palette, there's a list of "enemy" palettes that should never appear with it. Any combination of palettes can be allowed, so long as none of them are enemies of one another. I determined enemies subjectively, by viewing many different outputs containing a Duo palette mode using each pair. If I wasn't loving it, it went into the enemies list.
The creation of because unless until has been a really challenging and rewarding experience that's occupied most of my attention for the better part of a year. I'm really pleased with the result, and feel it's my best work so far. I'm so excited to share it -- and to see which outputs end up in the series! I hope that its time-based mechanics will make it a source of joyful discovery for collectors, for years to come.
For readers interested to learn more about technical details of the algorithm and "neighborhoods" used for the automata, appendices are included below.
For additional information about the algorithm and neighborhoods of because unless until, check here.