function interpolateCosine([ar, ag, ab], [br, bg, bb], [cr, cg, cb], [dr, dg, db]) {
return t => `rgb(${[
ar + br * Math.cos(2 * Math.PI * (cr * t + dr)),
ag + bg * Math.cos(2 * Math.PI * (cg * t + dg)),
ab + bb * Math.cos(2 * Math.PI * (cb * t + db))
].map(v => Math.floor(Math.max(0, Math.min(1, v)) * 255))})`;
}