Scarlet Devil Mansion

05 June 2023

Plans for The Next Few Months

I figured I’d write up a gemlog where I mention the plans I have for the next few months. Partially because my Mastodon/Misskey accounts are probably not the right place, and also so that I have something to look back on ^_^

Where I’m At Now

So the first 1/3rd or so of last year was mainly spent writing CL-MeltySynth, Haematite, and midi123. These turned out pretty well, I think, and while CL-MeltySynth is currently a bit behind Haematite, and midi123 needs a bit of love, all of them still in a good, working state.

The first 1/3rd or so of this year was similar in that I spent it on a new set of projects. YunoSynth is a VGM playback library that supports most of the same chips that VGMPlay already supports (in fact, it’s based on VGMPlay, but it’s cleaned up and OOP-ified). The emulation cores are mostly from the MAME Project. Benben, meanwhile, is my new console-based player that uses YunoSynth. It was initially based on midi123 internally, but was largely restructured to have a much cleaner design. Both Benben and YunoSynth are written entirely in Crystal. The only bindings that are used (and only in Benben) are to PortAudio, PulseAudio, and ZStandard.

The main things I want to do with CL-MeltySynth are bringing it up to speed with Haematite, and removing some unneeded consing in the rendering loops. And for both of those, I would like to make it so that the SoundFont isn’t entirely loaded into RAM at startup. With midi123, I basically want to restructure it so that, internally, it’s a lot closer to Benben.

I’m really happy with how all of these have turned out. Doing larger projects like these in Crystal vastly improved my understanding of the language, and my skill set in general. But none of these are my end goal.

Near-Term Plans

For the past two (three?) weeks I’ve been doing a Common Lisp equivalent of YunoSynth called SatouSynth. Right now I’ve only got a few chips implemented, but it’s already performing very well, and I’ve got almost all of the core framework ported, save for the DAC streaming bit. My reason for creating it is actually the first of my goals for the near term: create a GUI player for VGM files using McCLIM. Doing any sort of GUI program in McCLIM is something I’ve wanted to do for a while now, because holy crap is that toolkit just wacky and totally different from everything else. Also, I haven’t found any GUI toolkits that I’m personally happy with on the Crystal side, so that’s another good excuse to use Lisp and finally work with McCLIM.

Besides, I love both languages, and I’d hate to ignore one for the other <3

I’ll likely be starting the design of the McCLIM GUI player this week now that SatouSynth supports a small handful of chips, and focus on it for the next month or so. I might also port a few other chips that are low-hanging fruit, like the YMZ280b and OKI MSM62xx chips.

One thing to keep in mind is that SatouSynth does NOT replace YunoSynth, and the GUI player does NOT replace Benben. I am fully committed to supporting YunoSynth, and extending it further with new chips and features. More generally, I’m fully committed to Crystal just as much as I am to Common Lisp. I just need a break from Crystal for a bit.

Longer Term Plans

YunoSynth is still lacking a few chips, the big ones being the YM2612 and SN76489 (aka, the ones the Sega Genesis use). These are looking like they’ll be a PITA to port, which is why I haven’t tackled them yet. But I do want to eventually, and I might just do that after I get the GUI player in a usable state. So my primary longer term goal is adding more chips to YunoSynth, and also SatouSynth.

Beyond that, I have a VGM player (soon two) and a midi player. I also have code written that plays back FLAC and mp3 files. Why not combine them? That’s one of my more long-term goals. Whether this ends up being a command line player, a GUI, or both is yet to be seen, but that’s kind of where I want to end up with all of this.

I’m also still wanting to port a game engine to either Crystal or Lisp. My port of Doom for Crystal is still sitting around, and though it’s not playable, it does boot and show levels. But I’m honestly kinda burned out on Doom. I think instead, I’ll try to port another game, possibly OpenTyrian. If I do OpenTyrian, then maybe I can also add modding features and turn it into an actual good game, not just some euroshmup with good music :-P

In truth, I’ll probably do the game port first before I tackle the all-in-one player. For one, I don’t have much need for an all-in-one player - I have emms mode in Emacs, and that integrates with midi123 and Benben perfectly. Plus, I’ll probably want to take a break from all this audio stuff eventually.

So long-term will probably go roughly like this: more chips for YunoSynth and SatouSynth, game port of some sort, and all-in-one player.

We’ll see how it goes ^_^