KN7000 Effects DSP: The Complete Algorithm Catalog
KN7000 Effects DSP: The Complete Algorithm Catalog
The KN7000’s effects processor — IC306, an Analog Devices ADSP-21065L
“SHARC” — has no boot ROM: every program it ever runs is embedded in the main
MN10300 firmware as a pool of 80 download records (CPU
0x486BCEC4..0x486CE68D, about 71.6 KB) and streamed into the chip at boot.
The Effects DSP page explains that
host-boot mechanism and how the pool was extracted and disassembled.
This page records the end state of the reverse-engineering pass over that pool: every record is now fully documented — the resident kernel, the four boot-time SDRAM probes, all 72 effect microprograms, and the three data-only records. Every program-memory instruction of every record is disassembled and accounted for; every delay length, filter coefficient, LFO rate and gain quoted below is read off the listings. The GUI names are not guesses either: the firmware’s own preset-descriptor table (600 ROM descriptors) and its 24-byte group table were decoded, closing the chain GUI name → effect type → pool record as ROM fact for the whole inventory.
The result is a complete picture of a 2002 commercial effects engine — from its 4.6 KB operating system down to the pole placement of individual filter sections.
The kernel in brief
One record (rec04, 4,597 bytes) is the resident kernel — a tiny static-priority operating system that is downloaded once and never replaced. Its architecture, in five facts:
- The host protocol is the chip’s own host interface. The MN10300 reaches
the DSP through two mapped ports —
0x98000000(register-index latch) and0x9C000000(data) — and the “registers” it pokes are simply the ADSP-21065L’s documented IOP registers: the boot probe readsSYSCONexpecting its reset value, downloads are external-port DMA setups (IIEP0/IMEP0/CEP0,DMAC0 = 0xA1for 48-bit program words or0x41for data words) draining theEPB0FIFO, and the SDRAM self-tests report their verdicts through message registerMSGR3. Nothing about the boot path is custom silicon — it is a textbook ADI host boot. - Ten call slots per sample frame. The main loop waits for the 44.1 kHz
IRQ0 tick, then walks ten
CALLinstructions — one per effect unit. In ROM they all target a null stub; when the firmware loads an effect into slot n it patches thatCALL’s target word to0x8400 + n*0x100with a single program-memory poke. Each unit gets a fixed parameter block, state block, and delay-arena window, all advanced by cursor arithmetic hidden in the calls’ delay slots. - Eight self-chaining SPORT DMA rings. Audio enters and leaves over four
serial lines in and four out (to and from the tone generator, which is the
clock master). Each line’s DMA transfer-control block points at itself —
an infinite autobuffer moving 8 words per sample frame with zero software
attention, which is why all the SPORT interrupt vectors are
RTIstubs. - The FLAG3 half-rate strobe. The loop polls the FLAG3 input pin once per frame and scrolls a third delay ring (I3, 18,000 words of SDRAM) only when it is high. The four mic-reverb programs (below) prove by construction that FLAG3 is a fs/2 frame-parity strobe: they split their algorithm across the two phases, turning I3 into a 22.05 kHz arena with 816 ms of reach.
- BUSLK hot-patching. The IRQ0 interrupt handler locks the external bus
(
MODE2bitBUSLK) and the main loop releases it only after the delay-critical units have run. Host parameter writes therefore land in the frame tail, and because every effect re-reads its whole coefficient bank each frame, an update takes effect atomically at the next frame — race-free mid-note parameter changes with at most one sample frame of latency, with no mailbox and no DSP-side cooperation at all.
The full annotation — vector table, delay-arena grant table, the scrub stubs
that zero-fill a slot’s delay memory between effects, the effect ABI — lives
in kernel-architecture.md in the disassembly repository (see
Sources below).
Highlights of the catalog
Eight findings stand out from the pool. Each is a one-paragraph summary; the family documents carry the full instruction-level annotation.
The main reverb was filed under “Enhancer”
The instrument’s principal reverb is the rec51–56 family: a mono-in /
stereo-out Moorer-style reverberator with Dattorro-style input diffusion
— filtered early-reflection taps, a series diffuser of four allpasses, one
absorbing allpass, and two long lowpass-damped feedback combs, closed by an
output tone filter and a short stereo-decorrelation delay. The six records
are essentially one program (four are byte-identical; two differ only in four
early-tap immediates) with per-preset coefficient banks. The surprise is
where the host keeps it: the effect types 0x10–0x1F, which the selector’s
whitelist had been read as the “Enhancer” group, are this reverb engine —
while the whitelist’s “Reverb” types resolve to ensemble/flanger programs
with no tail-capable structure. The whitelist’s unit indices simply do not
map onto GUI roles the way first assumed.
The rotary speaker is a real Leslie simulation
The rec30 family (eight records plus the one-word variant rec16) is a full rotary-speaker simulator, not a renamed tremolo: an input crossover splits the signal into drum and horn bands, and two independent “magic-circle” sine/cosine oscillators spin the virtual rotors — drum at 5.512 Hz (331 RPM), horn at 6.431 Hz (386 RPM), a ratio of exactly 7:6 with the horn faster, matching real Leslie practice. Speed changes glide with a 93 ms time constant (rotor inertia), and the rotors drive Doppler-modulated delay taps — two quadrature taps swinging ±29 samples for the horn, one tap swinging ±40 samples for the drum — so the effect produces true pitch modulation, not just amplitude wobble.
The mic reverbs run at half sample rate
Records 58–61 (the microphone-channel reverbs Room / Karaoke / Stage / Cave) are a third, entirely separate reverb architecture: a series-allpass Schroeder reverberator — the textbook “colorless” cascade of six allpass sections, no combs, no global feedback — run at 22.05 kHz. The program is phase-split across the kernel’s FLAG3 parity strobe: half the tank executes on even frames, half on odd, over the u7-exclusive I3 ring, doubling both the delay reach and the effective memory budget. Audio-rate lowpass biquads bracket the half-rate core as decimation and interpolation filters. Data alone spans the family from a 2.3 s room to a 3.7 s cave — and the Karaoke preset zeroes four allpass gains, degenerating the tank into a single 363 ms regenerating slap echo: the classic karaoke-machine mic sound from the same program.
The brass simulators are physical modeling
Records 67–69 (“Brass Simulator 1–3”) are the only physical-modeling cluster in the pool: all three integrate a two-state nonlinear “lip” oscillator ODE per sample (with cubic and quadratic stiffness terms) and condition its output through a cubic soft-clipper. rec68 is the naked lip — a constant brassy edge; rec67 adds a pitch tracker and re-excites the lip with period-locked grains of the input; and rec69 couples the lip to a 512-sample bore delay line in a Karplus-Strong-style negative-feedback loop — an odd-mode comb, i.e. a closed-tube resonator with modes at odd multiples of ≈43 Hz: lip drives bore, bore pressure re-excites lip. A genuine, if stylized, coupled lip–bore waveguide inside a 2002 home keyboard.
Four wahs, one of which does not listen
The pool holds four distinct wah programs: rec28 Auto Wah (envelope-driven, sweeping up from a parked 447 Hz resonance past 6 kHz as the player digs in), rec47 Reverse Wah (envelope-driven, sweeping down — playing harder closes the filter), rec48 LFO Wah (LFO-swept bandpass, Q = 8), and rec29 Pedal Wah — the curiosity of the set. rec29 still computes the audio envelope of its fork-parent rec28 and never uses it: the detector is dead code, a fossil. What actually sweeps the filter is a host-written control cell — the expression pedal, relayed by the CPU — smoothed by the same attack/release slew, repurposed as click-free pedal glide. (rec74’s touch-wah front end and rec46’s 10-pole LFO filter round out the swept-filter census.)
The EQs are mirror-flat by construction
Both equalizers — rec23 (the 8-preset Parametric EQ) and rec34 (the unit-8
output 5-band EQ, a 13-word wrapper around kernel helper 0x831B) — share a
remarkable template: every section’s numerator is the bit-exact mirror
of its denominator (identical mantissas, flipped sign bits), so each of the
five cascaded sections computes exactly unity and the flat preset passes
signal through untouched. But the denominators are not trivial — the poles
are pre-placed at real, octave-spaced band centers (496 / 992 / 1985 Hz
mids with low and high shelves). A preset “boosts a band” by moving that
section’s zeros off its poles; an untouched band stays exactly flat rather
than approximately flat. (Relatedly, the GUI “Enhancer” (rec08) turned out
to be fully linear — a phase rotator with low/high emphasis and a Haas
offset — while the pool’s real harmonic exciter is rec20: a waveshaper
whose products are selected by a unity-peak 3.56 kHz bandpass and added to
dry.)
Three LFO idioms
Every modulated effect in the pool uses one of exactly three oscillator
constructions. (1) The table-lookup LFO: a 32-bit phase accumulator
(one cycle = 2³¹ counts) indexing a 16-step waveform table with linear
interpolation — and the three data-only records (rec77–79) are alternate
sine/triangle/square tables the CPU can push into that window to reshape a
running effect’s modulation without reloading its program. (2) The
magic-circle sine — the coupled-form recurrence sin' = sin + ε·cos;
cos' = cos − ε·sin' — which spins the Leslie rotors and the trio-chorus
shimmer. (3) The overflow-reflect triangle: phase += inc; if overflow,
inc = −inc — the accumulator ping-pongs between the arithmetic rails, its
signed increment flipping at each saturation. That third idiom is the
signature of the triangle-trio chorus engine (rec49/50).
Saturation arithmetic is load-bearing
The kernel’s only arithmetic-mode write (BIT SET MODE1 0x3000 at PM
0x8074) enables ALUSAT — fixed-point ALU saturation — and the effects
are designed against it: the overflow-reflect triangle LFOs bounce off
saturated rails instead of wrapping, rec07’s modulator sums (which can reach
±1.15) clip cleanly at ±1.0 to keep its tap swing bounded, and the gate
reverb’s hold-gate debounce counts on saturating adds. An emulator that
wraps where the chip saturates turns every such LFO into a permanent
full-scale two-sample oscillation — exactly the reverb-rail bug found and
fixed in MAME’s SHARC recompiler
(Effects DSP page, fix
catalogue). ALUSAT is not a detail; it is part of the algorithms.
The full inventory
The complete pool, record by record. GUI names come from the firmware’s own descriptor and group tables (ROM fact); “engine” is the algorithm class read from the disassembly.
| Record(s) | GUI name / role | Engine | One-line description |
|---|---|---|---|
| 00–03 | boot probes | SDRAM self-test | Four board-variant march tests of the DSP’s external SDRAM, tried in turn at boot; verdicts via MSGR3 |
| 04 | resident kernel | kernel | 10-slot per-sample dispatcher, 8 self-chaining SPORT DMA rings, 3 scrolling delay arenas, BUSLK update window |
| 05 | effect off | mute stub | Two zero writes — silences a send slot |
| 06 | Chorus / Celeste / GM Chorus 1/3 | ensemble chorus | Quadrature two-voice ensemble chorus |
| 07 | Modulated Chorus / Mod. Celeste / GM Chorus 2/4 | ensemble chorus | Dual-rate ensemble chorus (its LFO sums rely on ALUSAT) |
| 08 | Enhancer 1–6 | phase rotator | Phase rotator + low/high emphasis + Haas offset — fully linear, no exciter nonlinearity |
| 09 | Flanger | flanger | Stereo resonant flanger, 0.70 floating-point regeneration |
| 10 | Phaser | phaser | True phaser: 5+5 swept allpasses, quadrature LFOs |
| 11 | Ensemble | chorus | Hexaphase three-voice chorus, taps 67.5° apart |
| 12 | Medium / Short / Long Gate | gate reverb | Damped allpass-ring tank + hold-gate with saturation-dependent debounce |
| 13 | Dual Delay | echo | Dual-mono damped echo, 181 / 227 ms |
| 14 | Multi Tap Delay | echo | Four-tap panning echo |
| 15 | Cross Delay | echo | Cross-feedback ping-pong echo |
| 16 | Rock Rotary (Standard trio) | rotary speaker | The rec30 Leslie engine as a one-word variant |
| 17 | Distortion (Normal/Mild/Hard/H.C.) | waveshaper | AGC waveshaper, transfer curve A, no tone filter |
| 18 | Overdrive (Normal/Mild/Hard/H.C.) | waveshaper | AGC waveshaper, curve B + smoother + lowpass |
| 19 | Fuzz | waveshaper | AGC waveshaper, rail curve C, quiet-gate |
| 20 | Exciter 1–3 | harmonic exciter | LUT waveshaper → unity-peak 3.56 kHz bandpass product selector → summed with dry |
| 21 | Compressor (Comp. 1–4) | dynamics | Closed-form reciprocal gain law, Newton-refined, curve-meets-clamp continuity |
| 22 | Slow Attacker 1–4 | dynamics | Two-target gain machine: 743 ms swell, 2.9 ms reset |
| 23 | Parametric EQ (8 presets) | EQ | Mirror-flat five-section cascade, octave-spaced pre-placed bands |
| 24 | Tremolo 1–8 | LFO amplitude | In-phase LFO amplitude modulation (rec26 plus one word) |
| 25 | Limiter 1–4 | dynamics | Same program as rec21 with the Limiter coefficient banks |
| 26 | Auto Pan 1–7 | LFO amplitude | Quadrature-LFO stereo panner |
| 27 | Vibrato 1–8 | modulated delay | Wet-only modulated delay — no dry path, mono |
| 28 | Auto Wah (Wah 1–5) | swept filter | Envelope-swept resonator, upward sweep |
| 29 | Pedal Wah (Wah 1–3) | swept filter | Host-cell-swept resonator; the onboard audio detector is dead code |
| 30, 35, 36, 41–45 | Rotary Speaker / Rock Rotary Twins | rotary speaker | Full Leslie: crossover, two gliding rotors at exactly 7:6, Doppler taps |
| 31 | Ring Mod. 1–4 | ring modulator | Bipolar quadrature AM with an audio-rate carrier |
| 32 | Mixup 1–4 | modulated delay | Burst vibrato: sin·sin product modulators |
| 33 | Spreader (group “Space”) | stereo widener | Decorrelation micro-FIRs + 349 Hz bell + antiphase Haas echoes |
| 34 | output equalizer (unit 8) | EQ | Five-band wrapper around kernel helper 0x831B |
| 37 | Distortion “Bright” | waveshaper | Curve-A LUT + AGC + presence biquad + Haas offset |
| 38–40 | Distortion / Overdrive “Fat” / “Bright” | waveshaper | Voicing deltas over rec37 / rec18 — same engines, new coefficients |
| 46 | LFO Filter | swept filter | 10-pole computed-bilinear lowpass sweep |
| 47 | Reverse Wah (Wah 1–8) | swept filter | Envelope-swept bilinear bandpass, downward sweep |
| 48 | LFO Wah | swept filter | LFO-swept bilinear bandpass, Q = 8 |
| 49 | Chorus 1–4 (CHORUS screen) | triangle-trio chorus | Three overflow-reflect triangle LFOs + a magic-circle sine |
| 50 | Trio Chorus | triangle-trio chorus | The same engine as a deeper insert build |
| 51–56 | REVERB screen (Room / Plate / Concert / Dark / Bright / Stage …) | Moorer/Dattorro reverb | Early-reflection taps + 4-allpass diffuser + absorbing allpass + two damped combs |
| 57 | Voice Changer 1/2 | granular pitch | Dual-saw granular detune with an exact equal-gain crossfade |
| 58–61 | mic reverbs Room / Karaoke / Stage / Cave (unit 7) | half-rate Schroeder reverb | Series-allpass tank at 22.05 kHz, phase-split across the FLAG3 strobe on the exclusive I3 ring |
| 62–65 | Distorted Amp (Loud/Normal/Soft 1–4) | waveshaper | Cubic soft-clip overdrive, four tone banks |
| 66 | Vocal Harmonizer | granular pitch | Three-voice reflected-ramp granular pitch shifter |
| 67–69 | Brass Simulator 1–3 | physical model | Nonlinear lip ODE; rec67 adds pitch-locked grains, rec69 a Karplus-Strong-style bore waveguide |
| 70–72 | Delay+Chorus / +Flanger / +Vibrato | delay combi | Floating-point echo front end into the rec06 / rec09 / rec27 back ends |
| 73 | Delay+Phaser | delay combi | Floating-point echo into a three-stage swept-allpass phaser |
| 74 | Autowah+Delay | delay combi | Touch wah front end + stereo echo |
| 75–76 | Comp+Dst+Delay / Comp+Ovd+Delay | delay combi | AGC compressor → float-LUT distortion curve A/B → echo |
| 77–79 | LFO waveform tables | data | Sine / triangle / square tables pushed into the running LFO window |
What remains provisional
Everything structural above is ROM fact. What static analysis cannot pin is
host-runtime behavior: the live values the CPU writes into each
preset’s coefficient bank at select time (the templates are known, the
per-preset values are not), the handful of host-fed control cells (rec29’s
pedal cell, rec75/76’s PM 0x9801, rec14’s regeneration), the exact
send-bank ↔ serial-line identity order behind the MULTI-unit routing
verdict, FLAG3’s physical driver on the board (its function is pinned by
design necessity), and a few perceptual readings flagged as such.
Two live experiments would close the remaining questions: a data-memory dump
of the running EQ’s coefficient bank, and a unit-role capture —
breakpointing the firmware’s effect selector (DspEffectSelect,
0x48405815) while switching GUI effects and logging which unit, type, and
call slot each selection rewrites. Both are queued against the emulator.
Cross-model note
The KN6000 and KN6500 carry the same ADSP-21065L and a byte-identical record pool to one another; against the KN7000 all the coefficient banks match while the kernel’s program code is an older build — so this catalog’s preset voicings carry over to those models nearly wholesale. See the KN6000/KN6500 notes.
Sources
The instruction-level annotations live in the dsp/ tree of the
kn7000_disassembly repository (see
Firmware Images): the kernel in
kernel-architecture.md, and the effect families in reverb-algorithm.md,
chorus-family-algorithms.md, insert-effects-algorithms.md,
tremolo-rotary-family.md, phaser-enhancer-gate.md,
dynamics-eq-exciter.md, modulation-pitch-family.md and
final-batch-algorithms.md, alongside the generated SHARC listings and
per-record symbol files. The emulation side — how these programs run today
under MAME — is on the
Effects DSP page.