A room strung like the inside of an instrument.
A tall, empty room, drawn as twelve hairlines, strung like the inside of an instrument. Cords hang in bundles from rails across the ceiling and from the walls, side by side, each sagging a little more than the one before, so they sweep through the room together like strings. Single cords wander between them, and heavy straps, sometimes hung in pairs, turn slowly about their length. One strap and one bundle are signal orange. Every cord hangs along a catenary, the curve of a chain under its own weight, and plumb lines drop from the straps and rails, each with a weight at its end. If a cord has too much slack for the room, it is pulled up until it clears the floor.
Play it and the room turns. Every so often the cords are taken down and others are strung, each going up from one anchor to the other. Switch the ground to paper to draw it in black on white.
The hang
javascript·vox.js
// a chain of length L between anchors `span` apart and `rise` apart in height
// hangs on y = a·cosh((u − u0) / a) + c, where 2a·sinh(span / 2a) = √(L² − rise²)
let lo = log(1e-3), hi = log(1e3);
for (let i = 0; i < 60; i++) {
const a = exp((lo + hi) / 2);
if (2 * a * sinh(span / (2 * a)) > level) lo = (lo + hi) / 2;
else hi = (lo + hi) / 2;
}
const u0 = span / 2 - a * atanh(rise / L);
const c = A.y - a * cosh(-u0 / a);
The bundles
javascript·vox.js
// cords side by side from neighbouring anchors, each with a little more slack than the last
const side = normalize(cross(B - A, up));
for (let i = 0; i < n; i++) {
const offset = side * (i - (n - 1) / 2) * gap;
hang(A + offset, B + offset, slack * (1 + fan * i));
}
The plumb lines
javascript·vox.js
// dropped from a strap or a rail, never through the floor, a weight at the end
const from = random() < 0.65 ? pick(straps)[at] : pick(rails)(along);
const bob = from - [0, min(from.y + floor - 0.05, random(0.25, 1.4)), 0];
line(from, bob);
weight(bob, down);
References