YunoSynth v0.4.0 and Benben v0.4.0 Released

YunoSynth is a high-performance VGM playback library written entirely in Crystal. VGM files are sample-accurate music files ripped from video games. Rather than containing audio data like an MP3 or WAV file, they contain a log of the instructions that are sent to sound chips in these old game consoles and machines. This makes them much smaller (38 KB for the song below, versus what would be a 5.3 MB 192kbit MP3). YunoSynth is made up of a playback core that sends VGM instructions to various sound chip emulators that then produce PCM output.

The initial 0.1.0 release supports a large number of chips, but it’s still lacking a few chips supported by the VGM specification. My plan is to continue adding additional chips as time goes on until they are all supported. If you download any VGM files, just check the YunoSynth page to see if its chips are supported. Currently, you can play music from many arcade games, the PC Engine/TurboGrafx-16, NeoGeo, GameBoy, PC-88 and PC-98 computers, MSX2 computer, and Sharp X68000 computer.

Benben, meanwhile, is a command line player that uses YunoSynth. The program itself is written entirely in Crystal as well, though it does use bindings to PulseAudio and PortAudio to connect to your audio system. It can be used as a standalone player, and has optional effects that you can enable at will, such as a parametric EQ with unlimited bands, a configurable reverb effect, and stereo enhancement (these are also all pure Crystal lol).

Aside from playback, it’s also capable of rendering VGM files to both WAV and Au format. This is done in parallel, so the more cores you have, the faster it’ll work.

Here’s an example video where Benben is playing a song from a game called Rusty. This game is from an old Japanese computer system called the PC-98, and uses a Yamaha YM2608 for FM synthesis and ADPCM sample playback. There are more sample videos listed in the readme.

A pre-compiled x86-64 Linux binary in the form of an AppImage is available in the repo: Download v0.1.0

EDIT: v0.4.0 released: YunoSynth v0.4.0 and Benben v0.4.0 Released - #4 by MistressRemilia

22 Likes

Holy F**king ***t !

This is abslutely incredible work.

And not only that:

  • clean code with comments
  • project split in reasonable parts, usable seperately
  • with documentation and example usage code
  • links and explanations to everything neccessary.
  • even a precompiled appimage is available.

Absolutely wowed. Thank you!

2 Likes

That is absolutely remarkable! Stunning work. I downloaded the AppImage build and it works flawlessly right out of the box (using Pipewire’s PulseAudio interface). Tested a couple of Atari ST and arcade soundtracks using a range of synth chips. Just… wow. What an incredible showcase for Crystal – this thing just works, is easy to use, looks great and doesn’t crash (like some of the old C-based Winamp plugins I used to use for playback of PSF/miniPSF files etc).

3 Likes

Guess I forgot to post some updates here ^_^;

I’ve released v0.4.0 of Benben and YunoSynth today! They have had a TON of new stuff added since v0.1.0, so I’ll just summarize some of the cooler stuff here:

  • A bunch of new chip emulators: YM2612 (aka, Sega Genesis), SN764xx (also used in the Sega Genesis), YM3812, YMF262 (IBM PC), RF5C164, VSU-VUE (aka, Virtual Boy), ES5503, Y8950 (MSX), YM3526, NES, Famicom Disk System, X1-010, SAA1099, Sega 32x PWM, Wonderswan.
  • A new snazzy interface that uses my S-Lang bindings. It also shows the CPU usage now.
  • Improved performance throughout.
  • Redesigned to be more multi-threaded internally.
  • Support for libao output in addition to PulseAudio and PortAudio.
  • Optional automatic peak normalization when rendering to WAV or Au.
  • Generation of CUE files when rendering to WAV/Au.
  • The emulator/sound/player code is still 100% Crystal. The only bindings here are S-Lang, ZStandard, and the audio outputs (e.g. PortAudio).

A Linux x86-64 AppImage is available for download like usual.

14 Likes