Calibration

Every audio interface adds its own fingerprint to a measurement: a delay, a slight tone shape, a little distortion of its own. Calibration measures all of that once — with a plain cable in place of the pedal — so PedalScope can subtract the interface from every pedal measurement that follows. It’s how the app can honestly claim a chart shows the pedal, not the pedal plus your converter.

Gain staging, in order

The first calibration you run is also the first time PedalScope records audio, so macOS asks for microphone access then — hardware capture needs it, and nothing else does (see Permissions).

Calibration measures the loop including your knob positions, so the knobs get set first and the calibration comes second. Four steps, in this order:

  1. The same path, single-ended at the pedal. The loopback you calibrate with must be the electrical path the pedal will drive — the interface’s first output pair (the one PedalScope drives), the same input, the same cables and adapters — and single-ended, tip and sleeve only, where it meets the pedal, because that is what a pedal jack is. Plain TS (“mono” guitar) cables on a ¼″ output do this by themselves; an XLR-only output needs one adapter at the interface end, and Setting up your rig says how, and why the level then lands about 6 dB under the manual’s figure on any balanced output. A TRS cable in the loopback is a different path: into a balanced input it typically arrives about 6 dB hotter than the TS path, and the loop response — including phase — it calibrates isn’t the one your measurements go through, silently corrupting the compensation baked into everything that follows.

  2. Set the input gain for the pedal, not the loop. With the pedal in the loop at the loudest drive you plan to use, set the interface input gain so peaks land in the −12…−6 dBFS window — loud enough to use the converter’s resolution, with headroom to spare.

  3. Calibrate at that same gain. Take the pedal out, patch the TS cable straight from output to input, and run Calibrate. If the direct loop clips or runs hot, lower the calibration sweep level (Settings → Calibration) — not the input gain you just staged for the pedal.

  4. Then leave the knobs alone. The calibration is only a picture of the loop as it was; any knob change between calibration and measurement silently invalidates it. If a knob moves, recalibrate — it’s two minutes.

Before you press Calibrate, know where the sweep is going. The interface’s output drives the pedal, and on most interfaces the same output pair also feeds your monitors and headphone jack. A calibration sweep is full-band and, at the standard −26 dBFS, unpleasant on headphones set for guitar. PedalScope asks you to confirm before the first test signal on any interface, and again before any output at or above −10 dBFS — see the output level guard. Turn the monitors down before that first run rather than during it.

The sweep level

The calibration sweep’s digital level is a preference (Settings → Calibration; default −26 dBFS — the standard measurement drive level; range −40…−6 dBFS). The loopback chain is linear, so calibration is equally valid anywhere in that range: the level changes the loop’s signal-to-noise ratio, not its measured response. Trim it so the direct loop peaks in the −12…−6 dBFS window at the input gain you staged for the pedal — the app’s earlier fixed −12 dBFS sweep clipped direct loops at input gains that are perfectly healthy for pedal measurements, which is exactly why the level is now yours to set. Every calibration records the level it ran at and the loop gain it measured. Very low levels trade away signal-to-noise; runs under 20 dB SNR are rejected outright.

Running it

  1. Patch a short TS cable from either channel of the interface’s first output pair — the pair PedalScope drives; there is no output to choose — to the input you’ll use, through whatever adapter the output needs (Setting up your rig). No pedal in the loop.

  2. In the measure flow, pick your device, input, and sample rate on the Setup step, then run Calibrate. It plays a sweep through the cable and takes about ten seconds. The sweep level in use is shown next to the button.

  3. Re-patch the pedal into the loop and carry on measuring. The calibration is saved and reused until you change something.

If the run is refused before any sound with a sentence about the audio engine’s output stream or input stream being disabled, or about the stimulus never being rendered, PedalScope has declined to play into an audio engine the operating system brought up with a stream switched off (first seen on macOS 27.0, where the engine’s output element came up off after the interface was selected and a sweep would otherwise have played into nothing and blamed your cables). Run it again; if it recurs, re-select the interface on the Setup step. It is not a cable or a knob, and nothing about your rig needs to change.

