svg`<svg width="${w}" height="${h}">
<rect x="0" y="0" width="${w}" height="${h}" stroke="none" fill="black"></rect>
${array(n).map(() => {
const x = randInt(w)
const y = randInt(h)
const v = PVector(x, y)
return `<path
opacity="1"
stroke="${palette[randInt(palette.length)]}"
stroke-width="${(expRand(1, 9, 20))}"
stroke-linecap="round"
stroke-dasharray="${array(200).map(() => randInt(2, 30)).join(' ')}"
fill="none"
d="M${v.x} ${v.y} ${array(trailLength).map(() => {
const angle = (simplex.noise3D(v.x/noiseScale, v.y/noiseScale, seed) * 4 | 0) * TAU / 4
v.add(PVector.fromAngle(angle).setMag(stepLength))
return `L${v.x} ${v.y}`
}).filter(d => d).join(' ')}"
/>`
}).join('\n')}
</svg>`