September th, 2015

New ZX Spectrum Beeper Engine: Tritone FX

Strangely enough, after finishing the 7d7e project, I was even more in the mood to create new 1-bit sound routines. So today I present you Tritone FX, a clone of Shiru’s Tritone engine with some added features.

In recent years, there has been a tendency to use Tritone at very high speed levels in order to pull off advanced sound effects. Frankly I was never a very big fan of this, as I think it leads to an awfully muddy sound. So I’ve drawn up a concept that should render the need for this high speed trickery obsolete.

I remember discussing an FX-oriented scheme with Shiru back in 2011, but failed to convince him, and I wasn’t able to implement something like that myself back in the day either. Well, now I can and so I did, hehe.

The new concept is based on an observation propagated by introspec. The idea here is that when implementing timing with an inner and an outer loop (decrementing the low and high bytes of a 16-bit counter seperately), the outer loop does not need to be timing-stable. With Tritone FX, I started to explore where the limits of this approach are, and as it turns out, they are rather generous. They are in fact generous enough to update a bunch of parameters by reading an FX table during the counter update, which is exactly what Tritone FX does. This allows you to create fast arpeggios, and update the duty settings on the fly. I also added the capability to generate noise instead of tones on one of the channels.

The downside is that this behaviour is too complex to simulate with an XM template, so as of now the routine remains without a user interface. I hope that one day it will be implemented in Beepola and/or 1tracker, but until then the only way to make music with it is to hard-code everything in machine language.

If you’re curious enough, you can grab the sources from my github, or listen to the demo tune.