Inside the Motif ES effects engine¶
A measurement-based teardown of 121 algorithms, from 27,719 captures¶
Atlas pages: Reverb · Delay · Chorus · Flanger · Phaser · Modulation · Pitch Change · Distortion · Dynamic · Wah · Lo-Fi · Tech · Misc
Every effect algorithm of a Yamaha Motif ES was driven with fixed probe signals while one parameter at a time was stepped. The chart shows what became of every recording.
Show code
import warnings
warnings.filterwarnings("ignore")
import matplotlib.pyplot as plt
from IPython.display import HTML, Markdown, display
import load, figs, plots, gapfill, iviz, headline, vizstyle as V
V.setup()
from matplotlib_inline.backend_inline import set_matplotlib_formats
set_matplotlib_formats("svg") # figures embed as vector, not PNG
display(iviz.page_css())
df, curves = load.load()
g = gapfill.load()
Show code
iviz.capture_flow(12892, 12892, 14827, 14782, 14737).show()
The width of each band is a number of captures: 27,719 recorded, 12,892 in the main runs and 14,827 in the Gap Fill run. 27,629 read cleanly and are what every chart on these pages is drawn from; 45 were read but did not pass their checks; 45 Gap Fill takes use probes that have no reader yet (spectralSweep ×26, sustainedStereo ×9, clickTrain ×9, noiseStop ×1).
In plain terms: almost everything that was recorded could be used. The thin bands at the bottom right are the few recordings set aside; nothing on the site is drawn from them.
The central technique: one sweep, four readings¶
Most captures play the effect a logarithmic sweep, a tone that glides from 20 Hz to 20 kHz and spends the same time in every octave, and then pass the recording through a matched filter: the same sweep reversed in time, which pulls all of each pitch's energy back to a single instant (deconvolution). The whole recording collapses into spikes on a time line, and each kind of spike is a separate reading.
Show code
import wviz
f, found = wviz.technique_figure(g)
f.show()
display(Markdown(
"- **Impulse response** (picture 2, the spike at 0): what the effect does to a single click. Everything linear about "
"the effect is in this one spike and what follows it.\n"
"- **Per-order harmonics** (picture 2, the spikes to the left): a harmonic at n times the pitch is a pitch the sweep "
"only reaches later, so the matched filter places it earlier, by the sweep length × ln n ÷ ln 1000. Each distortion order "
"gets its own spike, apart from the plain response. On this Distortion take the 3rd harmonic is predicted "
f"{-found[3][0]:.1f} ms ahead and found {-found[3][1]:.1f} ms ahead; the 5th is predicted {-found[5][0]:.1f} and found "
f"{-found[5][1]:.1f}. They are {found[3][2]:.0%} and {found[5][2]:.0%} the size of the plain response, while nothing "
"stands out of the background where the 2nd and 4th would be: this clipper adds odd harmonics only.\n"
"- **Echo taps** (picture 3): a delay returns the click again and again, so its spikes are the echoes themselves, each "
"at its own time and size, and pointing down when the echo comes back inverted.\n"
"- **Frequency response** (picture 4): the pitches inside the spike at 0, which is how the effect changes the tone.\n\n"
"*In plain terms:* instead of playing the effect hundreds of test tones, it is played one long glide. A piece of "
"arithmetic then squeezes the recording of that glide down to a click, as if the effect had been given one sharp "
"tap. What comes back after the tap shows the echoes and the tone; what appears before it is the distortion, "
"sorted by harmonic. Other probes (click trains, steady noise, stepped sine levels) cover what a sweep cannot, "
"such as how a delay line moves or how a compressor reacts through time; those are described in section 1."))
- Impulse response (picture 2, the spike at 0): what the effect does to a single click. Everything linear about the effect is in this one spike and what follows it.
- Per-order harmonics (picture 2, the spikes to the left): a harmonic at n times the pitch is a pitch the sweep only reaches later, so the matched filter places it earlier, by the sweep length × ln n ÷ ln 1000. Each distortion order gets its own spike, apart from the plain response. On this Distortion take the 3rd harmonic is predicted 477.1 ms ahead and found 476.8 ms ahead; the 5th is predicted 699.0 and found 699.8. They are 36% and 20% the size of the plain response, while nothing stands out of the background where the 2nd and 4th would be: this clipper adds odd harmonics only.
- Echo taps (picture 3): a delay returns the click again and again, so its spikes are the echoes themselves, each at its own time and size, and pointing down when the echo comes back inverted.
- Frequency response (picture 4): the pitches inside the spike at 0, which is how the effect changes the tone.
In plain terms: instead of playing the effect hundreds of test tones, it is played one long glide. A piece of arithmetic then squeezes the recording of that glide down to a click, as if the effect had been given one sharp tap. What comes back after the tap shows the echoes and the tone; what appears before it is the distortion, sorted by harmonic. Other probes (click trains, steady noise, stepped sine levels) cover what a sweep cannot, such as how a delay line moves or how a compressor reacts through time; those are described in section 1.
Per-effect cards and technical breakdowns live in the thirteen atlas notebooks. This notebook covers method, reliability, and what holds across each effect family.
Headline findings¶
🎛 Distortion, Overdrive and Amp Simulator share one clipping stage¶
They differ only in the tone voicing after it: harmonics within 0.6 dB and clipping curves within 3% at the same Drive (§9)
Show code
headline.clipping(g).show()
In plain terms: the three lines lie on top of each other. All three flatten the top and bottom of the wave in the same way and at the same point; what makes them sound different is the tone shaping that comes after the clipping.
⏱ Every digital delay time is exactly 0.1 ms per step¶
15 of 17 delay and feedback times exactly 0.1000 ms per step; the other 2 read half because two feedback lines interleave (§14)
Show code
headline.delay_steps(g).show()
In plain terms: one dot for each delay-time control. The dots at 0.1 are controls where one step of the knob always adds a tenth of a millisecond; the ones at 0.05 belong to delays built from two lines that take turns, so each step moves the pattern half as far.
📉 Lo-Fi's sample rate is 44.1 kHz ÷ (setting + 1)¶
Plain sample-and-hold: 6 of 9 settings match within 1 Hz, from alias images (§14)
Show code
f, hit, n = headline.lofi_rate(g)
f.show()
display(Markdown(f"*In plain terms:* the grey curve is the instrument's full sample rate divided by 1, 2, 3 and so on. {hit} of the {n} measured settings (solid dots) sit on it, so Lo-Fi simply keeps every second, third or fourth sample and holds it. The hollow dots are settings whose reading did not land on the curve.\n\n> **Note.** The headline states the rule for the control as a whole; it is confirmed at {hit} of the {n} measured settings. The other {n - hit} did not read on the curve, so nothing is claimed for them."))
In plain terms: the grey curve is the instrument's full sample rate divided by 1, 2, 3 and so on. 6 of the 9 measured settings (solid dots) sit on it, so Lo-Fi simply keeps every second, third or fourth sample and holds it. The hollow dots are settings whose reading did not land on the curve.
Note. The headline states the rule for the control as a whole; it is confirmed at 6 of the 9 measured settings. The other 3 did not read on the curve, so nothing is claimed for them.
🔁 Delay feedback is bipolar¶
Below the centre every repeat inverts polarity: signed echo taps (§8, §14)
Show code
f, first = headline.feedback_flip(g)
f.show()
display(Markdown(f"*In plain terms:* press play, or drag the slider. Each spike is an echo of one click. With Feedback Level at its lowest the first echo comes back upside down ({first[min(first)]:+.2f} of the click); at the centre setting there is no echo at all; at the highest it comes back the right way up ({first[max(first)]:+.2f}). The control is a see-saw around its centre, not a volume knob that starts at zero.\n\n> **Note.** The headline says every repeat inverts below the centre. This reading shows that for the first repeat; the second and third repeats do not simply alternate direction here, so the finding is confirmed for the first repeat only."))
In plain terms: press play, or drag the slider. Each spike is an echo of one click. With Feedback Level at its lowest the first echo comes back upside down (-0.73 of the click); at the centre setting there is no echo at all; at the highest it comes back the right way up (+0.73). The control is a see-saw around its centre, not a volume knob that starts at zero.
Note. The headline says every repeat inverts below the centre. This reading shows that for the first repeat; the second and third repeats do not simply alternate direction here, so the finding is confirmed for the first repeat only.
🚪 Gate Reverb and Reverse Gate are the Early Reflection engine with a gate¶
Room Size sets the gate length: 200→2039 ms hold across Room Size (§13)
Show code
f, hold = headline.gate_length(g)
f.show()
gate, reverse = hold["Gate Reverb"], hold["Reverse Gate"]
display(Markdown(f"*In plain terms:* turning Room Size up does not make a bigger room on these two effects, it holds the gate open longer: from {gate[0]:.0f} to {gate[1]:.0f} ms on Gate Reverb and from {reverse[0]:.0f} to {reverse[1]:.0f} ms on Reverse Gate, in a straight line."))
In plain terms: turning Room Size up does not make a bigger room on these two effects, it holds the gate open longer: from 200 to 2039 ms on Gate Reverb and from 96 to 801 ms on Reverse Gate, in a straight line.
🗜 The Compressor defaults to 3.0:1 with a knee near -57 dB¶
Ratio tops out at 22.6:1: level-staircase probe (§10)
Show code
f, ratio = headline.compressor(g)
f.show()
display(Markdown(f"*In plain terms:* up to the bend the line follows the dotted one: what goes in comes out. Past the bend, every 6 dB louder going in comes out only {6 / ratio:.1f} dB louder, which is a ratio of {ratio:.1f} to 1."))
In plain terms: up to the bend the line follows the dotted one: what goes in comes out. Past the bend, every 6 dB louder going in comes out only 2.0 dB louder, which is a ratio of 3.0 to 1.
🎧 20 effects are true stereo, 5 sum to mono¶
Voice Cancel keeps side 17 dB above centre: routing probe (§12)
Show code
headline.stereo(df).show()
In plain terms: a sound was sent into the left side only. Dots far to the left are effects that kept it on the left: they process the two sides separately. Dots at the right edge put it out of both sides equally: they add left and right together before the effect. The few in between send part of each side across to the other.
✅ Linear effects repeat bit-exactly¶
(0.00 dB), so every small difference in this report is real: 625 accidental repeat pairs (§4)
Show code
f, share = headline.repeats(df, curves)
f.show()
display(Markdown("*In plain terms:* some settings were recorded twice by accident, and each dot is one such pair. Dots at the left edge are two recordings that came out the same. That is where the reverbs and delays sit: " + ", ".join(f"{share[c][1]:.0%} of the {share[c][0]} {c} pairs" for c in ("Reverb", "Delay")) + " are within 0.05 dB, so a small difference between two of their settings is the effect and not the measurement. Families with an LFO, noise or pitch movement inside never repeat exactly, because the movement is at a different point each time; their charts read the movement itself, not small differences between settings.\n\n> **Note.** The headline figure is the middle value over every family without an LFO. Taken family by family it holds for Reverb and Delay; it does not hold for " + ", ".join(f"{c} ({share[c][1]:.0%} of {share[c][0]} pairs within 0.05 dB)" for c in ("Distortion", "Wah", "Lo-Fi", "Tech")) + "."))
In plain terms: some settings were recorded twice by accident, and each dot is one such pair. Dots at the left edge are two recordings that came out the same. That is where the reverbs and delays sit: 97% of the 115 Reverb pairs, 85% of the 46 Delay pairs are within 0.05 dB, so a small difference between two of their settings is the effect and not the measurement. Families with an LFO, noise or pitch movement inside never repeat exactly, because the movement is at a different point each time; their charts read the movement itself, not small differences between settings.
Note. The headline figure is the middle value over every family without an LFO. Taken family by family it holds for Reverb and Delay; it does not hold for Distortion (25% of 24 pairs within 0.05 dB), Wah (45% of 20 pairs within 0.05 dB), Lo-Fi (0% of 20 pairs within 0.05 dB), Tech (11% of 37 pairs within 0.05 dB).
1. The corpus and the probes¶
Recap · Why: Every capture is one knob moved while everything else stays put, so any change in the sound belongs to that knob. Purpose-built probes then re-ask the question each knob is really about (time for delays, rate for LFOs, level for compressors).
How to read it: Left: captures per effect family. Right: how many captures each probe signal was used for.
Takeaway: The report rests on thousands of controlled, repeatable measurements, not listening impressions.
Technical explanation. The category regimen steps one control at a time across every algorithm. The rehash regimen re-measures chosen controls with purpose-built probes (click + tail, two-tone bursts, a dynamics staircase, a sustained stereo chord, a routing test); its spectral sweep is 3.000 s long. Supplement captures vary two controls at once (§9); deep dives use a sweep-only probe.
Plain explanation: nothing here is a listening impression. Each effect was fed known test signals and recorded, one knob moved at a time, then re-tested with signals built for the specific question each knob raises.
In other words, the main points:
- 27,719 captures recorded: 12,892 in the main runs across 121 algorithms and 14,827 in the Gap Fill run.
- 27,674 are analysed so far, 27,629 cleanly; 45 Gap Fill takes await analysers for their probes.
- Every capture moves one control with the rest at default, so each change belongs to one knob.
- Matched probes (click and tail, two-tone bursts, a level staircase, a stereo chord, a routing test) re-measure the controls a sweep cannot read.
Show code
f = figs.inventory(df)
display(f); plt.close(f)
2. The probe signal and the sweep length¶
Recap · Why: A logarithmic sweep spends equal time in every octave, so the bass gets as much energy as the treble, and it separates distortion from the clean response (below). The sustained tone after it shows what happens over time: LFOs, decays, level changes.
How to read it: Top: the probe's waveform. Bottom: its spectrogram, the rising sweep then the tone. The second chart tests candidate sweep lengths; the sharpest impulse marks the true one.
Takeaway: The measurement is tuned to the signal actually sent, to a fraction of a millisecond.
Technical explanation. The main probe is a 2.000 s log sweep (20 Hz–20 kHz) followed by a sustained tone. The sweep length was not taken from the audio segment — it was fitted by maximising the sharpness of the deconvolved impulse, because a mismatched inverse filter smears it.
Plain explanation: the test signal is a whistle gliding from the lowest to the highest pitch in 2 seconds, then a steady note. We measured the glide's exact length from the recordings themselves, because being even slightly off blurs every result computed from it.
In other words, the main points:
- The main probe is a 2.000 s logarithmic sweep from 20 Hz to 20 kHz, then a sustained tone.
- The sweep length was fitted from the recordings, by maximising the sharpness of the deconvolved impulse.
- A mismatched length smears every result derived from the sweep, so it was measured, not assumed.
3. Deconvolution works¶
Recap · Why: Deconvolution turns the recorded sweep back into the effect's impulse response: what the effect does to a single click, from which frequency response, echoes and decay all follow.
How to read it: First chart: a nearly dry capture collapses to one clean spike, so the method adds nothing of its own. Second chart: with distortion, each harmonic appears as its own echo ahead of the main one, at a spacing the sweep rate predicts.
Takeaway: Clean response and distortion are measured in one pass and never mixed up.
Technical explanation. Harmonic distortion appears as discrete pre-echoes at offsets fixed by the sweep rate.
Plain explanation: from the recorded glide we can work out what the effect does to a single click. Distortion shows up as separate "ghost" clicks ahead of the real one, so it is measured apart from the tone.
In other words, the main points:
- One sweep capture yields the impulse response, and from it the frequency response, echo taps and decay.
- A nearly dry capture collapses to one clean spike: the method adds nothing of its own.
- Each distortion order lands as its own pre-echo ahead of the main response, so harmonics are measured apart from the linear response.
4. Reliability¶
Recap · Why: Before trusting a 1 dB difference, you need to know how much the same setting varies when captured twice. The run happened to capture some settings twice, which gives that noise floor for free.
How to read it: Each point is a pair of identical settings; the further from zero, the less repeatable.
Takeaway: Effects without an LFO repeat bit-exactly. With an LFO the capture lands at a different point in its cycle, so small differences there are expected, not errors.
Technical explanation. 625 pairs of accidental repeat captures give a direct test-retest noise floor. Effects without an LFO repeat to a median 0.00 dB — effectively bit-exact. With an LFO running the median is 3.03 dB, since the capture lands at a different LFO phase each time. Knob effects in the atlases are judged against this noise (z ≥ 3).
Plain explanation: the same setting recorded twice came back identical, unless a wobbling LFO was running — then differences of about 3 dB are just the wobble caught at a different moment. A knob only counts as "doing something" when its change is well above that noise.
In other words, the main points:
- 625 accidental repeat pairs give the test-retest noise floor.
- Without an LFO, repeats agree to a median 0.00 dB: effectively bit-exact.
- With an LFO running the median difference is 3.03 dB, from where in its cycle the capture lands.
- A knob counts as doing something only when its change is at least three times this noise.
Show code
f = figs.reliability(df, curves)
display(f); plt.close(f)
5. Category fingerprints¶
Recap · Why: A one-glance comparison of the families: which measured traits (brightness, decay, modulation, distortion, stereo width) each family is unusually high or low on.
How to read it: Rows are families, columns are traits; warm = above the other families, cool = below. Blank = the trait does not apply.
Takeaway: Each family has a distinct measurable signature, which the atlas pages break down effect by effect.
Technical explanation. Each feature's median within each category, as a robust z-score across categories, restricted to rows where the feature is valid.
Plain explanation: a family portrait. It shows at a glance which families are unusually bright, long, wobbly, distorted or wide compared with the rest; the atlas pages break each family down effect by effect.
In other words, the main points:
- Each family has a distinct measurable signature across brightness, decay, modulation, distortion and stereo width.
- Values are robust z-scores of each family's median against the other families, on rows where the feature is valid.
- The atlas pages break each family down effect by effect.
Show code
f, grid = figs.fingerprints(df)
display(f); plt.close(f)
6. Modulation¶
Recap · Why: Chorus, flanger and similar effects move constantly, so a single frequency response means little. A held chord, one note per channel, lets us track the pitch wobble of each side separately.
How to read it: The first chart maps the Speed knob to the LFO's actual rate in Hz; the second lines up the default rates; the animation shows the Tremolo's volume LFO at each depth setting.
Takeaway: Speed is exponential: each step multiplies the rate. Left and right can share one LFO, run in quadrature, or be deliberately decorrelated for width.
Technical explanation. LFO Speed maps exponentially to rate, topping out at 39.73 Hz.
Read from the pitch of a sustained chord, the default Chorus 1 LFO runs at
2.68 Hz; the per-channel traces show whether left and right
share one LFO, run in quadrature, or are decorrelated. Auto Pan drives the two
channels 178° apart — a true antiphase pan.
Plain explanation: each step of the Speed knob multiplies the wobble rate rather than adding to it, so the knob runs from a slow drift up to about 40 wobbles a second — fast enough to become a buzz. The default Chorus 1 wobbles about 2.7 times a second. Auto Pan swings the sound between the speakers in exact opposition: as one side gets louder, the other gets quieter by the same amount.
In other words, the main points:
- LFO Speed is exponential and tops out at 39.73 Hz.
- Chorus 1's default LFO runs at 2.68 Hz.
- Auto Pan drives left and right 178° apart: a true antiphase pan.
- Left and right can share one LFO, run in quadrature, or be decorrelated; the per-channel traces show which.
See the Chorus atlas (notebook), Flanger atlas (notebook), Phaser atlas (notebook) and Modulation atlas (notebook).
Show code
f = figs.lfo_rate(df)
display(f); plt.close(f)
Show code
f = figs.lfo_chord(df, curves)
display(f); plt.close(f)
Show code
plots.vector_player(plots.anim_lfo(df, curves, "Tremolo", "AM-Depth"))
7. Reverb¶
Recap · Why: Reverb is judged by how long it rings (T30), how its first moments are built, and how its tone changes as it decays. Each needs a different view of the impulse response.
How to read it: Reverb Time against T30 per algorithm; then an engine comparison, an echo-density chart (how fast reflections blur), a texture map, and the first 200 ms of each engine.
Takeaway: Twenty menu names come from fewer engines, and the real differences are in diffusion and darkening.
Technical explanation. Across the 20 algorithms, Reverb Time raw 0→51
spans a median T30 of 0.32→6.7 s. At raw
69, 10 of 20 decays do not fall 60 dB inside
the recording window and are shown as lower bounds. Decay curves are
noise-compensated before T30 is read.
Plain explanation: the Reverb Time knob takes you from a short room (0.3 s) to a long hall (7 s). At the very top of the knob, half the reverbs ring longer than we recorded, so those bars show "at least this long".
In other words, the main points:
- Reverb Time raw 0→51 spans a median T30 of 0.32→6.7 s.
- At raw 69, 10 of 20 decays outlast the recording and are lower bounds.
- Twenty names come from 11 engines: at identical settings several algorithms give the same impulse response, sample for sample.
- 12 of 20 algorithms are diffuse within 10 ms; Rich Plate stays grainy for 112 ms.
- Pre-delay is not in the data (the captures are fully wet); a dry-plus-wet re-capture is queued (T28).
See the Reverb atlas (notebook).
Show code
f = figs.reverb_time(df, curves)
display(f); plt.close(f)
Twenty names, 11 engines¶
Technical explanation. At identical settings, several differently named algorithms produce the same impulse response, sample for sample (correlation ≥ 0.97, most ≥ 0.999): Basement = Canyon = Tunnel = White Room; Room 1 = Room 2 = Room 3; Hall 1 = Hall 2; Large Hall = Medium Hall; Stage 1 = Stage 2; Warm Room = Woody Room. The names are parameter presets on one engine: what makes "Tunnel" sound unlike "White Room" on the Motif is the settings it loads, not a different algorithm.
Plain explanation: the Motif has fewer reverbs than its menu suggests. Pick "Room 2" instead of "Room 1" and you get the same reverb with different knob positions — so you can turn one into the other yourself.
Texture: how quickly the reflections blur¶
Technical explanation. Echo density (Abel & Huang) measures, in 20 ms windows, how noise-like the response is: 0 while separate reflections arrive, 1 once they have blurred into a smooth tail. The time it reaches 1 is the mixing time. 12 of 20 algorithms are already diffuse inside the first window (≤ 10 ms, the measurement floor). The exceptions are Warm Room, Woody Room, Large Hall, Medium Hall, R3 Plate, R3 Room, R3 Hall, Rich Plate; Rich Plate stays grainy for 112 ms with 72 distinct reflections before it smooths out.
Darkening compares the spectral centroid of the first 30 ms with 100–170 ms. Plate loses the most treble (9.3 → 4.8 kHz, 48% lower), like air and wall damping in a real space. Two groups hold one tone colour throughout: R3 Hall, R3 Room stay bright, while Large Hall, Medium Hall, Warm Room, Woody Room are dark from the first millisecond (centroid about 5.7 kHz) — damping built into the reflections rather than applied over time.
What these plots cannot show: pre-delay. Each response is aligned to its own first arrival and the captures are fully wet, so the gap between the dry sound and the reverb is not in the data; a dry-plus-wet re-capture is queued (T28). Only the first 170 ms are clean, because the probe's sustained tone follows the sweep (T5).
Plain explanation: some reverbs turn into a smooth wash almost instantly — good for pads and vocals that should sit back in the mix. Rich Plate and the R3 algorithms let you hear individual early echoes first, which reads as "bigger" and more "physical" but can sound grainy on percussive material. Plate-style tails lose their sparkle quickly like a real room; the R3 reverbs stay sparkly; the "warm" rooms and big halls are mellow from the very start.
Show code
iviz.reverb_texture_fig(df).show()
Show code
f = figs.reverb_early(df, curves)
display(f); plt.close(f)
8. Delay topology¶
Recap · Why: A delay is a set of echo taps: when each arrives, how loud, and whether its polarity flips. A single click followed by silence shows every tap directly.
How to read it: Each panel is one delay's echo pattern; labels show which set delay times add up to each tap. The animation builds Cross Delay's echoes one click at a time.
Takeaway: The taps match the displayed settings exactly for most delays, which proves the topology; Ctrl Delay is the exception.
Technical explanation. All delay baselines are fully wet, so the absolute timeline is recovered by matching the click-probe taps against sums of the set delay times. That match explains 100% of echo energy for Cross Delay, 100% for Delay L,C,R, 100% for Delay L,R, 100% for Delay L,R St and 100% for Echo — but only 85% and 85% for Ctrl Delay 1 and 2, whose timing does not follow their displayed settings.
Plain explanation: send one click into a delay and you get a pattern of echoes. For five of the delays every echo lands exactly where the displayed times add up to — no hidden taps, no rounding. Ctrl Delay 1 and 2 are the exception: about 15% of their echo energy arrives at times the settings don't explain, so set them by ear rather than by the numbers on the screen.
In other words, the main points:
- Echo taps match sums of the displayed delay times: 100% of echo energy explained for Cross Delay, 100% for Delay L,C,R, 100% for Echo.
- Ctrl Delay 1 and 2 are the exception (85% and 85%): their timing does not follow the displayed settings.
- Each echo is read as a signed tap, so topology, loss per repeat and polarity inversion are visible directly.
See the Delay atlas (notebook).
Show code
f = figs.delay_grid(df, curves)
display(f); plt.close(f)
Show code
plots.vector_player(figs.echo_build(df, curves, "Cross Delay"))
9. Distortion¶
Recap · Why: Distortion depends on how hard you hit it, so it is measured at several input levels, and two tones together reveal the intermodulation that makes chords sound harsh.
How to read it: THD against input level (flat = hard clipper), odd against even harmonics (odd = symmetric, transistor-like; even = asymmetric, tube-like), the Drive law, and three effects' harmonic spectra side by side.
Takeaway: Most drives saturate early in their travel; three differently named distortions share one clipping stage and differ only in voicing.
Technical explanation. At defaults, Distortion measures THD -21.5 dB, IMD -7.2 dB and odd-over-even +13.5 dB — a symmetric clipper: on the tone probe H3 sits at -8.5 dB and H5 at -12.3 dB, while the even harmonics stay at or below -46 dB. Dual Rotor SP 2 is a soft clipper, THD -77.5→-35.9 dB across input level; Harmonic Enhancer is by far the most even-dominant effect (-33.4 dB). Of 22 Drive controls with a readable law, the median reaches within 3 dB of its maximum third harmonic by raw 31.
Plain explanation: almost every distortion here is a hard, symmetric clipper — the kind that adds odd harmonics and a buzzy, transistor-like edge rather than the warm even-harmonic glow of a tube. And the Drive knob does most of its work in the first quarter of its travel; past that you mostly get louder fizz, not more distortion.
In other words, the main points:
- Distortion at defaults: THD -21.5 dB, odd over even +13.5 dB: a symmetric hard clipper.
- Distortion, Overdrive and Amp Simulator share one clipping stage (harmonics within 0.6 dB at Drive 63) and differ only in the tone voicing after it.
- Of 22 Drive controls, the median is within 3 dB of its maximum third harmonic by raw 31.
- Harmonic Enhancer is the most even-dominant effect (-33.4 dB); Dual Rotor SP 2 is a soft clipper.
- Two notes at −30 dBFS: intermodulation climbs from -86 dB at Drive 0 to a ceiling of -10.2 dB by raw 31; a 5 kHz note reads -36 dB THD against -7 dB at 100 Hz, because the tone filter removes its harmonics.
See the Distortion atlas (notebook).
Show code
f = figs.distortion(df, curves)
display(f); plt.close(f)
One clipping stage, several names¶
Technical explanation. A 100 Hz sine at nine Drive settings puts all of the first nine harmonics below every tone filter, so it isolates the clipper itself. Distortion, Overdrive and Amp Simulator then behave as one device: each saturates by Drive raw 0 and sits at the same THD (-7.5 dB at Drive 63) and output level (-22.6 dBFS); at Drive 63 their H3/H5/H7 differ from Distortion's by at most 1.2 dB (Overdrive) and 0.6 dB (Amp Simulator), and their input-to-output curves by 1–3% of full scale. What separates them is the voicing after the clipper: the tone curves (bottom middle) peak at different presence frequencies.
Amp Sim 2 and Comp + Dist reach the same clipper at full Drive (within 0.9 dB at Drive 63) but with a gentler drive law: at raw 15 they are still 26 and 2 dB away in harmonics. V-Distortion is a different design, with its own drive law and a louder output.
Plain explanation: three effects with different names use the same "crunch" circuit — they distort identically and differ only in the tone knob that comes after. If you like Overdrive's grit but want Amp Simulator's brightness, you're really only changing the EQ. Two more (Amp Sim 2, Comp + Dist) use the same crunch but ease into it more gently as you turn up Drive.
Show code
iviz.clipper_evidence(g, df, curves).show()
Where the clipping starts, and what it does to bass and treble¶
Recap · Why: one test level cannot show where a distortion starts to clip, and one test note cannot show whether it treats bass and treble alike. The two-tone ladder plays two notes together at ten levels over 54 dB, at each Drive setting; the tone triplet plays 100 Hz, 1 kHz and 5 kHz at one level, then a deliberately lopsided wave.
How to read it: first, intermodulation against input level, one line per Drive setting; second, the same reading at −30 dBFS for every drive control; then bars per effect, where taller means more distortion.
Technical explanation. With Drive at 0 the Distortion's intermodulation at −30 dBFS is -86 dB; by raw 31 it is within 3 dB of its ceiling of -10.2 dB, and more Drive changes nothing at this level. Distortion, Overdrive and Amp Simulator trace the same ladder to within 0.2 dB at every Drive step above zero: another independent sign of one shared clipping stage. At −16 dBFS and default settings those three read -7.4 dB THD at 100 Hz, -10.8 dB at 1 kHz and -36.1 dB at 5 kHz: the harmonics of a 5 kHz note fall above the tone filter that follows the clipper, so they are filtered out, not absent. Fed a sine plus its own second harmonic they change the second harmonic by -2.7 dB and add a third at -16 dB, consistent with symmetric clipping. Harmonic Enhancer does the opposite: it raises the second harmonic by +11.8 dB, leaves a 100 Hz sine clean (-76 dB THD) and works on 1 kHz and above (-39 dB).
Plain explanation: turn Drive up from zero and the grit arrives almost at once: by 31 of 127 the effect is as distorted as it gets on a normal-level signal. Low notes come out dirtier than high ones, because the tone filter after the clipper removes the fizz from high notes. The Harmonic Enhancer is not a distortion in this sense: it adds a gentle octave-up shimmer to the upper part of the sound and leaves the bass alone.
In other words, the main points:
- Intermodulation at −30 dBFS climbs from -86 dB at Drive 0 to a ceiling of -10.2 dB, reached by raw 31.
- Distortion, Overdrive and Amp Simulator match within 0.2 dB at every Drive step: one clipping stage.
- THD by frequency at default: -7.4 dB at 100 Hz, -10.8 dB at 1 kHz, -36.1 dB at 5 kHz (the tone filter removes a high note's harmonics).
- Harmonic Enhancer adds +11.8 dB of second harmonic and leaves 100 Hz clean.
Show code
for f, note in iviz.probe_parts(g, 'distortion'):
f.show()
display(Markdown(note))
What it shows. Two notes played together (220 and 697 Hz) at ten levels from −60 to −6 dBFS through Distortion, once for each Drive setting.
How to read it. Input level left to right; upward is how loud the extra tones created between the two notes are, against the notes themselves. Higher means harsher chords.
What it found.
- With Drive at 0 the pair stays clean (−86 dB at −30 dBFS) until the loudest step.
- By raw 31 it is within 3 dB of the ceiling of −10.2 dB at that level.
What it shows. The same reading at −30 dBFS for every drive control on every effect that has one.
How to read it. Each line is one drive control, from the bottom of its travel (left) to the top (right); colour is the effect family. Hover a line for the effect and control.
What it found.
- Distortion, Overdrive and Amp Simulator trace the same line within 0.2 dB: one shared clipping stage.
What it shows. One sine at −16 dBFS at 100 Hz, 1 kHz and 5 kHz through each distortion at its default settings.
How to read it. Three bars per effect; taller means more harmonic distortion (0 dB would be overtones as loud as the note).
What it found.
- The hard clippers read −7.4 dB at 100 Hz, −10.8 dB at 1 kHz and −36.1 dB at 5 kHz: the tone filter after the clipper removes a high note's overtones.
What it shows. A deliberately lopsided wave (a sine plus its own 2nd harmonic) through each effect.
How to read it. The bar is how much the 2nd harmonic changed against the note. Below zero the effect reduced it, above zero it added more.
What it found.
- The hard clippers lower it by 2.7 dB, as a symmetric clipper does; Harmonic Enhancer raises it by 11.8 dB.
10. Dynamics¶
Recap · Why: A compressor is defined by what it does to level. A staircase of tone steps, rising then falling, gives the static curve (threshold, ratio) and, from each step's overshoot and recovery, attack and release.
How to read it: Input step against steady output: the bend is the threshold, the slope above it the ratio. The per-step panels show overshoot (attack) and settling time (release).
Takeaway: The Compressor's knobs do what their names say, measurably; the multiband compressors need louder input than this probe gave; the Gap Fill staircase below reaches them.
Technical explanation. The Compressor's staircase gives 3.03:1 at defaults with a knee
near -57 dB; Ratio at maximum reaches 22.6:1.
Attack moves step overshoot from 1.7 to 14.9 dB,
and Release moves settling from 81 to 501 ms.
Plain explanation: at defaults the compressor turns a 3 dB rise in level into a 1 dB rise, and it starts working on very quiet signals. At full Ratio it is close to a limiter. Attack decides how much of each hit's initial punch slips through before it clamps down; Release decides how quickly it lets go afterwards (from under a tenth of a second to about half a second).
In other words, the main points:
- Compressor at defaults: 3.03:1 with a knee near -57 dB; Ratio tops out at 22.6:1.
- Attack moves step overshoot from 1.7 to 14.9 dB.
- Release moves settling from 81 to 501 ms.
- The multiband compressors need a louder input than this probe gave; the Gap Fill staircase reaches them: 2.7:1 and 2.7:1 from about -21 and -19 dBFS.
- Ratio is eight fixed steps (1, 1.5, 2, 3, 5, 7, 10, 20.6 : 1); Attack spans 9–167 ms and Release 40–916 ms after a 30 dB step.
See the Dynamic atlas (notebook).
Show code
f = figs.dynamics(df, curves)
display(f); plt.close(f)
Ratio, knee, attack, release and the gate, in physical units¶
Recap · Why: the staircase above uses one 440 Hz tone and its loudest step is 12 dB below these, so it could not reach the multiband compressors' knees or time attack and release directly. Three Gap Fill probes do: tone staircases up to −6 dBFS at 100 Hz, 1 kHz and 6 kHz; a tone that jumps 30 dB up and back; and a tone faded slowly through the Noise Gate.
How to read it: five charts follow, each with its own description directly under it.
Technical explanation. Compressor Ratio raw 0–7 reads 1, 1.5, 2, 3, 5, 7, 10 and 20.6 : 1 at 1 kHz, and within 0.5 of that at 100 Hz and 6 kHz: the same curve in all three bands. At defaults the knee sits near -42 dBFS at the probe and the −6 dBFS step is turned down 24 dB (the staircase above quotes its knee as recorded level, about 11 dB lower on the scale; the two agree within the 6 dB step size). Threshold moves the knee from -43 to -18 dBFS and switches compression off at raw 121; every setting up to raw 75 reads the same knee. Attack runs from 9 to 167 ms and Release from 40 to 916 ms (time to come within 1 dB of the settled level after a 30 dB step); at raw 15 it had not recovered one second later. MultiBand Comp 1 and 2 compress at 2.7:1 and 2.7:1 from about -21 and -19 dBFS at 1 kHz, 9 and 8 dB of reduction at −6 dBFS. The Noise Gate opens at -56 dBFS at raw 84 and -42 dBFS at raw 97 and closes within 0.5 dB of where it opened. At raw 72 and below its threshold lies under the ramp's −70 dBFS floor and cannot be read (T30). The knee is read where two fitted lines cross, from steps 6 dB apart.
Plain explanation: Ratio does what its label says, in eight fixed steps from no compression to near-limiting. Attack sets how much of a loud hit slips through before the compressor clamps down, from about 9 to 167 thousandths of a second; Release sets how long it takes to let go, from 40 thousandths of a second to nearly a full second. The multiband compressors only start working on loud signals, which is why the quieter test made them look inactive. The Noise Gate opens and closes at practically the same level.
In other words, the main points:
- Compressor Ratio is eight fixed steps: 1, 1.5, 2, 3, 5, 7, 10 and 20.6 : 1.
- Attack 9–167 ms, Release 40–916 ms, after a 30 dB step.
- Default knee near -42 dBFS; Threshold moves it up to -18 dBFS and off at maximum.
- MultiBand Comp 1 and 2: 2.7:1 and 2.7:1 from about -21 and -19 dBFS, reached for the first time by this probe.
- Noise Gate: opens at -56 dBFS at raw 84 and -42 dBFS at raw 97; under 0.5 dB between opening and closing.
Show code
for f, note in iviz.probe_parts(g, 'dynamics'):
f.show()
display(Markdown(note))
What it shows. Ten tones from −60 to −6 dBFS through the Compressor, once for each of its eight Ratio settings.
How to read it. Input level runs left to right, output level upward. A steady 45° climb is no compression; the flatter a line runs above the bend, the higher the ratio.
What it found.
- The eight settings read 1, 1.5, 2, 3, 5, 7, 10 and 20.6 : 1, all bending near −42 dBFS.
What it shows. How long the Compressor takes to clamp down after a tone jumps 30 dB louder, at each Attack setting.
How to read it. Attack setting left to right, milliseconds upward (time to come within 1 dB of the settled level). Higher means more of a loud hit slips through.
What it found.
- 9 ms at the fastest setting to 167 ms at the slowest, rising smoothly.
What it shows. How long the gain takes to recover after the tone drops back by 30 dB, at each Release setting, for every effect with a compressor stage.
How to read it. Release setting left to right, milliseconds upward. Higher means the compressor holds on longer; hover a line for the effect and value.
What it found.
- The Compressor runs from 40 to 916 ms; at raw 15 it had not recovered a second later.
What it shows. The Noise Gate's gain as a 1 kHz tone fades slowly in (solid) and back out (dashed), for each Threshold setting the fade could reach.
How to read it. Input level left to right; 0 dB at the top is fully open. The steep cliff is the gate opening or closing.
What it found.
- It opens at −56 dBFS at raw 84 and −42 dBFS at raw 97, and closes within 0.5 dB of where it opened.
- Settings at raw 72 and below sit under the fade's −70 dBFS floor and cannot be read here (T30).
What it shows. The same ten tones through every dynamics effect at its default settings, with bypass dotted.
How to read it. A line that runs parallel to the dotted one is not compressing; where it bends flatter, compression has started.
What it found.
- MultiBand Comp 1 and 2 only bend near −21 and −19 dBFS (2.7:1 and 2.7:1), which is why quieter probes made them look inactive; the Compressor bends from about −42 dBFS.
11. EQ and wah¶
Recap · Why: An EQ is a pure frequency response; a touch wah is a filter that moves with playing dynamics, so it needs transients at different levels.
How to read it: The EQ panel shows the High Gain knob's full swing; the wah panel shows the filter's brightness rising as the hits get louder.
Takeaway: Both do what they claim, with measured ranges.
Technical explanation. 3-Band EQ High Gain swings the top octaves by 23 dB over its
range. Touch Wah's filter follows input level, read from the spectral centroid
of stepped transients.
Plain explanation: the EQ's treble knob covers a 23 dB range, from clearly dull to clearly bright. The Touch Wah opens up as you play harder, as its name promises.
In other words, the main points:
- 3-Band EQ High Gain swings the top octaves by 23 dB over its range.
- Touch Wah's filter opens with input level, read from the spectral centroid of stepped transients.
- On noise bursts 18 dB apart Touch Wah brightens by 2.0 octaves; Auto Wah does not follow level.
See the Wah atlas (notebook) and Misc atlas (notebook).
Show code
f = figs.eq_wah(df, curves)
display(f); plt.close(f)
Playing dynamics: how effects answer loud, soft and decaying notes¶
Recap · Why: sweeps and steady tones cannot show how an effect responds to playing dynamics, or to a note that dies away. The pink-pluck probe plays noise bursts at three levels 18 dB apart, then three plucked notes.
How to read it: one bar per effect. First, how much brighter the loud burst comes out than the quiet one, in octaves; second, how much of the 18 dB level difference is removed; third, how long a pluck takes to fall 20 dB.
Technical explanation. Touch Wah's spectral centroid rises 2.0 octaves from the quiet burst to the loud one and the Vintage Touch Wahs' by 0.9; Auto Wah's does not follow level (-0.7 octaves), its filter being driven by an LFO. The distortions remove a median 17 dB of the 18 dB level difference and hold a plucked note within 20 dB of its peak for 1.49 s, essentially the whole 1.5 s note, against 1.02 s through bypass; the Compressor removes 12 dB and holds it for 1.48 s.
Plain explanation: play harder into a Touch Wah and its filter opens by about 2 octaves; an Auto Wah sweeps on its own and ignores how hard you play. Distortion evens out your dynamics almost completely, so loud and soft come out at nearly the same volume, and notes ring at least 1.5 times as long.
In other words, the main points:
- Touch Wah opens 2.0 octaves between quiet and loud playing; Auto Wah does not follow level.
- Distortions remove 17 of 18 dB of level difference; the Compressor 12 dB.
- A plucked note stays within 20 dB of its peak for at least 1.49 s through the distortions, 1.02 s through bypass.
Show code
for f, note in iviz.probe_parts(g, 'pluck'):
f.show()
display(Markdown(note))
What it shows. How much brighter the loud noise burst comes out than the quiet one, 18 dB apart, for each effect at its default settings.
How to read it. Bars above zero mean the effect opens up as you play harder; near zero means it ignores playing dynamics.
What it found.
- Touch Wah brightens by 2.0 octaves and the Vintage Touch Wahs by 0.9; Auto Wah does not follow level.
What it shows. How much of the 18 dB level difference between the quiet and loud bursts each effect removes.
How to read it. Zero means loud stays loud and quiet stays quiet; 18 would mean both come out at the same volume.
What it found.
- The distortions remove a median 17 dB, the Compressor 12 dB.
What it shows. How long a plucked note stays within 20 dB of its peak through each effect.
How to read it. Taller means more sustain. The note itself lasts 1.5 s, so bars at that height held it for its whole length; no bar means it was still ringing when the note ended.
What it found.
- Through bypass the pluck falls 20 dB in 1.02 s; through the distortions it lasts at least 1.49 s.
12. Stereo behaviour¶
Recap · Why: Stereo behaviour decides how an effect sits in a mix. Bursts sent to the left only, the right only, both in phase and both out of phase show exactly how the inputs reach the outputs.
How to read it: Horizontal: how alike left and right are for a centred input. Vertical: how much side (stereo) content survives compared with centre.
Takeaway: Most effects are true stereo; a few sum to mono, and Voice Cancel removes the centre as designed.
Technical explanation. Of the routing-probe effects, 20 are true stereo, 2 cross channels (Cross Delay, Tempo Cross Delay) and 5 sum to mono (Ambience, Auto Pan, Pitch Change 1, Pitch Change 2, Voice Cancel). Voice Cancel passes side signal 17 dB above centre.
Plain explanation: most effects keep left and right separate. The cross delays bounce echoes from one side to the other by design. 5 effects fold everything to mono first — worth knowing before putting one on a wide stereo pad. Voice Cancel does what it says: it keeps the sides and pulls the centre, where a lead vocal usually sits, down by 17 dB.
In other words, the main points:
- 20 effects are true stereo, 2 cross channels and 5 sum to mono.
- Sum to mono: Ambience, Auto Pan, Pitch Change 1, Pitch Change 2, Voice Cancel.
- Voice Cancel keeps side signal 17 dB above centre.
Show code
f, stereo_class = figs.stereo_map(df)
display(f); plt.close(f)
13. Gate reverbs, early reflections and interactions¶
Recap · Why: Gate Reverb and Reverse Gate are early reflections cut off by a gate, so their shape over time matters more than a decay time. The supplement grids test whether two knobs interact.
How to read it: Envelopes for each Room Size setting (light to dark), gate length against Room Size, and Early Reflection 1's six reflection patterns. Then the knob pairs that do not simply add.
Takeaway: Room Size, not Feedback, sets the gate length; the earlier runs had mislabelled it.
Technical explanation. Gate Reverb and Reverse Gate share the Early Reflection parameter layout (Type,
Room Size, Diffusion, Initial Delay, Feedback, HPF, LPF, Dry/Wet, Liveness,
Density, High Damp). The earlier deep-dive runs addressed the wrong slots, so
their "Feedback" curves were really Room Size; those runs are replaced here by
the Gap Fill captures. Room Size sets the gate length: Gate Reverb holds within
20 dB of its peak for 200→2039 ms
across its range, Reverse Gate for 96→801 ms.
Early Reflection 1 and 2 are measured here for the first time. The supplement
2×2 grids show where two controls do not add.
Plain explanation: Gate Reverb and Reverse Gate are a burst of room reflections chopped off abruptly — the classic 80s snare sound. The knob that sets how long before the chop is Room Size (200 to 2039 ms on Gate Reverb); earlier runs had mixed up the labels and are replaced here. The grids at the end flag knob pairs that interact: turning both does something neither does alone.
In other words, the main points:
- Room Size sets the gate length: Gate Reverb 200→2039 ms, Reverse Gate 96→801 ms.
- Gate Reverb and Reverse Gate use the Early Reflection parameter layout; earlier runs addressed the wrong slots and are replaced by the Gap Fill captures.
- The 2×2 grids flag control pairs whose combined effect is not the sum of the two.
Show code
iviz.gf_early(g).show()
Show code
f, inter = figs.interactions(df, curves)
display(f); plt.close(f)
14. Gap Fill: controls in physical units¶
Recap · Why: The Gap Fill run re-measures each knob with a probe chosen for what that knob does, and reads the result in physical units: milliseconds, hertz, cents, decibels.
How to read it: Each chart puts a knob's raw value on the horizontal axis and the physical quantity it sets on the vertical. Hover for exact values; click legend entries to show or hide an effect.
Takeaway: The Motif's controls follow clean, exact laws: 0.1 ms per delay step, 44.1 kHz ÷ (n + 1) for Lo-Fi, exponential LFO rates.
Technical explanation. The Gap Fill run gives each control a probe matched to what it does. This section uses the 14,737 captures analysed so far (109 effects) of the 14,827 recorded; the other 45 use probes that have no analyser yet (spectralSweep ×26, sustainedStereo ×9, clickTrain ×9, noiseStop ×1). Every Gap Fill probe is fully wet and the file start wanders by about ±50 ms, so times are read within one capture (one channel against the other, tap against tap), never from the file start.
Delay time. 15 of 17 delay-time and feedback-time controls move their tap exactly 0.1 ms per raw step (read against the other channel, or from the echo spacing). The other 2 are Delay L,R's two feedback times: both lines feed both channels, so their echoes interleave and the spacing reads half. Hollow markers are steps where the moving tap was no longer the first arrival, so the reading stalls — that is the geometry, not the delay law. Feedback is bipolar: repeats fade fastest near raw 64 and invert below it. High Damp removes treble on every pass.
Plain explanation: every step of a delay-time knob is exactly a tenth of a millisecond, so the numbers on the screen can be trusted. Feedback has its "fewest repeats" point in the middle of its travel: turn it up for more repeats, turn it down and the repeats come back upside-down. High Damp makes each repeat a little duller than the one before, like echoes in a real space.
In other words, the main points:
- 15 of 17 delay and feedback times move exactly 0.1 ms per raw step; the other 2 read half because two feedback lines interleave.
- Feedback is bipolar: repeats fade fastest near raw 64 and invert below it.
- Chorus and flanger Speed spans 0.23–39.7 Hz over 17 steps.
- Lo-Fi's sample rate is 44.1 kHz ÷ (raw + 1): 6 of 9 settings match within 1 Hz, with no anti-alias filter in front.
- Across 55 drive controls, THD reaches 29.8 dB.
Show code
iviz.gf_delay(g).show()
Modulation. Chorus and flanger Speed spans 0.23–39.7 Hz
over 17 steps; Depth maps to pitch swing in cents. The waveform panel reads the
3rd harmonic of the pitch LFO at maximum depth, which separates sine, triangle
and square LFOs.
Plain explanation: the Speed knob runs from one slow wobble every few seconds to a 40-per-second buzz, and Depth sets how far the pitch bends. The waveform panel tells you whether the wobble is smooth (sine), pointed (triangle) or jumps between two pitches (square).
Show code
iviz.gf_modulation(g).show()
Drive. A 100 Hz sine at −6 dBFS through 55 drive controls at nine settings each gives the input-to-output curve (hard, soft or asymmetric clipping) and the harmonic series; THD reaches 29.8 dB.
Plain explanation: every drive knob got the same low note. The charts show how the wave's peaks get flattened at each setting and which overtones that adds; at the extreme, the added overtones are only about -30 dB quieter than the note itself.
Show code
iviz.gf_transfer(g).show()
Lo-Fi, in the weeds¶
Technical explanation. Lo-Fi is a sample-and-hold decimator followed by a quantiser. The effective sample
rate, read from where the alias images of pure sines land, follows 44.1 kHz ÷ (raw + 1):
6 of 9 measured Sampling Freq settings match within 1 Hz, and
the rest are ambiguous rather than contradicting it. There is no anti-alias filter in
front: images of a 1 kHz tone land wherever k·fs′ ± 1 kHz falls, including below the
tone once fs′ drops under 2 kHz.
Plain explanation: Lo-Fi doesn't blur the sound, it samples it less often and holds each sample until the next one. Turn the knob and the "grid" gets coarser in exact steps (44,100, 22,050, 14,700 … samples per second). The fake notes you hear are mirror images of your real ones folding around that grid — which is why low settings sound metallic and out of tune rather than muffled.
Show code
iviz.gf_lofi(g).show()
Watch the wave get destroyed. Drag the slider: the dotted cyan line is the 1 kHz sine that went in, the amber line what came out, both on the same level scale. At full rate the output is already a staircase (the default word length is coarse); as the rate falls, each sample is held for longer until one value spans most of a cycle.
Show code
iviz.lofi_destruction(g).show()
Where the aliases land. The measured spectrum of the same tone at each setting, with the image frequencies the 44.1 kHz ÷ (raw + 1) law predicts marked above it (▼). Lines under the markers confirm the law; there is no filtering between the images and the output.
Show code
iviz.lofi_alias_spectra(g).show()
Bit maps: the level ladder. Every held output sample in a capture, as a histogram: each spike is one quantisation level the Lo-Fi is allowed to output. A true 16-bit signal would be a smooth hump; here you can count the steps.
A limit worth stating plainly: our files record the Motif's output through its D/A and the interface's A/D, so the bits in the WAV are the capture chain's, not the Motif's internal word. What survives the trip is the staircase of levels. And these Word Length captures ran at the Lo-Fi default (very low) rate, where too few samples per cycle blur the ladder — the level count barely moves between settings. Full-rate re-takes are queued (T29); until then this chart shows the grid, not a Word Length law.
Show code
iviz.lofi_levels(g, 'Word-Length').show()
Quiet signals lose the most. At full rate, the same sine at three moments of a 60 dB fade, each scaled to its own peak. Loud, the staircase is fine; at −30 dB it is a few coarse steps; at −50 dB the tone is nearly a square wave. This is why bit reduction wrecks reverb tails and fade-outs first.
Plain explanation: fewer bits means fewer "rungs" on the volume ladder. A loud note uses lots of rungs and still looks like a wave; a quiet one only reaches a few, so it turns into a buzzy square — the classic crunchy, gritty lo-fi texture on the tail of every note.
Show code
iviz.lofi_fade(g).show()
15. Inspect any capture¶
Recap · Why: Three standard views for looking at any single recording up close, the way you would in a DAW.
How to read it: Tone: waveform and spectrum with harmonics labelled and THD printed. Impulse: the decay with its envelope dashed. Sweep: a spectrogram, time left to right, frequency upward, colour = level.
Takeaway: Any capture in the corpus can be opened this way with one line.
Technical explanation. Three interactive views for a single recording (hover, zoom, drag). iviz.inspect(path)
opens any capture in the corpus with the view its probe calls for.
- Tone: the waveform from its onset beside the power spectrum in dBFS, with the first ten harmonics marked and THD printed on the plot. Here, Distortion's Drive at mid travel on the 100 Hz sine.
- Impulse response: the decay from the first arrival with the Hilbert envelope dashed, and EDT/T20/T30. Here, Gate Reverb at its default Room Size.
- Sweep: a spectrogram of a log sweep through an effect. Here, Flanger 1 with feedback at maximum, where the comb shows as bands across the sweep.
Plain explanation: pick any recording and look at it three ways — the wave and the overtones it contains, how a single click fades away, and a picture of pitch over time. Hover, zoom and drag to explore.
In other words, the main points:
- Any capture in the corpus opens with one call, in the view its probe calls for.
- Tone: waveform and spectrum with harmonics and THD. Impulse: the decay with EDT, T20 and T30. Sweep: a spectrogram of the log sweep.
Show code
import gapfill as GF
def capture(effect, stimulus, param="Baseline", value=None):
d = g[(g.effect == effect) & (g.stimulus == stimulus) & (g.param == param)]
d = d if value is None else d[d.value == value]
return d.path.iloc[0]
iviz.inspect(capture("Distortion", "transferSine", "Drive", 63), "tone", "Distortion · Drive 63 · 100 Hz sine").show()
Show code
import numpy as np
import motifdsp as M
from scipy import signal as sg
sr, x = M.read_wav(capture("Gate Reverb", "sweepTail"))
inv = M.inverse_filter(sr, 3.0)
ir = sg.fftconvolve(x.mean(1), inv, "full")[len(inv) - 1:]
ir = ir[: int(np.argmax(abs(ir))) + 3 * sr] # the response, not the silence after it
iviz.impulse_view(ir / abs(ir).max(), sr, "Gate Reverb · default · deconvolved impulse response (0 dB = peak)").show()
Show code
iviz.inspect(capture("Flanger 1", "spectralSweep", "Feedback", 127), "sweep", "Flanger 1 · Feedback 127 · log sweep").show()
16. Open measurement gaps¶
Recap · Why: Measurement has limits, and stating them is what makes the rest credible.
How to read it: The list names each open question, why the current data cannot answer it, and the capture that would.
Takeaway: Most gaps already have re-captures designed and queued.
Technical explanation. Tests that would close the remaining questions are logged in TESTS_NEEDED.md.
Plain explanation: some questions cannot be answered from the recordings made so far. This is the list of what is still missing and which new recording would settle each one.
In other words, the main points:
- The open questions, and the capture that would answer each, are listed in
TESTS_NEEDED.md. - Queued re-captures include dry-plus-wet reverb for pre-delay (T28) and full-rate Lo-Fi word length (T29).
## 17. Every effect on the same measurements
The five-probe battery (steady pink noise, level steps of six sizes, two notes at ten levels, tones at 100 Hz,
1 kHz and 5 kHz, and silence) was recorded for every insertion effect at its default settings on 2026-10-06, with a
bypass take of each probe as the reference. Eight scalar readings are taken per effect and referred to bypass
where that applies. The parallel-coordinates axes are scaled to the 1st and 99th percentiles; the map is the first
two principal components of the eight readings after each is standardised.
> **Plain explanation:** until now every family had its own tests, so a chorus and a compressor could not be put side
> by side. Here every effect gets the same five test sounds and is described by the same eight numbers.
Show code
import kviz
for f, note in kviz.battery_parts(g):
f.show()
display(Markdown(note))
What it shows. Every insertion effect that could be run through the same five probes at its default settings (101 of them), one line each, across eight measurements: its level and spectral tilt on pink noise against bypass; how much the noise's spectrum moves over 11 seconds; how much of a 28 dB level range survives; the energy it adds at the harmonics of a 1 kHz tone; the energy it adds at sum and difference frequencies of two notes at −6 dBFS; the noise it puts out with nothing going in; and how long its output takes to settle after a loud tone stops.
How to read it. Each vertical rule is one measurement with its own scale (the printed ends are the 1st and 99th percentiles, so one extreme effect cannot flatten the rest). Lines are coloured by family; click a family in the legend to hide it, double-click to show it alone, hover a point for the effect and the value.
What it found.
- 29 effects keep less than 20 dB of the 28 dB level range, the distortions and compressors among them: Odrv+Rotary SP 1, Amp+Rotary SP 1, Dist+Rotary SP 1, Odrv+Rotary SP 2, Amp+Rotary SP 2, Cmp+Odrv+Dly, Odrv + Delay, Cmp+Dist+Dly.
- The noisiest when idle are Digital Turntable (−59 dBFS), Cmp+Dist+Dly (−63 dBFS), V-Distortion (−65 dBFS), Odrv+Rotary SP 1 (−70 dBFS).
- The spectrum moves most in Vintage Mono Phaser 1, Vintage Stereo Phaser 1, Vintage Mono Phaser 2, Auto Wah, and the largest level gains on noise are Lo-Fi (+24 dB), V-Distortion (+23 dB), Odrv+Rotary SP 1 (+19 dB).
- On the two 'added' axes the family medians run from Pitch Change (1 dB on the tone) down to Phaser (−71 dB).
- Those two axes need care: they count any energy that appears at those frequencies, so an effect that delays, modulates or shifts pitch reads high on them without clipping anything.
- They separate distortion from non-distortion only among effects that leave timing and pitch alone.
What it shows. The same effects placed by how alike their eight measurements are. Each measurement is put on a common scale, and the two directions along which the effects differ most become the axes (principal component analysis). Family names play no part in the placement; they only set the colour.
How to read it. One dot per effect; hover for its name. Effects close together measure alike on all eight readings; the eight furthest from the centre are labelled.
What it found.
- The two axes carry 57% of the variation between effects, so the map is a partial view: effects that sit together here can still differ on the remaining measurements.
- Families that are defined by what they do to level or harmonics (the distortions, the compressors) separate from the rest; chorus, flanger, phaser and delay overlap, because none of these eight readings measures time or pitch.
Revision 36 · 2026-10-15
Revision history
- Rev 36 · 2026-10-15: The Distortion drive ladders are re-recorded in the current setup (80 takes) and replace those of 2026-09-28, whose flat-topped waves came from the levels of the setup at the time, not from the effects: with the drive up, each distortion gives a square wave whose tops sag, and its Output Level only scales it.
- Rev 35 · 2026-10-12: The main page folds by topic and each family's detail page folds by effect: every section is closed until opened, with one control to open or close them all.
- Rev 34 · 2026-10-12: Every sheet: a play button steps through each control's settings; every recorded pair of controls drawn, with whether they simply add or one changes the other; EQ frequency and width controls drawn with their band at full boost. New detailed charts on every board: which controls depend on each other; the EQ bands moving; the ring modulator's pitch against its controls.
- Rev 33 · 2026-10-12: Every control on every effect's sheet: all its tested settings overlaid in one cell, and its measured law in physical units where a probe reads one. Misc board: the equalisers' bands at full cut and boost.
- Rev 32 · 2026-10-12: Headline findings set apart with larger titles; a note under the three whose graphic shows less than the headline says (Lo-Fi rate, delay feedback, repeats).
- Rev 31 · 2026-10-12: Main page: a graphic under each of the eight headline findings (the delay feedback one animated), each with a plain-terms line.
- Rev 30 · 2026-10-12: Main page opens with a chart of where every capture went and the central technique in pictures: the sweep, and the spikes the matched filter turns a recording of it into.
- Rev 29 · 2026-10-12: Misc board: the ring modulator's carrier pitch against OSC Freq Coarse and Fine, read from the sine takes.
- Rev 28 · 2026-10-11: Fifth capture batch in: the Reverb board gains the gap before the reverb starts against Initial Delay, the Chorus and Flanger boards gain the delay length against the delay knob.
- Rev 27 · 2026-10-11: Waves: a third page, what the instrument and effect waves measure: the note each one plays, where it starts repeating and how long the loop is, how long it rings, and the harmonics of each pitched wave.
- Rev 26 · 2026-10-11: Waves: the instrument and effect tiles now show the opening of the note (its first 8 cycles) instead of the whole take, so the individual waves can be seen.
- Rev 25 · 2026-10-11: Waves: a second page for the 955 instrument and effect waves, each drawn as the whole take of one note with one cycle of the sound under it where the wave holds a steady pitch.
- Rev 24 · 2026-10-08: Reverb knob pairs recorded (288 takes over the 12 distinct reverbs), so the reverb consoles' rings follow each other too; 799 knob pairs measured in all.
- Rev 23 · 2026-10-08: Every family page now opens with a comparison board (one row per effect, shared scales down each column) and control sheets with all tested settings side by side; each family's detailed charts are folded in beneath and the earlier pages are kept as detail pages.
- Rev 22 · 2026-10-08: Knob consoles: 2,120 new recordings of knob pairs, so within each effect's four strongest controls every knob's ring now follows every other (679 pairs measured, up from 155). A Waves page shows the 904 drum and percussion waves.
- Rev 21 · 2026-10-07: Delay page rebuilt the same way: every delay's echoes side by side, and each control's tested settings next to each other as echo patterns.
- Rev 20 · 2026-10-07: Reverb page rebuilt for comparison: one board with every distinct reverb as a row and every measure as a column on a shared scale, then each reverb's controls with all tested settings side by side. The detailed charts are folded in beneath; the earlier page is kept as the detail page. Knob consoles now use a slider for the selected knob, and controls with nothing measurable are listed, not drawn.
- Rev 19 · 2026-10-07: A knob console on every effect: each ring shows where along the knob's travel the sound changes, and turning a knob shows how the knobs captured together with it respond.
- Rev 18 · 2026-10-07: Reverb taken apart in time: how fast separate reflections merge into a wash; the tail's colour through time; how alike left and right are at each pitch and through the decay; how smooth each tail is against noise of the same tone; the Reverb Time control against Yamaha's table; and the twenty reverb names compared pair by pair.
- Rev 17 · 2026-10-07: Charts that only compared output level or gain are removed from every page except the compressors and gates, where level is what the effect does.
- Rev 16 · 2026-10-07: Capture set finished and audited (14,635 takes; the takes recorded through a reverb are all replaced). Corrections: Celeste 1's control shown as Delay is its Feedback Level, and Symphonic's shown as Feedback is its Delay Offset; two Symphonic controls that do not exist on the effect are removed. New charts in time and wave shape rather than level: Delay, where every echo lands as each time control is turned; Distortion, the wave that comes out as the drive rises; Lo-Fi, the output wave sample by sample at each Sampling Freq setting; Chorus and Flanger, the delay line followed as it sweeps; Phaser and Wah, where each notch or peak sits in Hz from moment to moment; Reverb, the separate early reflections in the first quarter second after one click; Modulation and Tech, each side turned up and down from moment to moment.
- Rev 15 · 2026-10-06: Pitch Change: a click train in, and when each click comes out.
- Rev 14 · 2026-10-06: Distortion: output and distortion against input level on a smooth ramp, harmonics against the pitch of the note, high-note harmonics folding back off 44.1 kHz (no oversampling), a bass note modulating a treble note, input-against-output loops, and the amp and cabinet filters' level and phase.
- Rev 13 · 2026-10-06: Lo-Fi on a smoothly rising tone: Word Length sets a clipping ceiling and adds no quantisation noise; the five Lo-Fi effects compared on the same ramp.
- Rev 12 · 2026-10-06: Lo-Fi: a rising note against everything that comes out with it, at each sampling-rate setting. Pitch Change: the cluster of lines a shifted note returns as, and the splice window read from it (about 35 ms and 28 ms).
- Rev 11 · 2026-10-06: The same routing fault is confirmed for the 1,835 re-takes of 2026-09-30/10-01 (the dry-plus-wet timing takes and the full-rate Lo-Fi takes). No published chart used them; they are withdrawn from the counts and are being re-recorded.
- Rev 10 · 2026-10-06: Correction: the all-effects comparison (section 17 of the main report), added earlier today, is withdrawn. Its 625 recordings were made with the Motif's System Reverb left in the signal path and are being re-recorded. New: compressor timing inside the distortion chains, wah filter sweeps, reverb decay per octave band.
- Rev 9 · 2026-10-06: Follow-up captures analysed: compressor attack and release against step size, MultiBand Comp 2 band by band, Noise Gate opening, hold and closing times, and distortion on level steps (no sag: the clippers act instant by instant). Release times now require the level to stay recovered for 50 ms, which fixes readings fooled by ringing or by a delay's echo. Capture counts include the overnight batches.
- Rev 8 · 2026-10-05: Beyond level curves: gain-reduction speed, release shape, phase-space orbits, harmonic matrices, intermodulation maps, parallel coordinates, a behaviour map and loudness in phon and sone on the Dynamic atlas; harmonic-against-drive matrices (Distortion), stereo LFO orbits (Chorus, Flanger, Phaser, Modulation), an echo map (Delay) and a decay-rate matrix (Reverb).
- Rev 7 · 2026-10-04: All figures vector and stacked one per row; control tables replaced by interactive charts; every section in four parts (recap, professional, plain, main points); capture counts include Gap Fill; six more Gap Fill probes analysed (dynamics timing, band staircase, gate ramp, two-tone ladder, tone triplet, pink pluck).
- Rev 6 · 2026-10-04: Complete 13-category analysis with detail ladders; all notebooks rebuilt with executed cells and interactive charts.
- Rev 5 · 2026-10-01: T28/T29 re-take analysis (dry/wet time references, Lo-Fi full-rate captures); Reverb detail ladders.
- Rev 4 · 2026-09-30: Reverb analysis from full 9,876 Gap Fill run; two-voice explanations added to main page sections 1–15.
- Rev 3 · 2026-09-29: Gap Fill captures: delay and feedback time laws, LFO maps, drive transfer curves, Lo-Fi rate, early reflections; Gate/Reverse Gate relabelled; interactive charts, atlas links, dark theme.
- Rev 2 · 2026-09-28: Gate Reverb time origin fixed; Auto Pan phase and Distortion harmonics computed from data.
- Rev 1 · 2026-09-27: First complete report: main analysis and 13 atlas notebooks.