Is it possible to design arbitrary interpolation curves, a bit like the builtin LinLin UGen, but with arbitrary number of points and curves?

I’ve worked out how to create envelope shapes like this, but is it possible to design an interpolation curve for, say, a control parameter in a similar way?

I know this kind of thing can be done with lookup-tables, but wondered if SuperCollider provided an easier way of doing it.

I was also thinking about Envs, in particular Env.xyc, which allows you to create an Env by providing xy coordinates and curve for each point.
You can read it on the server with IEnvGen, or use it on the client as a Spec:

// actually the last point's curve is ignored
~env = Env.xyc([[0, 0, \sin], [0.5, 0.1, \sin], [1, 1, \lin]]);
~env.plot();
// map: get y for x
~env.asSpec.map(0); // -> 0
~env.asSpec.map(0.5); // -> 0.1
// unmap: get x for y
~env.asSpec.unmap(0.1); // -> 0.5
~env.asSpec.unmap(0.5); // -> 0.73227952719877
// EDIT: I had a typo here, wrote map instead of unmap, now it is correct