This is a collection of audio effects I have written in REAPER's JSFX language.
Download them from GitHub, or as a ZIP file, or on ReaPack by adding the repository: https://geraintluff.github.io/jsfx/index.xml
There's also a growing set of video demos/tutorials, although not all effects are covered (yet).
This is a synth that specialises in smooth and thick sounds, with a bank of effects and assignable modulators that are calculated per-note. (audio demo, additional audio demos)
You can find more information and demos for this synth on its main project page.
The per-note effects can re-ordered and renamed, and the modulators can modulate any later effect in the chain, including other modulators.
This effect is anywhere between a vocoder and a synth with sharp filter-sweeps.
It can use input audio for its timbre to act as a vocoder ("audio" mode) or use a spectrum which you can draw precisely with the mouse, allowing extremely sharp cutoffs. You can shift this timbre up or down based on pitch, velocity, or a per-note envelope ("sweep").
In "audio" mode, you can control how much audio is used to calculate the timbre (window) and how often (overlap). There is a zero-latency mode for live performance, and a latency-compensated one. The "Volume" section acts like a basic compressor - turn both dials to 0 to disable.
The "fixed" mode lets you draw the spectrum for a single pulse of the oscillator using the mouse. Shift-click lets you draw straight lines.
This effect is a polyphonic string resonator. It can provide its own impulse (to act as a synth) as well as resonating the incoming audio (e.g. a drum loop). (audio demo)
It has two resonators for each note (left and right) and they can be detuned (audio demo).
If your input audio is tonal (e.g. speech) and those frequencies are coming through, the "de-tonal" setting puts a ring-modulator before each resonator to make it atonal. (audio demo)
This is a reverb that specialises in long ambient sounds and shimmering textures.
The "grain" size controls the frequency/time resolution. Longer grains will give smooth and pure tones, which shorter ones will result in a thicker and more wavering result.
The "shimmer" control slowly morphs the reverb up by octaves over time, adding a bright and ethereal sound to the reverb. The "fifths" dial lets you add some octave-and-a-fifth shifts in there as well, which may help the shimmer sound smoother, but may not sound as clean.
The "release" controls in the decay section allow you to move the current echoes over to a second, faster-decaying reverb line. This can stop things getting as muddy when changing chord. It can be triggered by mouse, automation, or MIDI controller #64 (if enabled).
If the quieter bits sound great, but the louder sections sound harsh, the "input comp" section can help you tame the peaks.
This is a feedback delay effect where the echoes move through the stereo space. (audio demo)
This is not done using an LFO, it uses a feedback structure with three delay lines for two channels - this means that the stereo position of the echoes is independent, which is good for building up textures.
Bad Connection has three features:
Spectrum Matcher is a tool for comparing the spectrum/timbre of an input against a model, and optionally applying a correction filter.
The bottom half of the screen shows the short-term spectrum (green), the long-term spectrum (yellow), and the long-term reference spectrum (blue).
The top half of the screen shows the current difference between the long-term spectrums (red). If correction is enabled, it shows the correction curve (white) and phase (dotted brown). If the correction is frozen, it shows the frozen correction values in blue.
To disable correction and re-start/clear the long-term spectrum measurements, hit "Reset". To start correction, hit "Correct". Once correction is enabled, hit "Freeze" to set or update the fixed correction values.
It can learn new models from the incoming audio, and save this as a preset for later use:
This effect is quite CPU-intensive, so if you're not using it it could be good to bypass it.
Soft Bell is a synth that produces chime-like tones, with individually specified harmonics.
It can also be used with audio - it can produce interesting inharmonic sounds from musical input, particularly if you turn the "tonality" dial down.
This effect is a MIDI-controlled frequency-modulator effect. It can be used to add character to an existing sound (such as a different synth).
Multiple MIDI notes produces multiple modulation frequencies. The notes aren't processed separately - they are added together to form the modulation waveform. This means that different notes interact (slightly similar to distortion).
This is a brick-wall limiter that aims to keep the correction curve smooth while remaining responsive.
It will recover completely from any peak in a fixed amount of time. Both the attack and release follow a curve that is similar to a sinusoidal segment (1 + cos(x)
), with the goal of reducing cross-modulation.
The "distortion" parameter changes the correction mode - at 0%, the correction is applied by scaling the output signal. At 100%, the correction is applied using a non-linear distortion (smooth, not a hard-clip), which can sound good for some applications such as drums. The display in the bottom-left shows the current correction response.
Ripple is a phaser-like effect which continually rises or falls.
The filters fade out (go to 0dB) at some definable limit, so you can modulate some areas of the spectrum while leaving others in tact.
It has a variable number of filters (up to 20), stereo phase-offset and a tempo-synced LFO.
This effect re-plays the notes of a chord in a random fashion. Each MIDI note in the input is triggered randomly over time.
You can control the retriggering rate, and how much this is affected by velocity or the number of current notes ("Independence"). You can also allow it to transpose the input up/down octaves, to move it to a target note range. This (like everything else) is automatable, so your music can float up and down in pitch.
"Regularity" prevents notes from playing too soon after their previous instance - high settings produce patterns which evolve slowly over time. "Kickstart" will play incoming notes immediately, with the specified probability. "Quantise" lets you specify that notes can only occur near beat boundaries.
You can let the final notes ring on after the input ("Release"), and change the velocity randomisation curve, add lookahead to shift the input forward, and set how it reacts to the sustain pedal (ignore it, use it, or use it but don't send it on).
This sampler records samples from the incoming audio when in learning mode (selected by a controller switch), and plays them back when in playback mode.
To record the samples, set the appropriate controller to a value of 64 or above. While this controller is down, when you play a MIDI note the sampler will remember the start/end positions in the buffer. When you have recorded all the samples, reset the controller to 0, and it will enter playback mode.
Samples are scaled according to velocity - if you record at velocity 100 and then play back at velocity 110, the output will be louder than the original input.
It currently does handle sample-rate changes.
This effect is a simple MIDI-controlled gate. (audio demo)
In "gate" mode, when a MIDI note is down (any MIDI note), the audio is passed through. In "mute" mode, audio passes through when no notes are held down.
The "Max Velocity" control sets the velocity that counts as "down fully". Values between 0 and this value result in a partially opened/closed state. Multiple notes add their velocities together - so two notes with velocity 50 are equivalent to one note with velocity 100.
You can also use it with a fast-paced pattern to produce an effect similar to Bad Connection's random gain variation. (audio demo)
This effect shifts MIDI notes up or down by octaves, to fit within a target range. This can be used to fold whatever chord is being played by some other instrument into a particular region (e.g. one octave around Middle C).
It has a single-note and a chord mode. It also has a built-in sequencer, which can be used as an arpeggiator (so it will play a pattern, but only using octave-shifted notes that you are already holding down).
It also has a MIDI-input mode - this way, instead of the target region or note being fixed (e.g. "one octave around Middle C") it is defined by a second input on a different MIDI channel (channel 16 by default).
This lets you very quickly take one MIDI input, and re-cast it into a different scale or a different chord.
This effect draws the incoming audio on a 2D plot, so you can visualise the stereo field. You can also alter the width/pan using the controls.
It's possible to rotate the field such that hard-left or hard-right inputs will output "inside out" (opposite phase in both output channels). In this case, the Width dial will turn red - double-click the dial to reset it to the maximum "safe" width:
This displays MIDI notes as a scrolling piano roll.
It was created as a nice way to display keyboard input when making demo videos.
Sandwich Amp is a distortion effect with a set of paired filters on either side, to provide a range of timbres. (audio demo)
The underlying distortion function is tanh()
(which is a fairly "soft" distortion, as opposed to a hard clip), but it can be driven quite hard, and an offset can be added to get asymmetrical response.
The "width" parameter widens the sound before distortion and narrows it afterwards, so that the distortion sounds stable and central while preserving the stereo feel of the sound. Similarly, the "filter" section applies a filter before the distortion, and then applies the inverse filter afterwards, which can provide distinctive distortion timbres.
It is also possible to supply a secondary input to the effect (channels 3 and 4) - this audio is added in before the distortion, but then subtracted again afterwards.
Spring-Box is a chorus/echo effect based on a matrix of 4 delay lines feeding back into each other. The delay lines vary in length according to the chorus parameters, so you can create a range of sounds from choruses and ambiences to space-like reverb effects. (audio demo)
Early echoes can be suppressed to get a smoother sound (the "late bias" control), by using two parallel delay structures with different feedback ratios, and subtracting the results.
A tool to make small delays to individual channels, including a delay analyser.
Delay amount can be displayed in ms or samples. (It is stored in ms, so if you change sample rate then it will preserve delay length regardless of the display format).
The delay analyser detects when one channel is ahead/behind or out of phase with the other - this can be useful when trying to get phases to agree in a multi-mic setup.
This effect it adds vibrato, using MIDI notes to produce a more natural envelope (compared to a constant LFO). Each note resets the vibrato to zero, and it is slowly introduced.
This is most useful for adding vibrato to synths that don't have already have it - for example, ReaSynth.
The "Lookahead" dial controls how much latency is added. With this at 0, sometimes the start of a note can sometimes be momentarily detuned because of ongoing vibrato. To prevent this completely, turn the dial to its maximum value (which scales according to the LFO Rate value).
(background by Tom Barrett on Unsplash)
This is an FFT-based vocoder. It takes 4 channels (stereo main and aux), and alters the spectrum of the main input to match the aux input.
Longer windows will better for low sounds in the main input, but will be less reactive. The "smoothing" dial averages the energy (from both inputs) over a short period, which can reduce growly artefacts.
(background by Umberto on Unsplash)
Warble is a relatively basic pitch-editing plugin. It analyses incoming audio, stores and displays it on a zoomable graph (middle mouse and scroll wheel). (demo: original, minor correction, major alterations, formant LFO)
There are three tools: nudge, erase and smooth. You use these tools with the mouse (left/right buttons do different things) to define how much it should be shifted. The current change amount is displayed in red.
The formant-correction on the shifting algorithm isn't perfect, so major corrections (e.g. 5 semitones or more) won't sound completely natural.
It doesn't (currently) separate notes from each other, or support automatic correction. I haven't figured out how to make "undo" work properly, so that's something to look at in the future.