Library oneonone.el
oneonone.el
gives you this out of the box.
Just customize option 1on1-minibuffer-frame-top/bottom
to the position you want for the standalone minibuffer frame. The value is the number of pixels from the top (if non-negative) or the bottom (if negative) of your display. For example, set the value to your display height divided by 2, to center it vertically.
If you instead want it to be positioned dynamically, say in the vertical center of the current frame, then you can do that by (a) leaving 1on1-minibuffer-frame-top/bottom
= nil
and (b) advising function 1on1-set-minibuffer-frame-top/bottom
to bind that variable dynamically to the appropriate position. For example:
(defadvice 1on1-set-minibuffer-frame-top/bottom (around center activate)
(let ((1on1-minibuffer-frame-top/bottom (my-dynamic-position ...)))
ad-do-it))
(Define function my-dynamic-position
to calculate the position you want, based on whatever criteria you want (current window/frame size & position, phase of the moon,...).