Three optional companions live next to the Run button, all about making rig state recorded instead of remembered:

  • Rig controls. Click Define… to describe the interface’s own panel once — gain knob, INST/PAD/AIR switches — exactly as you define a pedal’s controls (there’s an interface template). Every calibration then records the positions you set, so “did the gain knob move since last week?” is answerable from stored data instead of memory. The knob’s effect is measured anyway (the chain gain); the recorded positions are the human-readable half.

  • The volts reference — optional. PedalScope is fully usable with no meter at all: every level is quoted in dBFS, and everything relative — harmonic ratios, THD, the knee, comparing your own records on your own rig — needs no volts. The volts factor is an optional provenance upgrade, not a setup step; Who needs a meter, and what it buys, below, says what it adds and what instrument it takes. If you measure it, the Play test tone button next to the field emits the meter-readable stimulus for exactly this (the procedure is under Verifying your level factor with a meter); enter the result in the 0 dBFS = … V peak field (also in Settings → Calibration), or let Compute from a reading… do the units arithmetic for you. Each calibration stamps the value it ran with; write how you measured it in that calibration’s notes. Leave it empty when unmeasured — charts then stay honestly in dBFS — and to return it to empty, delete the value and leave the field blank. The factor describes one interface: single-ending a balanced output costs about 6 dB against the manual’s figure on every rig, and where each rig actually lands is what the factor records — so when you pick a different device, PedalScope empties the field and says so beside it. Measure again on the new interface, or leave it empty. (The source impedance is not cleared: it describes the fixture, which moves between rigs with you.)

  • The source impedance. The Source impedance field states what sits in series between the interface output and the pedal’s input jack: 0 for the line output driving the pedal directly (the interface’s own output impedance is not counted), 10000 for the 10 kΩ series fixture. It pre-fills with 0 — the bare rig — and each calibration stamps the value it ran with, beside the volts factor, so every record made with that calibration shows it in its header (“source impedance 0 Ω”) and Compare flags records made at different values. Change it before running the calibration; a fixture inline at the output changes what the volts factor describes at the pedal, so switching jacks is a recalibration either way. Calibrations made before this field existed read “source impedance not recorded”, and that is not a claim of 0 Ω — some early records were captured through a 10 kΩ resistor with nothing on the rig side to say so, and only a note by whoever made them can say which. (The 10 kΩ fixture is also declared on the pedal’s own SOURCE control for the PSC-1 condition string — see Bench fixtures; the two say the same thing from the rig’s side and the pedal’s.)

  • Rig photos. Photograph the knob positions and the cable routing right here, while you’re standing at the rig — drop, browse, paste, or shoot with an iPhone via right-click, several at once. The photos store with the calibration that gets saved and stay editable later in Manage….

Who needs a meter, and what it buys

Nobody needs one to use the app. Without a volts factor every level stays in dBFS — the interface’s own digital scale — and every relative quantity PedalScope measures is complete: the harmonic recipe, THD, the compression knee and cleanup level, the Chord IMD products, the waveform matrix, and any comparison between your own records on your own rig. Nothing is missing and nothing breaks. If you have no meter, skip this section and the next; the volts field stays empty and honest.

A measured factor buys three things. It qualifies a record for the PSC-1 standard condition — the stated drive level in volts that makes your measurement comparable with one made on someone else’s rig (see Comparing measurements). It lets the input axes speak volts: the Transfer Curve’s input axis and the knee and cleanup readouts in volts at the pedal input rather than in a dBFS that means a different voltage on every interface. And it makes levels comparable across rigs: two calibrated rigs quote knee gaps and drive levels in the same physical unit, where two uncalibrated ones can only be compared with themselves.

The requirement is a specification, not a brand. The test tone at the −26 dBFS sweep level is about 119 mV RMS at the interface output on the reference rig (0 dBFS = 3.35 V peak there; your rig’s figure is the same order). Reading that takes an AC-volts range of a few volts or less with millivolt resolution, specified to at least a few hundred hertz. A mains-regime meter — the very cheapest tier, with AC ranges of 200 V and 750 V only — reads 119 mV as 0.0 or 0.1 and cannot do this measurement at all; nothing about its accuracy helps, because it never resolves the digit. For example, a meter whose AC volts range reaches 4 V at 1 mV resolution and is specified over 50–400 Hz — the Klein MM420’s published figures — covers this measurement. That is a check against a datasheet, not a test result: no meter has been measured against the reference rig, and the recommendation stands on the published specification and says so.

The level lever is the most useful thing on this page. The app divides the tone level out, so any known level gives the same factor — but a meter’s fixed “plus N digits” term is the same size whatever you read, so it dominates at small readings, and a louder tone is strictly more precise. On a meter specified at ±(1.0 % + 3 digits) on a 4.000 V range (one digit = 1 mV), with the reference rig’s factor:

