svg`<svg width="${w}" height="${h}">
<defs>
<filter id="shadow" x="0%" y="-50%" width="100%" height="100%">
<feOffset result="offOut" in="SourceGraphic" dx="0" dy="0" />
<feColorMatrix result = "matrixOut" in = "offOut" type = "matrix" values = "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0"/>
<feGaussianBlur result="blurOut" in="matrixOut" stdDeviation="10" />
<feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
</filter>
${array(ny).map(i => {
return `<linearGradient id="linegrad${i}" x1="0" y1="0" x2="1" y2="0">
${array(randInt(2, 4)).map((d, j, arr) => {
return `<stop offset="${j / (arr.length - 1) * 100}%" stop-color="${colorScale(Math.random())}"/>`
}).join('\n')}
</linearGradient>`
}).join('\n')}
</defs>
<rect x="0" y="0" width="${w}" height="${h}" stroke="none" fill="black"></rect>
<g>
${(() => {
return array(ny).map(i => {
const Y = (h + 200) / (ny - 1) * i - 100
let x = 0
let y = Y + simplex.noise3D(x, Y/noiseScale, seed) * amp
const step = w / nx[i]
return `<path stroke-width="1.5"
d="M -10 ${h + 200} L0 ${y} ${array(nx[i]).map(() => {
let px = x
x = x + step
let py = y
y = Y + simplex.noise3D(x/noiseScale, y/noiseScale, seed) * amp
return `C ${px + step / 4} ${py}, ${x - step / 4} ${y}, ${x} ${y}`
}).join(' ')} L ${w + 10} ${h + 200} "
stroke="none"
fill="url(#linegrad${i})"
filter="url(#shadow)"
opacity="1"
/>`
}).join('\n')
})()}
</g>
</svg>`