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);
}
}