path() · line() · asemic() · polygon(fill) · layers

Frequencies

Five signals, five markers, five notation cells. A vertical reading head follows the loudest column.

Core snippet
// One clean signal.
const plot = new GysinPlot({ seed: 40017 });
plot.path([[52, 200], [668, 200]], { stroke: "#171717" });   // one clean signal
plot.draw();

// Five signals; S3 carries the accent ink.
plot.path(signal, {
  stroke: accent ? "#b5362b" : "#171717",
  strokeWeight: accent ? 2 : 1, alpha: accent ? 0.9 : 0.6, layer: "signal"
});

// Asemic notation follows amplitude.
plot.asemic(x, top, w, h, { loops: 3 + round(amp * 6), layer: "notation" });

// A hatched diamond marks each peak.
plot.polygon(diamond(px, py, r), { fill: "hatch", layer: "markers" });

plot.draw();

Each reading has a reproducible seed, path count and reading-head channel.

New reading or R changes the seeded signals. Download SVG or S exports the current score.