$10.00

1-bit pulse-train polyphony

RKW-2 is an homage to the pioneering work of Tim Follin, who achieved extraordinary things with the beeper of the Sinclair ZX Spectrum.

The RKW-2 sound engine imitates the behaviour of the audio loop in Follin's sound engine for the "Chronos" soundtrack. Each polyphonic voice writes a short square-wave pulse to the output at a regular interval based on its pitch/frequency; when two or more pulses collide, they are ordered into a pulse train and played immediately one after another.

The result is a pointillistic synthesis approach in which true polyphony is achieved despite only having a single 1-bit output (beeper on / beeper off) to control. It's noisy, and can become chaotic, but it has a unique texture that will inspire instant nostalgia in those who remember the classic Spectrum games these techniques were used on.

The pulse width of each voice's pulse is independently controlled by its "velocity" - shorter pulses sound quieter - so that timbre and perceived volume are inextricably combined. Additional controls shape the overall size of the pulses emitted, add timing jitter (scaled by the number of voices playing) for extra authenticity.

Controls

There are two polyphonic inputs, one for pitch (V/Oct, i.e. a variation of one octave per volt of input signal) and one for velocity. No note is played by a channel if the velocity input for that channel is zero or lower; above zero, it controls the pulse width of the pulses emitted by that channel's voice.

The jitter control adds timing jitter, for a slightly "wider" sound (due to pitch variation) which is closer to the timing inaccuracies inherent in Follin's original sound engine.

The pulse size control sets the size (in samples, at 96kHz) of the pulses emitted.

The output mode switch toggles between BP ("beeper") mode and TV ("TV speaker") mode, each of which has its own EQ profile applied to the 1-bit output signal.

Technical details

The RKW-2 sound engine runs at 96kHz, and is downsampled to 48kHz. The original Follin engine ran on a 3.5mHz Z80 CPU with all timings controlled by machine-code busy-loops. Rather than trying to reproduce the exact timings of these loops (with different Z80 instructions taking different numbers of CPU cycles...) I've opted to copy the basic idea of emitting short pulses and ordering them into a pulse train rather than mixing them by some other method (see the RKW-1 for examples of alternative mixing approaches).

Programming the original engine required adapting voice frequencies to compensate for timing variance when multiple voices coincided - the RKW-2 is reliably clock-synced to the sample rate, but allows the introduction of jitter to simulate some of this variability.