This continues a three-part series on Subscapes, a generative art project hosted on the Ethereum blockchain. Part 1 provides a broad overview of CryptoArt and on-chain software art. This post, Part 2, will explore the algorithmic traits of the 650 collectible tokens. Then, Part 3 will break down some of the techniques and concepts used to develop the JavaScript code, and explore some ways of reusing and remixing the software going forward.
Algorithmic Traits
In Subscapes, each of the mint #s from the 650 (#0 to #649) correspond with a specific hash. This is embedded into the on-chain token metadata, but you can also find a list of these hashes (in their respective order) here, which were extracted from the minted set. Although I couldn’t predict the output of the algorithm, I did tailor and test my code extensively to ensure it would always produce a well formed distribution to my liking.
This idea of collectible generative art, driven forward by ArtBlocks (#1of1ofX), makes it one of the more challenging generative artworks I’ve had to design. Typically, I curate my algorithms down to about 4-10 outputs that I feel are worth exhibiting and printing. With Subscapes, the algorithm had to be capable of producing 650 unique and high quality outputs, with enough variety among them to enable audiences to continually discover variations, differences, and surprises while navigating the full set. Made more difficult still, my code had to be extremely compact to fit within a blockchain transaction (the final algorithm is about 17 kilobytes of un-compressed JavaScript).
To achieve this variety, I added a wide range of different traits and features into the algorithm. The ArtBlocks and OpenSea plugins shows 11 different traits totalling 51 different possible attributes (Style, Palette, Brushed True/False, etc), but there are countless other hidden traits and algorithmic possibilities that contribute to the overall variety, many of which I decided not to categorize.
Below I’ll discuss some of the main traits and show examples of their outputs. This may seem like an odd thing, to deconstruct and analyze each trait so specifically in a generative artwork, but it has become a custom after an ArtBlocks release to break down the distribution of features among the total set of outputs. The intention is to help collectors understand what piece they own, how it fits into the rest of the set, and what other pieces they may wish to add to their collection in the future. In many ways this crosses into a realm of Digital Collectibles, and in some ways the 650 Subscapes is a generative art project designed to be scrutinized, collected, digitally curated, and further expanded upon by the community (with remixes, adaptations, experiments, etc).
Style
The most prominent variation comes from the Style of rendering, of which there are 12 weighted possibilities (some appearing more often than others). The most common Styles are Acrylic and Pencil styles, which make up almost 50% of all Subscapes. These set the color selection mode to one of the 18 total predefined and named palettes.
Acrylic (158 total, or 24%) selects one of 13 palettes, which includes a set background color, and then applies the remaining colors to the rest of the strokes.
Pencil (160 total, or 24%) is the only style to use Multiply compositing mode for the rendering – this Style also sets stroke line width to a fixed value, uses a bright white for the background, and selects one of 5 palettes for the strokes.
Most other Styles will use a Procedural palette selection. After Acrylic and Pencil, the next most common Style is Warhol (63 in total, or 9%), which selects a high contrasting pair of predefined Riso-inspired colors and randomly chooses one of the colors as the background.
A handful of Styles are more uniformly distributed after this, such as Neon (48 total, or 7%), which uses a dark procedurally-chosen background combined with one or two high contrasting Riso colors.
Screenprints (42 total, or 6%) and Lino (26 total, or 4%) are siblings. Screenprint uses a white ink on a procedurally chosen chromatic background color, and Lino uses black ink on a procedural bright background. Many of these Procedural color choices use OKLAB Color Space to produce a perceptually uniform distribution of colors.
Riso (36 total, 5%) combines a predefined colored paper backgrounds with one or two of the predefined Riso colors. In some cases you can end up with Risos that look like Warhols, though usually Riso has a paler background, and Riso has the possibility of producing 3-color variants.
Another two siblings are Minimal (45 total, 6%) and Invert (14 total, 2%), which use a simple white and black palette.
The last three styles are ‘special’ in that they drastically change some of the terrain and rendering attributes. Metallic (28 total, 4%) introduces diffuse point lighting with a dark ambient color and a vivid Riso color highlight.
Drift (24 total, 3%) introduces screen compositing, low opacity, and longer flowing strokes to create a rendering that mimics long exposure photography.
And Starfall (6 total, 0.9%) is a very uncommon trait that sets a predefined palette and spawns falling lines. I liked this enough to let the algorithm produce a small percentage of them, but did not want too many as I felt it detracted from the general look & feel I had established across the rest of the project. The chance of it happening was so small that on some local test runs, there would not even be any Starfalls produced among the 650.
Structure
There’s a variety of traits that affect the parametric terrain:
River (32 total, 4%) layers additional noise functions into the parametric terrain, creating a valley or river-like structure. This can exist across a variety of Landscape traits.
Coast Landscape (38 total, 5%) modulates the noise terrain to create a sharp coastal falloff.
Hills Landscape (45 total, 6%) creates a taller range, like an elevated rolling meadow.
Summit Landscape (33 total, 5%) forces the noise into a peak in the center, creating a lone mountain.
Waterfall Landscape (4 total, 0.6%) is even rarer than Starfall, and the tile is rectangular instead of square, with a ramped falloff on the terrain.
The remaining Landscape styles are Mountains (530 total, 81%).
Patchwork
The surface of the terrain is generally cut into small tiles like a quilt or crop fields, using binary space partioning, and this is the Patchwork trait (470 total, 72%). Each ‘patch’ may derive different features such as stroke density, stroke length, and stroke color. When Patchwork is disabled, the surface is drawn as a uniform texture.
Blended Stroke Color
Typically colors on the surface are assigned randomly based on the ‘patch’ they belong to, when Patchwork is enabled. But some outputs exhibit Blended trait (106 total, 16%) which will slowly interpolate each stroke’s color from one to another in the current palette, based on the diffuse contribution of an invisible point light above the terrain.
In some cases, this attribute can produce some really interesting and unusual visual results:
Brushed Strokes
Strokes are usually placed cleanly and accurately, as if by a mechanical pen plotter. But, with the Brushed trait (122 total, 18%), the strokes are applied more thickly, and more haphazardly, creating an impressionistic effect.
Here’s two Brushed Subscapes with matching Bauhaus Palettes:
Stippled Pen
The drawing mechanism is occasionally Stippled (53 total, 8%). This trait creates a pointillism effect, rather than the typical long and flowing pen strokes.
Grid Stroke Placement
By default, strokes are placed on the surface of the terrain with a pseudo random Poisson-disc distribution, giving a pleasing and organic look. But, with the Grid trait (57 total, 8%), the strokes are placed uniformly across a 2D grid, as the name implies. Some patches might use a different grid cell sizes, giving rise to some interesting outputs.
Wireframe Rendering
A special style of rendering is Wireframe (17 total, 2%), which simply renders the parametric geometry as a 3D quad wireframe rather than the typical drawing paths.
Lattice Terrain
Another special style is Lattice (59 total, 9%), which rounds the parametric terrain coordinates along the X or Y axis to a random cell size, to create an unusual grid type of structure, but still maintaining some of the possible brush rendering styles. Sometimes this can exhibit unusual glitches/bugs. Fun fact: the day prior to releasing the project, I noticed a bug in my code that would sometimes produce too many ‘holes’ with this trait, and decided to leave it in as a feature that occurs 50% of the time.
Hidden Traits
There’s many ‘hidden’ traits, these are simply random permutations within the algorithm that are not seen by the OpenSea and ArtBlocks trait detection plugins. For example: there are 4 distinct noise frequencies for the Hills, but it’s not something you’ll be able to spot easily. Sometimes the base is filled with a solid color, other times it is transparent. Some bases connect with the terrain with a ‘ridge line’, while others are free-floating. Lines are sometimes selected with a different set of thicknesses. And so on—I have dozens of these attributes in my code, but it’s probably not worth scrutinizing over each one in this article.
Chance & Surprise
There’s a few iterations that stand out in different ways, mostly because of the exact combination of randomness and traits. For example, #210 creating an unexpected Moiré pattern, #80 and #468 looking like data errors, #621 and #521 looking like a different rendering algorithm altogether, and so on. It’s fun to explore these in the ArtBlocks Discord with Subscapes collectors, finding and curating the gems hidden amongst the haystack of computational randomness.
The Mints that Never Were
Although collectors mostly focus on the minted set of 650, as these are the unique tokens that enable digital ownership, it’s worth reiterating that this software is ultimately capable of producing infinite outputs, hence the #1of1ofX ArtBlocks ethos. There were many ‘test mints’ that I really loved, and I generally am really satisfied with the overall software itself and all of its potential permutations, rather than only the 650 editions that were minted by collectors. Below is an ‘unminted’ waterfall, identified and recorded only by its algorithmic hash.
This is one reason I would like to foster a community of experimentation, hacking, repurposing and remixing the tokens and on-chain code, rather than only focusing on the limited minted set as static thumbnails. I’ve published some Node.js tools for fetching and running the on-chain software directly, allowing users to render high quality PNG and SVG outputs from the minted set and beyond, and perhaps create other forms of outputs such as 3D prints. I’m also excited to see these tokens paired with the Web3 platform; perhaps enabling future interactive experiences that can directly build upon these tokenized and on-chain art projects.
—
The final post, Part 3, will focus more on the technology, breaking down how this was created in JavaScript, and exploring some ways this project can be remixed in future.