(31 Aug 2021 at 22:57)
|Hello! It's vacation season around here, this time a trip to see some vaccinated and covid-tested friends in northern Michigan on a lake. I thought maybe I'd get some recreational programming done while I was up there, but the atmosphere was a bit more like kids, commotion and party than it was like meditative retreat with just a typewriter and an acoustic guitar, but that was okay too.|
Earlier in the month, I worked on adding stuff to my bespoke machine learning setup ("tom7flow"), since I have recurring urges to use this for wacky projects, and a specific thing in mind to try for Destroy FX (of course this very hacking distracted me from just finishing the one last piece of the Buffer Override UI, after which we can just release those bad boys!). I added support for convolutional layers, a classic trick for reducing the number of parameters by repeating the same pattern over and over. For example when trying to do some processing of a NES video frame, of size 256x240, instead of having a layer with 256x240 "pixels" on it with independent weights, you might instead learn weights for an 8x8 block but repeat that 32x30 times. In fact I revived some earlier failed NES ML project (it looks like I never posted about it?) as an example to develop with, and I can at least show you the pretty ways that it distorts NES graphics:
I love those dirty pixels. I even "wasted" an additional afternoon building a real-time version that lets me play games through the model at 60fps (also with sound; unnecessary!), and then played glitchy Nintendo games for a while. Unnecessary! And speaking of pixels, with my new high-DPI monitor I've been futzing again with the fonts I use, and I've decided to go back to the venerable FixedSys (my all-time favorite bitmap font), but to use it at 2x size. I like the giant fonts for my aging eyes, but also to reduce the visual distractions when I'm writing or programming. (To be clear the draw of a big high-resolution monitor for me personally is mostly about the visual quality of images, video, and games, not about 'screen real estate' to pack full of blinkenlights and multi-pane IDEs.) In order to revive this font I manually converted it to a fake-bitmap TTF (using previously described convenient tech) and fixed some of the few flaws with the font (e.g. I think the  characters descend lower than they should) and added some missing unicode characters that I'd like to have around, yielding FixederSys. I managed to get it rendering perfectly in emacs, and I'm really happy with it now! Since I'm using it at 2x, I have in mind that I may be able to improve this font further using the increased bitmap resolution, while still keeping the chunky pixel character that I admire. So I will try that out on some rainy day.
In media news, I finished up Sniper Ghost Warrior II: Contracts: Ghost Killer Snipe Wars or whatever, which was what I was in the mood for, I guess. I finally got around to playing Ghost Trick since they fixed some serious playability issues on iOS. It was creative and great and I endorse the consensus that it's an oft-overlooked gem. Then I started Filament, which is a pretty neat puzzle game that I'm enjoying so far, although I'm not sure I will 100% this one with Psychonauts 2 just sitting there teasing me to be played!
|So how hard is it to make a fake bitmap ttf? I've got the sgi console font in a true bitmap font format (.font) and none of the online sites are interested in converting to a modern font format that window 10+ demands.
|Is this just an autoencoder or is something more fancy going on?|
|Since TTF uses integer coordinates, it seems to me that you get perfect results if you size the grid so that the source pixels fall exactly on the grid, and then just outline the shape. It seems to help to explicitly turn off anti-aliasing when rasterizing it, too, although only if you are super picky (I am).
If you want to try to convert a font, you could try my "makesfd" here (it's just standalone C++17):
although you probably need to manually make the input image (see e.g. fixedersys.png and its associated cfg file). You have to load the generated SFD format with FontForge to actually generate the TTF. It's also possible that FontForge already has a way to do this, especially if you already have some kind of font file.
The NES images pictured are basically just an autoencoder I was using to test out, yes!
|Thanks for the fontadvice.
So are you just autoencoding a game with it's own representation, or something slightly more fun like training on mario and then using the network on zelda? Hmm, could be fun to encode on snes mario and the use the network to visualize nes mario.