Musician, mastering engineer & audio programmer.
Reverb audio plugin for Balance Mastering performing zero-latency convolution on 6 preset IRs.
Full download and information.
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).
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.
Audio plugin performing peaking EQ with decramped frequency response at Nyquist as per Orfanidis 1997.
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.
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).
Audio plugin performing true-stereo convolution of Balance Mastering Funktion One impulse responses.
Details same as Balance Flipside below.
Audio plugin performing true-stereo convolution of Balance Mastering Flipside Soundsystem impulse responses.
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.
Stepped stereo width plugin for Balance Mastering
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.
Stepped gain audio plugin for Balance Mastering.
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!
Bare bones audio plugin with auto-created, generic GUI using JUCE.
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.
Dummy audio plugin expanding AudioParameterFloat and ParameterSlider classes to allow stepped controls
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).
Dummy audio plugin to demonstrate the JUCE 4 AudioProcessorParameter and ParameterSlider classes
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.)
Convolve two tables by multiplication in the frequency domain using FFT.
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.
Fill a table with values processed by cross-connected object(s).
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.)
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.