WORK 32
きれめ
The band at the top is the field itself: light and dark, continuous, with no seam anywhere in it. Below it the same field is cut eight times, at thresholds no more than six hundredths apart. Almost nothing changes. The wide masses stay wide, the gaps stay gaps — only the edges creep. Which is to say: move the line a little and it costs almost no one anything, except whoever was standing at the edge, for whom inside and outside have just traded places.
いちばん上の帯が、場そのもの。濃いところと薄いところがあって、連続していて、どこにも切れ目がない。その下で、同じ場が八回切られている。しきいの差は、いちばん低い線といちばん高い線でも 0.06 しかない。ほとんど何も変わらない。大きな塊は大きなまま、隙間は隙間のまま——動くのは、端だけ。つまり、線を少し動かしても、ほとんどの者には何の代償もない。端に立っていた者だけが、内と外を入れ替えられる。
作るときは「同じ場から、まったく違う二分割が出てくる」を見せるつもりだった。そうはならなかった。 八本はほとんど同じに見える。
でも、よく見ると端が動いている。大きな塊の右端が、下の帯にいくほど少しずつ後退していく。真ん中は、どの帯でも一度も変わらない。
しきいの差がごくわずかだから、「たいしたことは起きていない」と言える。
export default function sketch(p) {
const SIZE = 900;
const MARGIN = 70;
const RES = 1400;
// ほとんど同じ値。いちばん低い線といちばん高い線の差は 0.06 しかない。
const THRESHOLDS = [0.470, 0.482, 0.491, 0.497, 0.503, 0.510, 0.519, 0.530];
const PAPER = [239, 235, 226];
const INK = [42, 39, 36];
const OUT = [206, 200, 189];
let field = [];
function buildField() {
field = [];
let lo = 1, hi = 0;
for (let i = 0; i < RES; i++) {
const x = i / RES;
// 大きなうねりに細かい揺れを重ねる。切れ目はどこにもない。
const v =
p.noise(x * 3.1, 11.3) * 0.62 +
p.noise(x * 9.7, 41.9) * 0.26 +
p.noise(x * 23.0, 77.1) * 0.12;
field.push(v);
if (v < lo) lo = v;
if (v > hi) hi = v;
}
// 0..1 に伸ばす。差そのものは場に実在する。
for (let i = 0; i < RES; i++) field[i] = (field[i] - lo) / (hi - lo);
}
function sampleAt(px, w) {
const i = p.constrain(p.floor((px / w) * RES), 0, RES - 1);
return field[i];
}
p.setup = () => {
p.createCanvas(SIZE, SIZE);
p.noiseSeed(20260804);
buildField();
p.noLoop();
};
p.draw = () => {
p.background(PAPER);
const w = SIZE - MARGIN * 2;
const x0 = MARGIN;
// ── 上:場そのもの。連続していて、どこにも切れ目がない ──
const fieldTop = MARGIN;
const fieldH = 128;
p.noStroke();
for (let px = 0; px < w; px++) {
const v = sampleAt(px, w);
// 濃淡は実在する。でもこれは境界ではない。
const g = p.lerp(232, 74, v);
p.fill(g, g - 3, g - 9);
p.rect(x0 + px, fieldTop, 1.4, fieldH);
}
// ── 下:同じ場に、ほとんど同じ位置でしきいを当てた結果 ──
const bandTop = fieldTop + fieldH + 74;
const bandH = 48;
const gap = 22;
THRESHOLDS.forEach((t, row) => {
const y = bandTop + row * (bandH + gap);
let runStart = null;
let prevIn = false;
for (let px = 0; px <= w; px++) {
const isIn = px < w ? sampleAt(px, w) > t : false;
if (isIn && !prevIn) runStart = px;
if (!isIn && prevIn) {
p.noStroke();
p.fill(INK);
p.rect(x0 + runStart, y, px - runStart, bandH);
runStart = null;
}
prevIn = isIn;
}
// 「外」側は薄く敷く。分けられた以上、外にも名前がつく。
p.noFill();
p.stroke(OUT);
p.strokeWeight(1);
p.rect(x0, y, w, bandH);
});
};
}