tone level reading meter uncertainty
−26 dBFS (the sweep level) ≈ 119 mV ±4.2 mV = ±0.30 dB
−12 dBFS (the loudest fingerprint moment) ≈ 594 mV ±8.9 mV = ±0.13 dB

PSC-1’s whole drive tolerance is ±0.5 dB. Metering at the sweep level spends about 60 % of that budget on the meter alone; metering at −12 dBFS spends about 26 %. Read the factor at the −12 dBFS preset. Both presets deliver the same factor; the louder one resolves more of its digits.

Verifying your level factor with a meter

Every measurement stimulus is a sweep or a level ladder — statistics on a scope, invisible to a multimeter. The Play test tone button (next to the volts field, and only when a hardware device is selected) plays a steady sine out the selected interface at a known digital level, looping click-free until you press Stop. That turns the volts factor into a thirty-second reading instead of an exercise in max-hold statistics — and peak-detect max-hold on a sweep also rides up on noise coincidence, so the steady tone isn’t just easier, it’s more accurate.

Two level presets match the levels that matter: the calibration sweep level (whatever Settings → Calibration says, −26 dBFS by default) and −12 dBFS, the loudest moment of a fingerprint run — the one to use for a meter read, for the reason given above, and the one the picker opens on; a custom field takes any other level. The frequency presets are 220 Hz and 1 kHz. 220 Hz is the right default for a meter because mid-tier meters specify their AC-volts accuracy over roughly 50–400 Hz, and 220 Hz sits inside that window where 1 kHz sits outside it (220 Hz is also the compression probe’s frequency); 1 kHz is the classic scope reference. Frequency range is not what limits a meter on this measurement — resolution is, as the previous section says.

The custom field is the one place in PedalScope you can ask for a steady sine at digital full scale, sounding until you stop it — which is why the output level guard asks before it plays anything at or above −10 dBFS, quoting the level in volts once your factor is entered. Neither preset crosses that line.

To verify a factor you’ve already entered:

  1. Clip the meter to the interface output (tip–sleeve of the cable that normally feeds the pedal). Getting two clips onto tip and sleeve without unplugging anything takes a small fixture — the Breakout Box’s TIP and SLEEVE posts, or a bare plug or a cable with its cover unscrewed; see Bench fixtures.

  2. Play the tone at a chosen level. While it plays, the app shows the peak, peak-to-peak, and RMS volts it expects from your entered factor.

  3. Read the meter — on a scope use averaging acquisition and cursors (or the RMS/amplitude measurement); on a DMM read AC volts, which is RMS, at 220 Hz — and compare against the displayed expectation. Agreement within a few percent means the factor (and your whole output level chain) still stands.

To obtain the factor in the first place, same setup — and the Compute from a reading… button next to the volts field does the arithmetic for you: it already knows the tone level — the play picker’s own setting, and while the tone is sounding, the level that is sounding — so say what the instrument reported, type the number, and the app shows its work and fills the field. What it computes is one translation table:

You read To 0-to-peak volts Then
Scope, V peak use directly ÷ 10^(level/20)
Scope, V peak-to-peak ÷ 2 ÷ 10^(level/20)
DMM AC volts (= RMS) × √2 ÷ 10^(level/20)

A meter’s AC-volts reading is an RMS statistic, and average-responding meters are sine-calibrated, so a True-RMS meter is not required (fine if you have one) — what is required is the range and resolution stated in Who needs a meter: a few volts full scale, millivolt digits, specified to a few hundred hertz. On a scope, use averaging acquisition and cursors (or the amplitude/RMS measurement), as above. Example: −12 dBFS tone at 220 Hz, scope reads 1.68 V peak-to-peak → halve for 0.84 V peak → 0.84 ÷ 0.251 ≈ 3.35 V peak at 0 dBFS.

The tone is a utility, not a measurement: nothing is recorded, and it never plays while a calibration or measurement is running. If the reading disagrees with the expectation, an output knob has moved since the factor was measured — re-measure the factor, then recalibrate (the chain gain will have moved too).

A measured volts factor is also the ticket to the PSC-1 standard condition — the stated drive level that makes your measurements comparable with someone else’s rig. See Comparing measurements.

Recalibrate when anything in the chain changes: interface knobs (input gain, output/monitor level), the instrument/line switch, sample rate, which jacks you use (a series-resistor jack included — update the source impedance field first), cables, or the interface itself. The app stores calibrations per device and sample rate and warns on a mismatch, but it can’t see your knobs — keeping them where they were calibrated is on you.

