Contents

<!– Generated by hand for SushiDSP phase D6a. –>

ts_tone

TS808 tone and level stage: the passive low-pass, the active tone blend around the second op-amp, and the level pot with its output cap.

Status: schematic corrected, CSVs stale. Commit 2bdbf91 ran the previous netlist and committed its CSVs. That netlist was a mistranscription (see “The 2026-09-06 correction” below), so ts_tone_ac.csv and ts_tone_tran.csv describe a circuit that is no longer in this directory. Regenerate them with:

python tools/spice/export.py ts_tone --ltspice "%LOCALAPPDATA%/Programs/ADI/LTspice/LTspice.exe"

Until that runs, the block tests in tests/functional/unit/test_ts_tone_stage.cpp compare against the closed form only and skip both SPICE nulls.

LTspice version: LTspice 24, the only detail 2bdbf91 records; the exact build is not recorded by that commit.

How the schematic is written

ts_tone.asc carries the whole circuit as SPICE directive text on the sheet rather than as placed symbols with wires. Directive lines are netlisted verbatim by LTspice, so node names are explicit and the netlist cannot depend on symbol pin geometry that could not be checked without running the tool.

Analyses

Both analysis lines live on the sheet as comments and tools/spice/export.py enables exactly one of them per run:

  • ;ac dec 40 10 20k
  • ;tran 0 40m 20m 1u (40 ms run, the last 20 ms saved as steady state)

.options plotwinsize=0 keeps the raw file uncompressed.

Probe and stimulus

  • Probed node: out (the level pot’s wiper).
  • Input node: src
  • Source: V1 src 0 SINE(0 {AMP} 1k) AC 1
  • Input level(s): AMP = 100 mV fixed (this block steps Tone instead).

Stepped control

.step param TONE list 0.1 0.5 0.9

TONE is the normalised 20 kΩ tone-pot fraction measured from the op-amp’s + input. TONE = 0 puts the wiper on the + input, which hangs the 220 nF / 220 Ω leg on the passive low-pass and cuts treble further; TONE = 1 puts it on the - input, where the same leg becomes the stage’s gain leg and boosts treble instead. So TONE = 1 is bright, the opposite sense to the netlist this file replaces. LEVEL is held at 1 (full).

Components

Ref Value Nodes Spec reference
V1 SINE(0 {AMP} 1k) AC 1 src - 0 D6c stimulus
R7 1 kΩ src - a passive low-pass, series leg
C5 220 nF a - 0 passive low-pass, shunt leg
R9 10 kΩ a - 0 4V5 bias return; an AC ground
Rta {20k*TONE} a - tw 20 kΩ tone pot, +-side section
Rtb {20k*(1-TONE)} tw - inv 20 kΩ tone pot, --side section
C6 220 nF tw - tm tone leg, series cap
R8 220 Ω tm - 0 tone leg, series resistor
R11 1 kΩ inv - tsout op-amp feedback
Eop gain 1e6 tsout - 0, sense (a, inv) the second op-amp, IC1B
C7 1 µF tsout - lt output cap
R12 1 kΩ lt - ltop series resistor into the level pot
Rla {100k*(1-LEVEL)} ltop - out level pot, upper section
Rlb {100k*LEVEL} out - 0 level pot, lower section

R12 is called R11 a second time on the ElectroSmash drawing, which reuses the designator. This file renames it so LTspice sees two distinct elements.

The 2026-09-06 correction

The netlist committed in 2bdbf91 was written from the D6c spec’s prose description rather than from a schematic, and the prose was wrong. It wired the second op-amp as an inverting integrator: the tone pot bridged a 220 nF series / 1 kΩ shunt high-pass and the op-amp output, the wiper fed a virtual-earth summing junction through 10 kΩ, and 220 nF closed the feedback. Three measurements said it could not be a tone control:

  • Insertion loss at noon was 30.43 dB at 100 Hz and 34.38 dB at 1 kHz. The stage was an integrator with unity gain at 1 / (2π · 10 kΩ · 220 nF) = 72.3 Hz, falling 20 dB per decade above it, so a pedal built on it would have needed about 30 dB of make-up gain somewhere.
  • The knob moved level by 19.08 dB while the corner moved 807 Hz to 760 Hz. A tone control moves the corner, not the level.
  • TONE = 1 shorted the wiper to the op-amp output and muted the stage at −146 dB, so the knob mapping had to stop short of its own end stop.

Against the sources cited on the sheet, four things were wrong:

  1. The passive filter was inverted. R.G. Keen: “Following the clipping stage there is a 1K resistor leading to a 0.22uF capacitor to ground. This acts like a simple RC lowpass filter, with the rolloff point being 723Hz.” The old netlist had the cap in series and the 1 kΩ to ground, giving a high-pass at the same 723 Hz.
  2. The tone pot bridged the wrong pair of nodes. Keen: “The control is a 20K potentiometer strung from the (-) to the (+) input of the second opamp section.” The old netlist strung it from the filter node to the op-amp output.
  3. The wiper leg was missing entirely. Keen: “The wiper of the control is tied to a series RC combination to ground. This RC is a 220 ohm resistor and a 0.22uF capacitor.” The old netlist had neither the 220 Ω nor the wiper-to-ground cap, and instead spent its 220 nF as an integrator feedback cap and invented a 10 kΩ that the real stage does not have.
  4. The op-amp was inverting. The real stage is non-inverting, with R11 1 kΩ from the output back to the - input; the tone pot’s --side section and the 220 Ω / 220 nF leg are its gain leg. That is what produces treble boost at the bright end, which an integrator cannot do.

The corrected network measures 0.9946 dB of insertion loss at 100 Hz at noon and 16.19 dB of knob range at 3.2 kHz, the frequency Keen names as the leg’s turnover. That 0.9946 dB is the filter’s 1.1957 dB, the gain leg’s +0.2887 dB and the output network’s 0.0875 dB; of the filter’s share, 0.8279 dB is R7 against the 10 kΩ bias return and the rest is C5 and the wiper leg loading that node.

Judgment calls and open questions

  • The output cap (1 µF), the 1 kΩ after it, the level pot (100 kΩ) and the 10 kΩ bias return are read off the ElectroSmash drawing. D6c’s prose does not give them.
  • There is no separate load resistor. The level pot’s lower section is the load, which is what the drawing shows; the output buffer that follows it in the pedal is high impedance.
  • At the default LEVEL = 1 the pot’s upper section would be 0 Ω, so the schematic clamps both sections at 1 mΩ. LTspice treats a zero resistance as a short and reports it as a warning rather than an error, but the clamp keeps the two pots written the same way.