six samplers, one limiter trick

Static Field

A wave-driven take on random(155) + 100. Three slow base samplers set a per-channel floor in [0, 155]. Three faster field samplers add 0..100 on top, per cell. Each channel stays inside a moving 100-wide window that drifts and morphs.

Core snippet
// Slow base: per-channel floor in [0, 155]
const baseR = Waves.createSampler({
  shift: true, group: 'gentle',
  range: [0, 155], frequency: 0.20,
  shiftInterval: 7, shiftDuration: 2
});
// ...baseG, baseB with their own frequencies

// Fast field: 0..100 added per cell
const fieldR = Waves.createSampler({
  shift: true,
  group: ['classic sine', 'triangle', 'bumpy sine',
          'mountain peaks', 'wobble sine'],
  range: [0, 1], frequency: 0.08,
  shiftInterval: 4, shiftDuration: 1.5
});
// ...fieldG, fieldB with their own groups

// In draw:
const r0 = floor(baseR.sample(0, t));
const g0 = floor(baseG.sample(100, t));
const b0 = floor(baseB.sample(200, t));
for (let y = 0; y < height; y += 8) {
  for (let x = 0; x < width; x += 8) {
    const rp = fieldR.sample(x + y*0.35, t);
    const gp = fieldG.sample(x*0.3 + y,  t);
    const bp = fieldB.sample(x*0.7 - y*0.25, t);
    fill(r0 + rp*100, g0 + gp*100, b0 + bp*100);
    rect(x, y, 8, 8);
  }
}