Musician, mastering engineer & audio programmer.


Teufelsberg Reverb

Reverb audio plugin for Balance Mastering performing zero-latency convolution on 6 preset IRs.

Teufelsberg Reverb image

Full download and information.

Github repository



Plotting script for visualising the z-transform magnitude.


Incorporates region of convergence and unit circle into 3D plot. Also plots 2D zplane and frequency response.

Information and download



Audio equalisation plugin with state handling including A/B compare and preset file save/load in JUCE

Uses Orfanidis method for Equalisation which more accurately models the analogue prototype filter compared to standard BLT biquadratic (see below).

TestParameters02 frequency response image

More robust preset handling system for plugins. Uses more sophisticated (and more readable) parameter/slider stepping system aimed at variably stepped gain and frequency controls.

Also unit testing system that runs whenever the plugin is loaded and the JF_UNIT_TESTS=1 flag is set.

Github repository


Audio plugin performing peaking EQ with decramped frequency response at Nyquist as per Orfanidis 1997.

TestOrfanidisBiquad image

Avoids the frequency response distortion of the bilinear transform by assuming the gain at Nyquist is something other than 0 (Robert Bristow Johnson always had set this at 0). Still only uses a biquad, here implemented in direct form I for simplicity and stability.

TestOrfanidisBiquad frequency response image

The image shows high frequency behaviour more closely matches an analogue filter, allowing more 'air' into the sound than standard BLT biquad design (shown here as lighter trace).

Github repository


Audio plugin performing true-stereo convolution of Balance Mastering Funktion One impulse responses.

BalanceFunktionOne image


Details same as Balance Flipside below.

Github repository


Audio plugin performing true-stereo convolution of Balance Mastering Flipside Soundsystem impulse responses.

BalanceFlipside image


Uses Tale's threaded version of the Cockos WDL convolution engine to minimise CPU cost. WDL library allows zero-latency convolution which is a nice plus. Aleksey Vaneev's (Voxengo) high quality r8brain sample rate conversion library performs sample rate conversion of the impulse if required.

Github repository


Stepped stereo width plugin for Balance Mastering

BalanceGain image

Same programming techniques as BalanceGain below. Uses mid/side encoding decoding to vary the sum/difference channels with one knob. The readout represents the gain difference in decibels between the mid/side signals.

Github repository


Stepped gain audio plugin for Balance Mastering.

BalanceGain image

Uses filmstrip method for the knob animation. The step size controls the range of the parameter values. Which in turn the GUI knob's range is slaved off those parameter values. This leads to a slightly complex parameter handling system. Improvement suggestions welcome!

Github repository


Bare bones audio plugin with auto-created, generic GUI using JUCE.

SimplePlugin image

Good example if you've looked at the JUCE tutorials/example plugins and are wondering how to utilise the AudioProcessorParameter class heirarchy.

To implement parameters are created on the heap rather than the stack. A view container 'params' is kept for easy access (and to remove the need to dynamic_cast), before adding the parameters to the plugin using addParameter() as usual.

Github repository


Dummy audio plugin expanding AudioParameterFloat and ParameterSlider classes to allow stepped controls

ParameterSliderStep image

AudioParameterFloatStep class: Allows stepped controls when used in conjunction with ParameterSliderStep. (Overrides getNumSteps() method.)

ParameterSliderStep class: Allows stepped controls when used in conjunction with AudioParameterFloatStep. Asserts a reasonable number of steps (otherwise just use ParameterSlider).

Github repository


Dummy audio plugin to demonstrate the JUCE 4 AudioProcessorParameter and ParameterSlider classes

AudioProcessorParameterPlugin image

Demonstrates that parameter handling and management is greatly simplified in JUCE 4 using these classes. (The ParameterSlider class is taken from the JUCE demo audio plugin.)

Github repository

Pure Data


Convolve two tables by multiplication in the frequency domain using FFT.

jTabConv image

The FFT method works very quickly for long tables. In comparison, on this machine, for 1 second tables at 44.1k iem_tab tab_conv (presumably time domain?) takes >10 seconds whereas this method takes a few milliseconds. The speed of computation is governed by switch~'s oversampling rate (on this machine 2048 seems to be optimal).

There is some error when comparing to iem_tab tab_conv which presumably is down to number precision error going back and forth through fft~ and ifft~ (specifically gain from ifft~ at huge blocksize which needs to be normalised). This may be unacceptable for some applications e.g. filtering but acceptable for reverb or special effects.


Github repository


Fill a table with values processed by cross-connected object(s).

jTabLookup image

Lookup table by index via [tabread4] 4-point interpolation.

Useful for computationally expensive objects like [pow], [exp] etc., where a close approximation will suffice. Or for a complicated chain of objects, or an intricate [expr]. (Because lookup table is calculated over a specified range, this is only useful in situations where a finite range is acceptable.)


Github repository


Notes, code, mathematics and snippets from textbooks and other sources for revision. Some in quiz form. Designed to be read on the go, using a phone or similar. May be incomplete or have topics omitted.

Digital signal processing. Various sources.
Programming. Principles and practice book by Bjarne Stroustrup.


Various links and snippets for C++, Pure Data and other things.