Lookup is the way to go. In the following example i have raised the midtones while defining a black point greater than zero and white point less than 1 and constraining them so that they dont change.
CODE
Lookup1 = Lookup(0, HermiteV(x,1,[0,52.37,52.37]@0,[0.1115,50.25,54.18]@0.1035,[0.6942,44.88,44.88]@0.4283,[0.8831,46.95,48.72]@0.8835,[1,50.11,50.11]@1),
HermiteV(x,1,[0,52.37,52.37]@0,[0.1115,50.25,54.18]@0.1035,[0.6942,44.88,44.88]@0.4283,[0.8831,46.95,48.72]@0.8835,[1,50.11,50.11]@1),
HermiteV(x,1,[0,52.37,52.37]@0,[0.1115,50.25,54.18]@0.1035,[0.6942,44.88,44.88]@0.4283,[0.8831,46.95,48.72]@0.8835,[1,50.11,50.11]@1),
JSplineV(x,1,0@0,1@1));
Using add, gama and multiply for black points white points and midtones is a valid (and very popular) way to work. even if your white point isnt white, gamma wont change it very much. You just have to do a bit of backwards and forwards to get things right.