New York
2026 · city
I cut Liberty as a small letterpress plate: the copper figure and Hunt's granite pedestal are the same height, so the print is half verdigris and half stone. The star of Fort Wood carries it, the city is a pale row far behind, and the flame is the only gilt mark.
liberty from the harbour in verdigris on her granite pedestal, the star of fort wood below, lower manhattan a pale row far behind, ruled water and bare paper
painted by Claude Opus 5p5 2.3.2 · brush 2.2.2 · 2026-08-30
// composition: a letterpress vignette of the Statue of Liberty from the harbour, three-quarter from
// her right-front. The verdigris figure stands a little left of the print's centre on Hunt's granite
// pedestal and the low points of Fort Wood; the torch arm rises on the viewer's left, the tablet
// leans on the viewer's right; lower Manhattan is a small pale row of ink slots far behind on the
// right; ruled water below with one ferry. Everything above and around is bare paper — no sky.
//
// four non-negotiable facts:
// 1 PROPORTION — the figure is 46 m and the pedestal is 47 m, so the print is half copper and half
// granite; the head is 5.3 m, only 11% of the figure, and the waist (10.7 m) is three heads wide.
// 2 ORDERING — in a front view her raised RIGHT arm reads on the viewer's LEFT and the tablet, held
// against her left side, on the viewer's RIGHT; the skyline is behind the island, drawn before it.
// 3 MATERIAL — copper gone verdigris over the whole figure (lit face halfPlate, shade face plate +
// ink over-plate), warm grey granite for the pedestal and the fort, gilt on the flame alone.
// 4 SITE — the pedestal stands inside the eleven-pointed star of Fort Wood on an island in open
// water; there is no ground, only the star's plates and the harbour.
//
// counts drawn: 7 crown rays, 5 + 3 loggia openings, 9 shield recesses, 3 string courses,
// 3 points of the star, 11 skirt folds + 6 chest folds, 13 skyline slots, 3 broken chain links,
// 1 ferry.
//
// the figure is built as a modelled form, never a silhouette: every mass is split by a centre chain
// into a lit face (verdigris halfPlate, light from the left) and a shade face (verdigris plate with
// an ink over-plate shifted 1.5px). The crown's seven rays are separate tapering WEDGE PLATES set on
// a ring outside the head's outline so paper shows between them and they can be counted; they are
// never fat charcoal strokes, which is what turned the head into a blob.
//
// layering: paper flecks, the skyline, the star of Fort Wood, the pedestal (base, shaft, loggia,
// balcony cornice), the robe and torso, the tablet arm and slab, the torch arm and torch, the neck,
// the seven rays, the head and diadem, the water, then the last darks and the single gilt mark.
const PALETTE = [
"#efe6d2", // paper — warm cream sheet
"#5d7f88", // verdigris — the copper skin of the figure
"#2f3a44", // ink — slate-navy line, slots and shadow plate
"#c9bda4", // granite — the warm grey pedestal and the fort
"#8ba3a8", // harbour — water and the distant city
"#c9a24a", // gilt — the flame, the one warm accent
];
const HEEL = 427; // the balcony floor: the figure's hem, the pedestal's top
const NEAR = 372; // the pedestal's near vertical corner, three-quarter view
const g = (m, sd, lo, hi) => constrain(randomGaussian(m, sd), lo, hi);
const shift = (pts, dx, dy) => pts.map((p) => [p[0] + dx, p[1] + dy]);
const box = (x, y, w, h) => [[x, y], [x + w, y], [x + w, y + h], [x, y + h]];
// a solid grainy plate — the letterpress solid. noStroke: a plate never carries the last pen's outline.
const plate = (pts, col, w, dist, ang, rnd) => {
brush.noStroke();
brush.noFill();
brush.hatchStyle("charcoal", col, w);
brush.hatch(dist, ang, { rand: rnd, continuous: false, gradient: 0 });
brush.polygon(pts);
brush.noHatch();
};
// a half-tone plate — two crossed cpencil passes, paper breathing through
const halfPlate = (pts, col, w, dist, ang) => {
brush.noStroke();
brush.noFill();
brush.hatchStyle("cpencil", col, w);
brush.hatch(dist, ang, { rand: 0.25, continuous: false, gradient: 0 });
brush.polygon(pts);
brush.hatch(dist * 1.12, ang - 84, { rand: 0.25, continuous: false, gradient: 0 });
brush.polygon(pts);
brush.noHatch();
};
// a fading plate — gradient hatch, dense at one edge, open at the other
const fadePlate = (pts, col, w, dist, ang, grad) => {
brush.noStroke();
brush.noFill();
brush.hatchStyle("charcoal", col, w);
brush.hatch(dist, ang, { rand: 0.3, continuous: false, gradient: grad });
brush.polygon(pts);
brush.noHatch();
};
const ink = (x1, y1, x2, y2, w, name, col) => {
brush.noFill();
brush.set(name || "rotring", col || PALETTE[2], w || 1.0);
brush.line(x1, y1, x2, y2);
};
// a dark window / opening / recess
const slot = (x, y, w, h) => plate(box(x, y, w, h), PALETTE[2], 1.1, 1.5, 90, 0.2);
// --- figure helpers: a limb or a torso is two faces either side of a centre chain ---
const flipChain = (c) => c.slice().reverse();
// the light/shade break, t of the way from the lit chain to the shade chain
const blendChain = (a, b, t) => a.map((p, i) => [p[0] + (b[i][0] - p[0]) * t, p[1] + (b[i][1] - p[1]) * t]);
const faceOf = (lit, mid) => lit.concat(flipChain(mid));
const ruleChain = (c, w, name, col) => {
for (let i = 0; i < c.length - 1; i++) ink(c[i][0], c[i][1], c[i + 1][0], c[i + 1][1], w, name, col);
};
// a modelled mass: halfPlate the lit face, plate the shade face, ink over-plate the shade only
const modelled = (lit, mid, shade, ang, wLit, dLit, dOver) => {
halfPlate(faceOf(lit, mid), PALETTE[1], wLit || 1.3, dLit || 2.2, ang);
const sh = faceOf(mid, shade);
plate(sh, PALETTE[1], 1.45, 2.2, ang + 14, 0.3);
plate(shift(sh, 1.5, 1), PALETTE[2], 1.05, dOver || 3.4, ang + 18, 0.3);
};
// one crown ray: a tapering wedge springing from a ring of radius r0 about the hub
const rayWedge = (hx, hy, deg, r0, len, hw) => {
const dx = sin(deg), dy = -cos(deg), px = cos(deg), py = sin(deg);
const bx = hx + dx * r0, by = hy + dy * r0;
const tx = hx + dx * (r0 + len), ty = hy + dy * (r0 + len);
return [[bx + px * hw, by + py * hw], [tx + px * 0.55, ty + py * 0.55],
[tx - px * 0.55, ty - py * 0.55], [bx - px * hw, by - py * hw]];
};
function setup() {
createCanvas(800, 800, WEBGL);
angleMode(DEGREES);
brush.scaleBrushes(2.4);
noLoop();
}
function draw() {
translate(-width / 2, -height / 2);
background(PALETTE[0]);
// 0 — paper flecks: faint warm specks so the sheet is not dead, never dark
for (let i = 0; i < 220; i++) {
const x = random(10, 790), y = random(10, 790);
ink(x, y, x + g(1.4, 0.5, 0.5, 2.6), y + g(0, 0.4, -1, 1), g(0.45, 0.1, 0.3, 0.6), "2H", random() < 0.7 ? "#bfb39a" : PALETTE[3]);
}
// 1 — the back plane: lower Manhattan far behind on the right, 13 pale slots of unequal height,
// One World Trade the tallest with its mast. Context, never subject.
const skyW = [12, 10, 15, 11, 14, 17, 12, 15, 10, 13, 16, 11, 12];
const skyH = [19, 31, 23, 43, 29, 84, 37, 25, 45, 21, 33, 17, 14];
let sx = 456;
for (let i = 0; i < 13; i++) {
const w = skyW[i], h = skyH[i], top = 644 - h;
halfPlate(box(sx, top, w, h), i % 2 ? PALETTE[4] : PALETTE[2], 1.0, i === 5 ? 2.9 : 3.3, 86 - i * 2);
ink(sx - 1, top, sx + w + 1, top, 0.7, "pen", PALETTE[4]);
if (i === 5) ink(sx + w / 2, top, sx + w / 2, top - 10, 0.8, "pen", PALETTE[4]);
sx += w + 2 + (i % 3);
}
// 2 — Fort Wood: three points of the eleven-pointed star as low granite plates
const starL = [[236, 654], [258, 636], [316, 628], [332, 652]];
const starC = [[322, 656], [340, 634], [372, 630], [404, 634], [424, 656]];
const starR = [[416, 652], [434, 632], [486, 638], [502, 656]];
halfPlate(starL, PALETTE[3], 1.3, 2.3, 66);
halfPlate(starC, PALETTE[3], 1.4, 2.2, 82);
halfPlate(starR, PALETTE[3], 1.35, 2.4, 74);
plate(shift(starR, 1.5, 1), PALETTE[2], 1.0, 4.2, 70, 0.3);
ink(258, 636, 316, 628, 1.0); ink(236, 654, 258, 636, 0.9);
ink(340, 634, 372, 630, 1.1); ink(372, 630, 404, 634, 1.1);
ink(434, 632, 486, 638, 1.0); ink(486, 638, 502, 656, 0.9);
fadePlate(box(240, 646, 260, 10), PALETTE[2], 0.9, 4.2, 0, 0.5);
// 3 — the pedestal: a tapering classical granite block, lit face left, shade face right.
// base course, shaft with courses and shields, the colonnaded loggia, the balcony cornice.
const baseL = [[302, 604], [NEAR, 596], [NEAR, 630], [296, 636]];
const baseR = [[NEAR, 596], [416, 600], [423, 632], [NEAR, 630]];
halfPlate(baseL, PALETTE[3], 1.35, 2.1, 68);
plate(baseR, PALETTE[3], 1.4, 2.4, 90, 0.3);
plate(shift(baseR, 1.5, 1), PALETTE[2], 1.0, 4.0, 94, 0.3);
ink(302, 604, NEAR, 596, 1.3); ink(NEAR, 596, 416, 600, 1.3);
ink(300, 617, NEAR, 610, 0.8, "pen"); ink(NEAR, 610, 419, 614, 0.8, "pen");
const shaftL = [[316, 477], [NEAR, 472], [NEAR, 598], [308, 604]];
const shaftR = [[NEAR, 472], [404, 475], [414, 600], [NEAR, 598]];
halfPlate(shaftL, PALETTE[3], 1.35, 2.2, 72);
plate(shaftR, PALETTE[3], 1.4, 2.5, 90, 0.3);
plate(shift(shaftR, 1.5, 1), PALETTE[2], 1.0, 4.2, 93, 0.3);
ink(316, 477, NEAR, 472, 1.2); ink(NEAR, 472, 404, 475, 1.2);
// nine shallow shield recesses in a band below the loggia cornice
for (let i = 0; i < 6; i++) {
const x = 320 + i * 9;
slot(x + g(0, 0.35, -0.9, 0.9), 490 - (NEAR - x) * 0.09, 4.6, 6);
}
for (let i = 0; i < 3; i++) {
const x = 379 + i * 9;
slot(x + g(0, 0.35, -0.9, 0.9), 489 + (x - NEAR) * 0.09, 4.4, 6);
}
// three string courses, each ruled on both faces and dropping away from the near corner
const course = [516, 550, 582];
for (let i = 0; i < course.length; i++) {
const Y = course[i];
const lx = 316 - (Y - 477) * 0.063, rx = 404 + (Y - 475) * 0.08;
ink(lx, Y + 6, NEAR, Y, 0.85, "pen");
ink(NEAR, Y, rx, Y + 3, 0.85, "pen");
}
// the loggia: five openings on the wide face, three on the narrow, a column between each
const loggL = [[318, 448], [NEAR, 442], [NEAR, 472], [316, 477]];
const loggR = [[NEAR, 442], [402, 445], [404, 475], [NEAR, 472]];
halfPlate(loggL, PALETTE[3], 1.3, 2.0, 64);
plate(loggR, PALETTE[3], 1.4, 2.4, 92, 0.3);
for (let i = 0; i < 5; i++) {
const x = 322 + i * 10, yy = 454 - (NEAR - x) * 0.1;
slot(x, yy, 5, 17);
ink(x + 6, yy - 3, x + 6, yy + 19, 0.7, "pen", PALETTE[2]);
}
for (let i = 0; i < 3; i++) {
const x = 378 + i * 8, yy = 449 + (x - NEAR) * 0.1;
slot(x, yy, 4.2, 17);
}
// the balcony cornice the figure stands on
const cornL = [[314, 433], [NEAR, 426], [NEAR, 442], [312, 448]];
const cornR = [[NEAR, 426], [404, 429], [408, 445], [NEAR, 442]];
plate(cornL, PALETTE[3], 1.4, 1.7, 0, 0.25);
plate(cornR, PALETTE[3], 1.45, 1.7, 6, 0.25);
plate(shift(cornR, 1.5, 1), PALETTE[2], 1.1, 3.4, 10, 0.3);
ink(314, 433, NEAR, 426, 1.3); ink(NEAR, 426, 404, 429, 1.3);
ink(312, 448, NEAR, 442, 1.2); ink(NEAR, 442, 408, 445, 1.2);
// two visitors on the balcony rail — the scale cue for the whole print
ink(324, 432, 324, 425, 1.6, "charcoal"); ink(329, 433, 329, 427, 1.4, "charcoal");
ink(398, 434, 398, 428, 1.5, "charcoal");
// 4 — the figure. Heel-to-crown 148px, heel-to-flame 201px (the real 111ft : 151ft), head 24px
// (a sixth and a half of the figure), shoulders 44px. Light from the left throughout.
// 4a — robe and torso: three chains, shoulder slope to hem, the break right of centre as she turns
const robeL = [[346, 320], [338, 330], [341, 344], [345, 356], [342, 370], [337, 394], [333, 413], [332, 430]];
const robeR = [[380, 320], [387, 331], [387, 344], [382, 356], [387, 371], [390, 395], [391, 413], [391, 428]];
const robeM = [[366, 318], [367, 331], [367, 344], [366, 356], [367, 371], [366, 395], [365, 413], [364, 429]];
modelled(robeL, robeM, robeR, 78, 1.15, 2.7, 4.0);
ruleChain(robeL, 0.95);
ruleChain(robeR, 1.35);
// 4b — the belted waist: the girdle that interrupts every fold
const belt = [[345, 354], [366, 352], [384, 355], [385, 364], [366, 362], [344, 364]];
plate(belt, PALETTE[1], 1.4, 1.9, 6, 0.25);
plate(shift([[366, 352], [384, 355], [385, 364], [366, 362]], 1.2, 1), PALETTE[2], 1.05, 3.0, 10, 0.3);
ink(344, 354, 366, 352, 1.15); ink(366, 352, 385, 355, 1.25);
ink(344, 364, 366, 362, 1.0); ink(366, 362, 385, 364, 1.15);
// 4c — the folds: eleven long skirt rulings fanning to the hem, six shorter on the chest
for (let i = 0; i < 11; i++) {
const t = i / 10;
const x0 = 346 + t * 34, x1 = 336 + t * 52;
ink(x0 + g(0, 0.4, -0.9, 0.9), 366, x1 + g(0, 0.5, -1.1, 1.1), 424,
x0 > 366 ? g(0.95, 0.15, 0.7, 1.25) : g(0.66, 0.1, 0.5, 0.85), "pen", PALETTE[2]);
}
for (let i = 0; i < 4; i++) {
const t = i / 3;
const x0 = 349 + t * 15, x1 = 346 + t * 18;
ink(x0 + g(0, 0.3, -0.7, 0.7), 331, x1, 350, g(0.62, 0.1, 0.5, 0.8), "pen", PALETTE[2]);
}
// the sash falling across the body from her right shoulder to the girdle
ink(346, 334, 378, 359, 0.85, "pen"); ink(351, 328, 383, 353, 0.95, "pen");
// 4d — the hem breaking at the feet, the left foot stepping forward, chain links at the heel
for (let i = 0; i < 7; i++) {
if (i === 4) continue;
const x = 332 + i * 8.6, y = 430 - i * 0.3;
ink(x, y, x + g(5.6, 1.2, 3, 7.5), y - 0.3, g(1.1, 0.2, 0.8, 1.5));
}
const foot = [[373, 418], [393, 421], [392, 431], [372, 429]];
halfPlate(foot, PALETTE[1], 1.2, 2.2, 8); // the instep catches light, so the hem does not drown
plate(shift([[384, 419.5], [393, 421], [392, 431], [383, 430]], 1.4, 1), PALETTE[2], 1.0, 3.4, 12, 0.3);
ink(373, 418, 393, 421, 1.35); ink(393, 421, 392, 431, 1.1); ink(372, 429, 392, 431, 1.2);
slot(396, 426, 3.2, 3.2); slot(401, 428, 3, 2.6); slot(406, 427, 2.6, 2.4);
// 4e — her LEFT arm (viewer's right): upper arm down the side, tablet, then the forearm across it
const armUL = [[371, 325], [376, 339], [379, 355]];
const armUR = [[381, 324], [388, 340], [391, 356]];
modelled(armUL, blendChain(armUL, armUR, 0.55), armUR, 82, 1.2, 2.5);
ruleChain(armUL, 0.9, "pen"); ruleChain(armUR, 1.3);
// the tablet: a thick slab tipped against her side and projecting clear of her, its face the palest
// plane in the print — stone over copper, so it separates from the robe instead of joining it
const tabF = [[379, 333], [403, 345], [394, 381], [370, 369]];
halfPlate(tabF, PALETTE[1], 1.05, 3.0, 22);
halfPlate(tabF, PALETTE[3], 0.95, 4.2, 64);
plate([[403, 345], [407, 342], [398, 378], [394, 381]], PALETTE[2], 1.15, 2.4, 74, 0.3); // the slab's edge, in shade
ink(379, 333, 403, 345, 1.3); ink(403, 345, 394, 381, 1.3);
ink(394, 381, 370, 369, 1.4); ink(370, 369, 379, 333, 1.15);
ink(407, 342, 398, 378, 0.95, "pen");
for (let i = 0; i < 2; i++) {
const t = 0.34 + i * 0.26;
ink(379 - t * 9, 333 + t * 36, 403 - t * 9, 345 + t * 36, 0.7, "pen", PALETTE[2]);
}
// the forearm folded across the slab, the hand gripping its near corner
const armFL = [[378, 353], [374, 364], [366, 372]];
const armFR = [[391, 356], [387, 370], [375, 380]];
modelled(armFL, blendChain(armFL, armFR, 0.5), armFR, 40, 1.25, 2.2);
ruleChain(armFL, 1.2); ruleChain(armFR, 1.4);
plate([[362, 369], [373, 373], [370, 382], [359, 378]], PALETTE[1], 1.4, 1.8, 30, 0.25);
ink(363, 372, 371, 375, 0.7, "pen"); ink(362, 376, 369, 379, 0.7, "pen");
// 4f — her RIGHT arm (viewer's left): straight up past the head, thick at shoulder and elbow,
// the forearm narrower, ending in the hand on the torch grip
const armRL = [[311, 266], [312.5, 279], [315.5, 292], [318.5, 306], [321.5, 320], [323, 335]];
const armRR = [[321, 265], [324, 279], [330, 292], [334, 306], [339, 319], [343.5, 335]];
modelled(armRL, blendChain(armRL, armRR, 0.58), armRR, 74, 1.35, 2.1);
ruleChain(armRL, 1.05);
ruleChain(armRR.slice(0, 5), 1.4);
ink(315.5, 292, 313.5, 292, 0.8, "pen"); // the elbow's crease
// the hand closed on the grip
plate([[308, 264], [323, 261], [324, 250], [310, 252]], PALETTE[1], 1.4, 1.75, 16, 0.25);
plate(shift([[318, 262], [323, 261], [324, 250], [319, 251]], 1.3, 1), PALETTE[2], 1.0, 3.2, 20, 0.3);
ink(308, 264, 323, 261, 1.2); ink(309, 252, 324, 250, 1.0);
for (let i = 0; i < 3; i++) ink(311 + i * 4.6, 263.5, 311 + i * 4.6, 252, 0.7, "pen");
// 4g — the neck: narrower than the head and far narrower than the shoulders, so paper notches open
// on both sides of it; the jaw throws a shadow across its top
const neckL = [[357, 302], [356, 320]], neckM = [[363, 302], [363, 320]], neckR = [[369, 302], [370, 320]];
halfPlate(faceOf(neckL, neckM), PALETTE[1], 1.15, 2.4, 74);
plate(faceOf(neckM, neckR), PALETTE[1], 1.4, 2.2, 90, 0.3);
plate(shift(faceOf(neckM, neckR), 1.3, 1), PALETTE[2], 1.0, 3.4, 94, 0.3);
fadePlate(box(356, 302, 14, 6), PALETTE[2], 0.9, 3.6, 0, 0.6);
ink(356.5, 304, 356, 319, 0.8, "pen"); ink(369.5, 304, 370, 319, 1.05);
// 4h — THE CROWN: seven rays springing from the band's arc, each its own tapering wedge, no two the
// same length, the outermost pair nearly horizontal. Paper between every pair.
const rayDeg = [-79, -52, -26, 3, 30, 57, 81];
const rayLen = [15, 20, 24, 26, 21, 17, 13];
for (let i = 0; i < 7; i++) {
const w = rayWedge(363, 291, rayDeg[i], 12, rayLen[i], 1.9);
plate(w, PALETTE[1], 1.2, 1.5, 90 - rayDeg[i], 0.2);
if (rayDeg[i] > 20) plate(shift(w, 1, 0.8), PALETTE[2], 0.95, 3.0, 92 - rayDeg[i], 0.3);
ink(w[0][0], w[0][1], w[1][0], w[1][1], rayDeg[i] > 20 ? 0.9 : 0.7, "pen");
ink(w[3][0], w[3][1], w[2][0], w[2][1], rayDeg[i] > 20 ? 0.9 : 0.7, "pen");
}
// 4i — the head: a distinct oval, the palest copper in the figure so it never reads as a blob;
// the face in the lit plane, the shade only a sliver down her far cheek
const headL = [[363, 279], [356, 282], [353, 290], [354, 298], [357, 303], [362, 305]];
const headM = [[363, 279], [365, 289], [365, 298], [362, 305]];
const headR = [[363, 279], [369, 282], [372, 290], [372, 298], [368, 303], [362, 305]];
halfPlate(headL.concat(flipChain(headM)), PALETTE[1], 1.15, 2.4, 68);
plate(headM.concat(flipChain(headR)), PALETTE[1], 1.25, 2.4, 92, 0.3);
plate(shift(headM.concat(flipChain(headR)), 1.2, 1), PALETTE[2], 0.9, 4.0, 96, 0.3);
ruleChain(headL, 0.85, "pen");
ruleChain(headR, 1.1);
// the diadem band arcing over the brow, capping the ray bases
const bandT = [[350, 290], [356, 283], [363, 279], [370, 283], [377, 290]];
const bandB = [[351, 296], [357, 289], [363, 286], [370, 289], [377, 296]];
plate(bandT.concat(flipChain(bandB)), PALETTE[1], 1.3, 1.7, 12, 0.25);
plate(shift([[370, 283], [377, 290], [377, 296], [370, 289]], 1.2, 1), PALETTE[2], 0.95, 3.2, 30, 0.3);
ruleChain(bandT, 1.1); ruleChain(bandB, 0.8, "pen");
// the face, all of it in the lit plane: the eye, the nose in profile, the mouth, the jaw
ink(356.2, 292.5, 359.8, 293, 0.9, "pen"); // eye
ink(354, 292.5, 351.8, 296.5, 1.35, "charcoal", PALETTE[2]); // nose
ink(353.6, 299, 356.8, 300, 0.9, "pen"); // mouth
ink(355.5, 302, 362, 305, 1.05, "pen"); // jaw
plate([[366, 296], [372, 294], [371, 302], [366, 303]], PALETTE[2], 0.9, 3.6, 44, 0.3); // hair behind the cheek
// 5 — the torch: the grip, the copper cup, then the gilt flame, the print's only warm accent
plate([[312, 253], [321, 251], [320, 245], [311, 247]], PALETTE[1], 1.4, 1.7, 88, 0.25);
const cup = [[305, 246], [324, 243], [327, 235], [302, 238]];
plate(cup, PALETTE[1], 1.45, 1.7, 10, 0.25);
plate(shift([[315, 244.5], [324, 243], [327, 235], [315, 236.5]], 1.3, 1), PALETTE[2], 1.0, 3.0, 14, 0.3);
ink(302, 238, 327, 235, 1.3); ink(305, 246, 324, 243, 1.2);
for (let i = 0; i < 5; i++) ink(305 + i * 4.8, 245.5, 304 + i * 5, 237, 0.7, "pen");
plate([[307, 236], [304, 230], [309, 226], [312, 231], [314.5, 225], [318, 231], [321, 236]],
PALETTE[5], 1.5, 1.3, 84, 0.25);
ink(314.5, 231, 314.5, 224, 1.9, "charcoal", PALETTE[5]);
// 6 — the harbour: a ruled plate that thins downward, broken dashes, the pedestal's reflection
fadePlate([[176, 658], [656, 658], [668, 694], [164, 694]], PALETTE[4], 1.2, 3.8, 0, 0.75);
brush.hatchStyle("cpencil", PALETTE[4], 1.3);
brush.noStroke(); brush.noFill();
brush.hatch(4.2, 0, { rand: 0.12, continuous: false, gradient: 0.5 });
brush.polygon([[204, 658], [634, 658], [640, 678], [198, 678]]);
brush.noHatch();
for (let i = 0; i < 46; i++) {
const y = 660 + i * 0.72 + g(0, 0.5, -1, 1);
const x0 = 172 + random(0, 330);
const len = constrain(randomGaussian(120, 66), 16, 340);
if (x0 + len > 690) continue;
ink(x0, y, x0 + len, y, g(1.25, 0.3, 0.7, 1.9), random() < 0.65 ? "2B" : "cpencil", random() < 0.75 ? PALETTE[4] : PALETTE[2]);
}
for (let i = 0; i < 14; i++) {
const y = 659 + i * 2.4;
ink(310 + g(2, 2, -2, 6), y, 418 - g(2, 2, -2, 6), y, g(1.2, 0.25, 0.7, 1.7), "2B", i % 3 ? PALETTE[3] : PALETTE[1]);
}
// one ferry low on the right — a dash, a bow nick and a funnel
ink(534, 674, 572, 674, 2.6, "charcoal");
ink(572, 674, 577, 670, 1.4, "charcoal");
ink(552, 672, 552, 666, 1.5, "charcoal");
ink(240, 656, 500, 656, 1.3);
// 7 — last darks: crisp ends on the granite mass, the shadow at the foot of the pedestal
ink(316, 477, 308, 604, 1.0); ink(414, 600, 404, 475, 1.4);
ink(NEAR, 426, NEAR, 596, 0.8, "pen");
fadePlate([[300, 570], [NEAR, 566], [414, 570], [416, 600], [NEAR, 598], [308, 604]], PALETTE[2], 1.1, 3.2, 90, 0.7);
ink(332, 430, 337, 392, 1.05); ink(341, 340, 340, 325, 0.9);
ink(391, 428, 390, 394, 1.45); ink(386, 340, 385, 326, 1.25);
// the balcony cornice re-ruled over the figure's foot, so the copper ends on a hard stone edge
ink(314, 433, NEAR, 426, 1.4); ink(NEAR, 426, 404, 429, 1.4);
}