// Grid interference with tempo-driven color
for (let y = 0; y <= rows; y++) {
for (let x = 0; x <= columns; x++) {
const value = Math.sin(x * freq + t) * Math.cos(y * freq + t);
ctx.arc(x * spacingX, y * spacingY, radius * value, 0, TWO_PI);
}
}
DNA helix
Two counterphase strands with diagonal drift.
// Counterphase strands with diagonal drift
for (let y = 0; y <= height; y += 6) {
const xOffset = Math.sin(y * freq + time) * amplitude;
ctx.moveTo(centerX + xOffset, y);
ctx.lineTo(centerX - xOffset, y);
}
Fluid column
Vertical flow with volumetric thickness.
// Vertical flow with volumetric thickness
for (let y = 0; y <= height; y += 6) {
const offset = Math.sin(y * freq + time + col * 0.6) * amp;
ctx.lineTo(columnX + offset, y);
}
Diagonal rain
Angled strokes with tempo-locked shimmer.
// Angled strokes with tempo-locked shimmer
for (let i = 0; i < count; i++) {
const drift = Math.sin(time + i * freq) * amplitude;
ctx.moveTo(baseX + drift, baseY);
ctx.lineTo(baseX + drift + 24, baseY + 38);
}
Lissajous orbit
Parametric loops synced to time signature.
// Parametric loops synced to time
for (let i = 0; i <= 240; i++) {
const t = (i / 240) * TWO_PI;
const x = cx + Math.sin(t * freq + time) * amp;
const y = cy + Math.sin(t * (freq + 1) + phase) * amp;
}
Waveform terrain
Layered horizons with depth-shifted phases.
// Layered horizons with depth-shifted phases
for (let layer = 0; layer < 8; layer++) {
for (let x = 0; x <= width; x += 6) {
const y = baseY + Math.sin(x * freq + phase) * amp;
ctx.lineTo(x, y);
}
}
Radial bloom
Outward pulses that peak on the downbeat.
// Outward pulses on the downbeat
for (let r = 18; r < radiusMax; r += 12) {
const offset = Math.sin(r * freq + time) * pulse;
ctx.arc(cx, cy, r + offset, 0, TWO_PI);
}
Gradient fill
Area under the wave filled with a linear gradient.
// Area fill with linear gradient
const grad = ctx.createLinearGradient(0, top, 0, height);
for (let x = 0; x <= width; x += 4) {
ctx.lineTo(x, centerY + Math.sin(x * freq + t) * amp);
}
ctx.fillStyle = grad;
ctx.fill();
Audio visualizer
Simulated volume-driven multi-wave display.
// Volume-driven multi-wave display
waveConfigs.forEach((cfg) => {
for (let x = 0; x <= width; x += 4) {
const y = centerY + Math.sin(x * cfg.freq + t * cfg.speed) * amp;
ctx.lineTo(x, y);
}
});
Vertical wave
Rotated orientation for liquid-rising effects.
// Rotated orientation for liquid-rising effects
for (let y = 0; y <= height; y += 4) {
const x = centerX + Math.sin(y * freq + time) * amp;
ctx.lineTo(x, y);
}
Dash array
Dotted and dashed wave lines via setLineDash.
// Dotted and dashed wave lines
ctx.setLineDash([12, 6]);
for (let x = 0; x <= width; x += 4) {
const y = centerY + Math.sin(x * freq + time) * amp;
ctx.lineTo(x, y);
}
Variable width
Pulsing line thickness synchronized to tempo.
// Pulsing line thickness per segment
for (let x = 0; x < width; x += 6) {
const thickness = 1 + Math.abs(Math.sin(x * 0.01 + t * 2)) * 4;
ctx.lineWidth = thickness;
ctx.lineTo(x, centerY + Math.sin(x * freq + t) * amp);
}