##JavaScript (ES6), 156 144 136 134 bytes
Sadly, the infamous String.fromCharCode()
costs 19 bytes.
f=(x=y=!(k=32))=>k<127?(++x-22?(y+1>>1==5|y<9&x>>1==5|y>9&('11'[x-y]|'11'[21-y-x]))?String.fromCharCode(k++):' ':(x=!++y,`
`))+f(x):''
console.log(f())