Plugins never calibrate

A hardware calibration is a measurement of your rig — cables, knobs, converters, that day — which is why it has to be a step you perform. A plugin run has no rig: the loop is the offline render path itself, a constant with no cables, no gain staging, and nothing user-dependent in it. So PedalScope never asks — when a plugin run needs a calibration at the session’s sample rate and none exists, it measures the render path itself and proceeds, noting it in one progress line. The resulting “Plugin render path” baseline lands in the calibration manager like any other: same stored snapshot, same provenance chain under every record, archived rather than deleted once referenced. Only the ceremony is gone. One reading note: its flatness stamp legitimately shows about −0.6…+0.1 dB — that residue is the sweep analysis’s own fade edges, not the loop (a perfect pass-through reads exactly the same), so it never wears a badge.

The cable check (“is there a pedal in the loop?”)

The easiest calibration mistake to make is also the worst one: running the loopback sweep with the pedal still patched in. The result looks like a calibration — it has a latency, a response, a gain — but it’s a picture of the pedal, and every measurement compensated by it silently divides the pedal’s own tone and gain out of the results.

So before a completed calibration is saved, PedalScope compares it against what a plain cable produces:

  • Distortion. A cable loop measures around 0.01 % THD (the interface’s own floor). A distortion floor over 1 % means something in the loop is clipping — that’s a pedal, not a cable.

  • Flatness. A cable is flat; over the assessed band — the audible 20 Hz–20 kHz, clear of the sweep’s fade edges, and the stamp says so — the loop should stay within a couple of dB of its 1 kHz gain. Swings beyond ±4 dB look like a tone stack. (Ultrasonic converter rolloff above the audible band is honest interface behavior and stays out of the statistic, and so is the sweep’s own fade-in ramp: the assessed band starts where the response actually reaches full level — typically a couple of hertz above the sweep’s 20 Hz start — not at the nominal edge, so the ramp can never masquerade as a low-frequency cut.)

  • Loop gain. The input-gain knob is part of the measured loop, so a correctly staged rig doesn’t read unity — it reads roughly the staging target minus the sweep level (about +14…+20 dB at the default −26 dBFS sweep level). The app derives the acceptable window from your calibration’s own sweep level and widens it generously (−6…+26 dB at the default); gain outside it with the loop otherwise clean gets milder wording: a pad or attenuator below the window, an unexpected gain stage above it — either may well be deliberate.

When a check fires, the app asks plainly — “Is the pedal still connected in the loop?” — with Recalibrate as the primary action and an explicit Save Anyway override. It’s a warning, never a gate: if the odd loop is intentional (a fixed pad, a known-weird path), save it and carry on. The same verdict is computed retroactively in the calibration manager, so a suspect calibration that was already saved wears a badge there (“pedal in loop?” or “gain shifted”) instead of hiding among the clean ones.

The badge also follows the calibration to where it matters most: any measurement resting on a suspect calibration wears the same badge in its own header, next to the “calibrated, latency …” chip. Its tooltip names the evidence and which readings are most affected — a suspect loop response is divided out of every chart, so voicing and absolute-level claims inherit its faults first, while ratios read at a single drive are the most robust. It’s a badge on the calibration, never a verdict on the measurement: the device may still have been measured perfectly well at the frequencies the loop was honest about. Clicking the calibration chip on any measurement opens the stored calibration’s full detail — its stamps, the verdict, and the measured curves behind them (the loop response the flatness numbers summarize, the interface distortion floor behind the THD figure), read from the snapshot copy the measurement itself carries.

Managing stored calibrations

Calibrations accumulate — one per rig change, forever. Manage… next to the calibration list in the measure flow (or Manage Stored Calibrations… in Settings → Calibration) lists every one with its date, device, sample rate, measured loop gain, sweep level, and how many stored measurements reference it. Calibrations that fail the cable check wear a badge here — “pedal in loop?” or “gain shifted” — computed fresh from the stored numbers, so even ones saved before the check existed are flagged.

The rule the manager enforces: a calibration no measurement references can be deleted; one that measurements reference can only be archived — hidden from the pickers, kept as provenance. Nothing cascades: every measurement carries its own copy of the calibration it ran with, so neither deleting nor archiving can ever change a stored result.

There is no separate “active” calibration to protect. Pickers simply default to the newest unarchived calibration at the run’s sample rate, so archiving the newest one promotes the next — or, if none remain, the measure flow asks for a fresh calibration, which is the honest state after a rig change anyway.

