The algorithm you've used seems pretty good - except for the Z value.
The thread I linked shows a process that would help you correct that Z interpolation. In the attached, add the Z component of the two CurveMidConnects midpoints (Yellow Points), and then subtract the Z value from the BiLinearMidConnect's midpoint (Magenta). That value matches the associated EdgeSurf point (Cyan).