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:
- You have not used seek-forward on the track.
- The track is at least 15 seconds long.
- The track has Title and Author information in it.
- One of the two has happened:
- If the track four minutes long or less, you must have reached the halfway point in the song.
- If the track is over four minutes long, then you must have reached the four minute mark.
For “Now Playing” submissions:
- The track must be at least 15 seconds long.
- You’ve listened to at least 10 seconds of the track.
- The track must have Title and Author information in it.
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”.
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:
- Whether or not repeating of the entire playlist is enabled (
R
for enabled,r
for disabled). - Whether or not the “stop after current” feature is enabled (
S
for enabled,s
for disabled) - Whether or not the “pause after current” feature is enabled (
P
for enabled,p
for disabled)
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”…
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:
--vgm-dmg-boost-wave-chan
and--vgm-no-dmg-boost-wave-chan
were added to allow you to override thedmg-boost-wavechan
config option. The default is to boost the WAVE channel.- The
--vgm-ym2612-pseudo-stereo
and--vgm-no-ym2612-pseudo-stereo
options override theym2612-pseudo-stereo
config option. The default is to not enable YM2612 pseudo stereo output.
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:
--basedir
lets you specify an alternate directory to store both config/theme files and where files likestderr.log
and your remote socket get created. It’s a lot like specifying an alternate base directory for a Quake game, if you’ve ever played Quake.--fadeout-seconds
lets you change how long certain formats (e.g. VGM) fade out at the end. This overrides any configuration option you may have.--midi-soundfont
lets you specify an SoundFont file to use for MIDIs without having to edit your configuration file. In other words, it overrides the config settings.--midi-reverb-type
lets you specify what kind of reverb unit to use for MIDI files.--no-song-configs
prevents any song-specific config files from being loaded.--start-paused
tells Benben to startup normally, and immediately pause playback.--recurse
and--no-recurse
tells Benben to either recurse subdirectories when loading files, or not to. It overrides the new boolean configuration optionrecurse-directories
.--sid-mono
tells Benben to play 2SID and 3SID files as mono (one audio channel).--sid-def-length
changes the default length for SID files when they either can’t be found in the song length database, or you have no song length database. The default length is three minutes.
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:
- My related project, XQATool, is specifically for converting Au/WAV to either normal QOA, or Extended QOA Format (XQA).
- Better tools already exist: XQATool, and the official WavPack command line program. It makes little sense to duplicate what these can already do (and do better).
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.