The reference count is navigable: click “referenced by N measurements” to list the records resting on that calibration — each one names its pedal, title, and date, and clicking it opens the measurement itself. That closes the loop in both directions: from a measurement, the calibration chip opens the stored calibration; from a calibration, the reference line reaches every measurement that depends on it — exactly what a “which results did that bad loop touch?” morning needs.

Each row also expands (the chevron) to a notes field and rig photos. The notes are where the volts reference’s how-I-measured-it story and any cable-routing description belong; the photo wells take multiple shots — one of the interface’s knob positions, another of the cable routing — because routing state is exactly what a later “was that loop clean?” question needs, and it is the one thing the measured numbers cannot show. The add well takes several images in one pass — the file picker multi-selects, and a screenshot on the clipboard pastes straight in (right-click ▸ Paste Photo, or ⌘V with the well focused); a filled well’s right-click menu also copies the full-resolution shot back out and rotates a sideways one — the standard photo-well menu. The recorded rig-control positions appear in the row’s detail line.

The expansion also shows the charts behind the row’s numbers: the measured loop response the flatness figures summarize (with the ±4 dB suspicion lines and the assessed band marked, and the fade-edge points the verdict excludes drawn faded) and the interface distortion floor behind the THD figure (with the 100 Hz–5 kHz midband the quoted scalar reads and the 1 % cable-check threshold). The numbers were always honest; the curves they summarize are now one chevron away — and the same charts open from any measurement’s calibration chip.

What the numbers mean

A calibration reports a few figures of merit; here’s how to read them:

  • Round-trip latency — how long a signal takes to leave the app and come back, in samples and milliseconds. The value itself doesn’t matter (a few ms is normal); its stability does. The same rig should report the same latency within a sample on every run — if it jumps around, something (usually the interface’s buffer settings) is unstable.

  • Loop response — how flat the cable loop measures after compensation. Expect essentially flat (within about ±0.1 dB) across the audio band. A big tilt or ripple means a bad cable or an accidental processing stage (direct-monitor mix, loopback DSP) in the path.

  • Loop gain — the measured digital-out → digital-in gain of the loop, stamped alongside the sweep level it was measured at. Your interface’s knob positions are invisible to software, but the gain they produce is measured — this pair is the calibration’s settings fingerprint. If a fresh calibration reports a different loop gain than the last one on the same rig, a knob moved.

  • Interface distortion floor — the harmonics the interface itself adds, typically around 0.01 % THD on a decent interface. This is the measurement’s honesty line: PedalScope will not claim a pedal is cleaner than the interface measuring it. If a pedal reading approaches the floor, the chart is showing you the interface, not the pedal.

  • Noise / SNR — hiss picked up from the loop, measured from the silent lead-in. Drives the level recommendations in the measure flow.

For the curious

Latency comes from cross-correlating the captured sweep against the emitted one — polarity-agnostic, sub-sample interpolated. The loop’s frequency response is measured from the same sweep and divided out of later measurements (its inverse is regularized outside the sweep band so noise doesn’t blow up). The distortion floor uses the same synchronized-sweep harmonic separation as pedal measurements, so “interface THD” and “pedal THD” are directly comparable numbers. Level-invariance isn’t taken on faith either: the test suite calibrates a simulated loop at two very different sweep levels and requires the results to agree.

Level habits that keep calibrations honest

  • Calibrate at the same input gain you measure at — that’s the whole point of the staging order above. The sweep level is free to differ from your measurement drive levels; the knobs are not.

  • If the calibration reports clipping, lower the sweep level in Settings and run it again — leave the input gain where you staged it for the pedal. A clipped calibration is invalid, and the app will say so rather than store it.

The low-level warning

Clipping isn’t the only way to waste a converter. If a capture comes in far below the target window, PedalScope warns that you are spending converter resolution on silence — under-driven runs make the static transfer curve jittery near the zero crossing and put a worse noise floor under every derived number. The check projects each capture’s peak to the loudest planned drive using the level that run was actually played at, so deliberately quiet runs — a gain map’s soft steps — never false-alarm.

The warning is advice, not a gate: the run completes either way. It appears when a calibration comes in low, and again at measurement start — there it’s computed from the selected calibration’s measured loop gain, before any audio plays. The remedy is the staging order above: raise the interface input gain for the pedal case, then recalibrate at that gain. (A clipping loopback has the opposite remedy — lower the sweep level in Settings, and leave the input gain alone.)

Once calibrated, you’re two clicks from a real measurement — see your first measurement.