Scarlet Devil Mansion

2 August 2025

Benben 0.7.0 Feature and Changes Overview

The second candidate for Benben v0.7.0 is out today, so I figured I’d give an overview of what’s new and what has changed since v0.6.0. ‘Cause hoooo boy is there a lot of changes.

In fact, this post isn’t even exhaustive. It’s just the most prominent changes. For a more full list of changes, check the NEWS file in the source repository.

If you want to download Benben v0.7.0-RC2 as an x86-64 AppImage for Linux, you can do so on the releases page.

Rewritten in Common Lisp

The biggest change is that the entire program has been rewritten in Common Lisp, including all the support libraries. Versions prior to v0.7.0 were written in Crystal, but as I outlined in two of my previous blog posts, it was time to rewrite it in Common Lisp. The primary reason, which I alluded to but never specifically mentioned, was that Crystal’s changes were causing some things that Benben used to stop working (specifically the CRYSTAL_WORKERS bit), and were just getting a bit annoying. Crystal’s execution contexts were also not ready yet, and since I also needed to ensure I supported at least Crystal back to v1.5.x on top of newer versions, it was just getting frustrating. Common Lisp (specifically SBCL) doesn’t have this issue, nor does it have issues with accessing threads directly.

For end-users though, the rewrite won’t feel that much different. You’ll notice some mild difference in performance (Common Lisp is almost as fast as Crystal - it should still run fine on a Raspberry Pi 4 in most cases), memory usage, and binary size, but that’s about it. These will continue to improve over time. A few regressions not caught by testing yet may have popped up as well just due to the fact that the entire codebase was rewritten, but these should be far and few between by now.

Also, another benefit to the rewrite: Benben now uses SIMD when possible at various points in its audio path to increase performance. This does raise the minimum requirements slightly to at least an Intel Haswell generation CPU, however. Since these chips came out 11 years ago, I expect that the vast majority of users will not be impacted by this change.

Breaking Changes

There’s been a number of changes to various configuration names and command line arguments. To start, all format-specific command line arguments are prepended with their format name, so for example all VGM-related arguments start with --vgm-.... See benben --help for a listing of all the arguments.

Next, the TCP driver format names have changed, so if you’re using the TCP output driver, you’ll need to adjust these. Use benben --tcp-driver-format list to see a listing of the new names.

Continuing with the config changes, the reverb preset names and resampler names have also changed. Similar to the TCP formats, you can use benben --reverb-preset list and benben --resampler list to get a list.

Lastly, the PulseAudio and PortAudio drivers have been removed. But, new ones were added, so see the next section to learn about the audio backend changes.

New Audio Backends and Audio Effects

Two new audio backends have been added to Benben: out123 and alsa. The out123 backend uses libout123 and should cover nearly all use cases while also providing good performance. The alsa backend outputs directly to ALSA, while ao uses libao like in previous releases.

There is also an any driver which will attempt to select the best driver for your system. This tries out123 first, then tries alsa if that fails, and finally falls back to ao. Benben v0.7.0 will default to using any if you haven’t configured it to use a specific driver.

ListenBrainz Support

Benben v0.7.0 can now submit your listens to your ListenBrainz account. To enable this, you must add the following to your config file:

yaml listenbrainz: token: <your token here>

There are two types of things that get submitted: a “Now Listening” and a “Listen”. The “Now Listening” is ephemeral on ListenBrainz and shows up under the (surprise surprise) “Now Listening” box on your profile. Normal “Listens” are the actual recorded history of what songs you’ve listened to that appears in your ListenBrainz profile.

The way Benben determines when to submit these to ListenBrainz is modeled after Foobar2000. For normal “Listens”, tracks are submitted only if:

For “Now Playing” submissions:

Additionally, only these formats are submitted: MPEG-1 (mp3, mp2, mp1), Vorbis, WavPack, FLAC, Opus, Extended QOA Format (XQA), VGM, and SID. The other formats don’t support enough metadata to make a meaningful submission.

Extended QOA Format Support

Benben v0.7.0 has full support for the new Extended QOA Format. This is a new lossy audio format that provides good compression, very fast decompression, and full metadata support.

UI Changes

There are now two user interfaces in Benben: the “Original UI”, which is the TUI interface you’re already used to, and a “Minimal UI”.

Benben running with its Original UI, playing 'Stranger Danger' by Ayria using the 'trans-pride' theme.

The Original UI has seen a few additions since v0.6.0. First, you can now hit U (capital U) to enable “pause after current”. This tells Benben to pause the player immediately after the current track finishes. Related to this is the [rsp] bit at the bottom of the interface. This indicates three things:

The extended information display (shown by pressing I) also displays a few extra bits of information now.

Next, the current run time for the entire playlist is displayed next to the total time at the bottom of the song queue.

Finally, there’s a new config option in the ui section: display-loop-times-separate. When this is true, then tracks that have loop information (e.g. VGMs) will display the length of one loop in parentheses next to their total time for all loops in the song queue.

Now, about that new “Minimal UI”…

Benben running with its Original UI, playing 'Stranger Danger' by Ayria using the 'trans-pride' theme.

When I first started porting Benben over to Common Lisp, I quickly realized I needed some sort of interface to test it. But, porting the entire UI over at the same time as all the low-level code would have been fraught with issues. So, to compensate, I quickly whipped up a minimal UI that just prints stuff (no neat TUI things or ANSI control character shenanigans)… and it turned out that UI was actually quite nice to use. So, rather than use it a just temporary UI, I decided to make that an alternate official UI.

The Minimal UI is just that: very minimal. You can’t control Benben directly from it, so you have to use the remote-benben program to control it, and it just prints basic information out to the screen. It’s especially useful if you run a headless machine and want to use it for music, just want to run Benben remotely through some SSH connections, or of course, when you want to debug Benben in a Slime REPL. Most users will just want to use the Original UI (which is still the default), but the new Minimal UI is there if you want to try it out.

VGM Changes

First off, VGM files now seeking! 🎉

Next, some VGM files have wonky GD3 tag data in them that isn’t 100% to spec. Previous Benben versions would just silently load the GD3 as best as they could. This is still the default behavior, but for those of you who want to be extra pedantic about VGMs, the new --vgm-strict-gd3-loading command line argument has been added. This will tell Benben to be very strict about loading GD3 data, and if it encounters any issues, it will ask you what you want to do.

Next, there are some new VGM-related command line options to better customize your VGM experience:

Finally, there is a new VGM-related configuration option: max-file-size. This is a value, in bytes, that places an upper limit on the size of files that Benben will look at when its determining if a file is a valid VGM or not. Its value is in bytes, and the default (which should cover all existing VGMs) is 60 megabytes.

More Thorough ReplayGain Support

ReplayGain is now supported for WavPack, MPEG-1 (mp3, mp2, mp1), Vorbis, Extended QOA Format (XQA), Opus, and FLAC files. This should now cover all formats that can potentially use ReplayGain.

New Command Line Arguments

There’s even more new command line arguments on top of the ones I’ve already mentioned:

Removed

As I mentioned above, the PulseAudio and PortAudio drivers have been removed. You can still use PulseAudio by using the new out123 driver, however (in fact, your system will probably default to using PulseAudio via out123).

But aside from that, there’s been one other removal since v0.6.0: Benben can no longer render directly to QOA or WavPack. This means the --qoa and --wavpack command line arguments are gone, and there is no way to render to disk directly in these formats These were removed for two reasons:

Wrap Up

So that’s about it! As I said, there’s a more exhaustive list of changes in the NEWS file in the source repository, so you may want to check that out as well. Be sure to also check out the releases page for the newest release candidate AppImages as they become available.