Skip to content
Sample of Penne Bones of the Earth (Aaron Penne — Apparitions)

art_blocks · PenneBonesOfTheEarth

Penne Bones of the Earth (Aaron Penne — Apparitions)

Aaron Penne's signature algorithm from *Apparitions* (Art Blocks Curated, March 2021) — 'drawing multiple straight lines across the screen, and perturbing them according to an underlying noise field. Each line is actually hundreds of connected points, offset according to various rules.' Penne was the Director of Engineering at Art Blocks and one of the top-50 NFT artists globally in 2021; *Apparitions* drives on 18 parameters that control 14 features (Positioning, Stretch, Haunting, Facing, Spook, Bands, Brush Style, Reach, Altitude, Backdrop, Colors), producing 1500 unique outputs. The canonical 'bones of the earth' visual language — layered horizontal bands of noise-perturbed nodes — runs through Penne's earlier *Bones of the Earth* series (2019) and his later *Return*, *Catalina*, and *East/West Street*. This implementation layers N horizontal bands, each with M noise-perturbed nodes and a per-band colour drawn from a curated palette (Penne's 'Zephyr' colour picker), with three Brush Styles (solid, feathered, watercolor).

Original: https://www.artxcode.io/journal/aaron-penne-apparitions-on-art-blocks

▶ Try the live demo (JS port) ▶ Run reference.py via Pyodide 10 formulas have instant JS ports. The Pyodide path runs the actual Python in your browser — first load is ~6 MB, then instant.

Family
art_blocks
Source
art blocks
Evolution
particle
Render
noise_perturbed_bands
Complexity
low
Agents
24
Year
2021
Author
Aaron Penne

Math essence

For each band b in [0, num_bands): x_b[i] = lerp(0.04*dim, 0.96*dim, i/nodes); y_b[i] = baseline_b + reach * (0.7*value_noise_1d(i, grid_size) + 0.3*value_noise_1d(i, 2*grid_size)). baseline_b = (b+1) * dim/(num_bands+1) + altitude_drift * normal(0, 1). Each band is rasterised as a polyline of segment-to-segment lines with a per-band alpha.

Parameters

Name Type Default Range Description
dim int 600 200–1500 Square canvas side length (px).
num_bands int 24 4–100 Number of stacked horizontal bands (Apparitions DNA: 8–50).
nodes_per_band int 120 20–600 Stretch — nodes per band (Penne: 100–300).
reach float 60 0–200 Vertical amplitude of per-node noise offset, px (Penne: 0.1–0.3 amplitude).
altitude float 0.4 0–1 Per-band baseline drift (Penne's Altitude feature).
noise_scale float 0.04 0.005–0.5 Spatial frequency of the value-noise field.
noise_grid int 12 4–64 Internal value-noise grid resolution.
brush_style str feathered null–null solid|feathered|watercolor — band stroke style.
palette list null null–null Band colour palette (Zephyr-style: each band picks one).
background tuple 240,235,225 null–null Background RGB (Light = 80% chance in Penne's DNA, Darkness = 20%).
seed int 7 0–2147483647 RNG seed.

Reference

First 60 lines of reference.py. Full source: library_external/art_blocks/PenneBonesOfTheEarth/reference.py

"""PenneBonesOfTheEarth — Aaron Penne noise-perturbed layered lines.

Inspired by Aaron Penne's *Apparitions* (Art Blocks Curated, March
2021) and his broader body of generative work (*Return*, *Catalina*,
*East/West Street*, *Saying The Same Thing*).  Penne is the
Director of Engineering at Art Blocks, was one of the top-50 NFT
artists globally in 2021, and won the inaugural Lumen Prize for Art
and Technology in 2022 (with Boreta, for *Rituals — Venice*).

Penne describes his core algorithm in his 2021 ARTXCODE essay on
Apparitions:

    "The initial inspiration for this algorithm was a visualization
    published in 1893 by Levi Walter Yaggy. ... I approached this by
    drawing multiple straight lines across the screen, and
    perturbing them according to an underlying noise field. Each
    line is actually hundreds of connected points, offset according
    to various rules."

The key DNA of Penne's work, named here PenneBonesOfTheEarth (after
the conceptual *bones-of-the-earth* geological visual language that
runs through his 2019 *Bones of the Earth* series):

    1. Draw N horizontal "bands" (long lines stretching across the
       canvas, the canonical "stretched sheet" feature of Apparitions
       and Bones of the Earth).
    2. Each band is parameterised by 100–300 nodes (the Stretch
       feature: "The more nodes, the higher the detail, and the more
       compressed the form").  The band has a baseline y-position
       and a per-node vertical offset.
    3. The per-node vertical offset is sampled from a noise field —
       "the size of the step taken in the noise domain ... used to
       determine the variability within the form" (Penne's "Spook"
       feature).
    4. Bands stack up like geological strata, each with its own
       colour drawn from a hand-curated palette (the "Zephyr" colour
       picker picks "a new random color with every band").
    5. Lines are drawn solid or blended (the "Brush Style" feature
       controls whether lines are crisp or feathered).

The implementation here draws N bands, each with a noise-perturbed
baseline y-coordinate and an optional per-band colour from the
palette, with two Brush Styles (solid and feathered alpha-blend).

Reference:
- https://www.artxcode.io/journal/aaron-penne-apparitions-on-art-blocks
- https://www.aaronpenne.io/about
"""
from __future__ import annotations

from typing import ClassVar

import numpy as np


def _smoothstep(t: np.ndarray) -> np.ndarray:
    return t * t * (3.0 - 2.0 * t)


def _value_noise_1d(

Try running it locally

The reference implementation is self-contained Python with numpy. Install the package and run:

python library_external/art_blocks/PenneBonesOfTheEarth/reference.py

Need help? See Learn for the standard environment setup, or Playground for an in-browser sketchbook.

More from art blocks

Sample of Cherniak Ringers (Dmitri Cherniak — Ringers)

Cherniak Ringers (Dmitri Cherniak — Ringers)

art_blocks · CherniakRingers

An implementation of Dmitri Cherniak's *Ringers* algorithm (Art Blocks Curated, January 2021, 1,000 NFTs) — one of the most-cited generative-art projects of the NFT era, and the source of *Ringers #879* ('The Goose') and *Ringers #962* (acquired by LACMA).

View →
Sample of Chromie Squiggle (Snowfro / Cherniak — Squiggles)

Chromie Squiggle (Snowfro / Cherniak — Squiggles)

art_blocks · CherniakSquiggles

An implementation of the squiggle-generation kernel used in Snowfro's *Chromie Squiggle* (Art Blocks #0, November 2020) — the on-chain generative-art project that launched the Art Blocks platform itself and was the work Dmitri Cherniak cited (alongside *Genesis*) as his inspiration for Ringers.

View →
Sample of Genesis (DCA — Day-Zero Art Blocks)

Genesis (DCA — Day-Zero Art Blocks)

art_blocks · DcaGenesis

An interpretation of DCA's *Genesis* (Art Blocks #1, November 2020) — one of three Day-Zero collections (alongside Snowfro's Chromie Squiggle and Jeff Davis's Construction Token) that minted in the first 24 hours of the Art Blocks platform.

View →
Sample of Hobbs Flow Field (Tyler Hobbs — Incomplete Control / Fidenza)

Hobbs Flow Field (Tyler Hobbs — Incomplete Control / Fidenza)

art_blocks · HobbsFlowField

The canonical perlin-noise flow-field algorithm described by Tyler Hobbs in his 2020 essay 'Flow Fields', and the algorithmic backbone of his Art Blocks Curated works *Incomplete Control* (Bright Moments, 2021) and *Fidenza* (Art Blocks, 2021).

View →
Sample of Hobbs Watercolor Blob

Hobbs Watercolor Blob

art_blocks · HobbsWatercolorBlob

Layered translucent Gaussian blobs with watercolor-style alpha falloff.

View →
Sample of Hobbs Watercolor Edge (Tyler Hobbs — Soft Textures / Watercolor)

Hobbs Watercolor Edge (Tyler Hobbs — Soft Textures / Watercolor)

art_blocks · HobbsWatercolorEdge

An implementation of Tyler Hobbs' 2017 'watercolor' technique: a recursive polygon-deformation algorithm whose midpoints are jittered by Gaussian noise across many passes, then stacked with low alpha (4% per layer, 30–100 layers total) to produce the soft, ink-bleed look of wet pigment on paper.

View →

See all art_blocks artworks →