##JavaScript (ES6), 156 144 136 134 122 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:x-y>>1&&21-y-x>>1)?' ':String.fromCharCode(k++):(x=!++y,`
`))+f(x):''
console.log(f())