##JavaScript (ES6), <s>156</s> <s>144</s> <s>136</s> 134 bytes

Sadly, the infamous `String.fromCharCode()` costs 19 bytes.

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

    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())

<!-- end snippet -->