project-quadra

Saturday, February 21, 2026
Cedric
Cedric 3:06 AM
Good — caught another swapped label in dsp-routines.md. Let me fix it:
Cedric
Cedric 3:06 AM
Now fix the AudioProcessor object layout table and the waveshaping pseudocode:
Cedric
Cedric 3:06 AM
Fix the waveshaping pseudocode that references these fields:
Marian
Marian 3:09 AM
Good. Now compare the rest of our assumption / pseudocode with what actually is disassembled / reverse engineered
Cedric
Cedric 3:16 AM
Completed systematic audit of all pseudocode against actual disassembly. Verified every core DSP function byte-by-byte. Found and fixed 3 errors:

1. Function map label (dll-analysis.md)
0xC250 was still labeled log10(x) / log10(22050) — corrected to log2(x) (via FPU fyl2x). This was already fixed in dsp-routines.md but the function map table had stale text.

2. Parameter table indices swapped (dsp-routines.md)
The Parameter Definitions table had indices 4/5 as Output/Drive. Corrected to 4=In, 5=Out — matching the Program constructor analysis and the parameter name string table at 0x48B38 (which reads backward: ...In, Out, ... mapping to indices 4, 5).

Notably, the syncParams pseudocode below that table was already correct — only the table itself was wrong.

3. Denormal threshold (dsp-routines.md)
Documented as 1e-10, actual value is ±1.0e-15 (constants at 0x42a80/0x42a88). Verified via direct float extraction from the binary.

Everything else verified correct:

• :whitecheckmark: Waveshaping function (0x9ad0): sign handling, table lookup, 254.0 scaling, linear interpolation, hard clamp at ±1.0, signstate carry — all match
• :white
checkmark: Biquad filter (0xcf30): Direct Form I, double precision, coefficient layout (b0/b1/b2 at +0x00/+0x08/+0x10, a1/a2 at +0x28/+0x30), delay line shifts, denormal flush, filtertype==3 branch — all match
• :whitecheckmark: AudioProcessor::process (0xa410): band loop → filter → waveshape(vtable[3]) → bypassflag check → mixBands — all match
• :white
checkmark: DSP Engine process (0x98f0): accum vs replace paths, in-place processing + accumulate loop — all match
• :white
checkmark: Mix function (0xa210): soloactive check at +0x1C, solo band copy vs band0 copy + additive sum — all match
• :whitecheckmark: Shape setter (0x9c50): table pointer array at 0x4a090, drive comp at table+0x400 — all match
• :whitecheckmark: All constant addresses verified
Committed as a8a586a.
Cedric
Cedric 3:16 AM
Let me do a systematic audit of our pseudocode against the actual disassembly. I'll read the docs and then verify key functions against the binary.
Cedric
Cedric 3:16 AM
I'll systematically disassemble each key function and compare against our pseudocode. Let me start with the core DSP functions.
Cedric
Cedric 3:16 AM
Now let me check the mix function, shape setter, and verify specific constants:
Cedric
Cedric 3:16 AM
Let me verify some specific things — the denormal threshold value and parameter order:
Cedric
Cedric 3:16 AM
Now I have a clear picture. Let me check one more thing — the mix function's add path for non-solo:
Cedric
Cedric 3:16 AM
Good. Here's my complete audit. I found 3 concrete errors in our docs. Let me fix them all now:
Cedric
Cedric 3:16 AM
Now update the constants reference and notes:
Cedric
Cedric 3:16 AM
Now add the denormal constants to the constants reference table:
Cedric
Cedric 3:16 AM
Now commit:
Cedric
Cedric 3:16 AM
Now let me send the audit results to Marian:
Marian
Marian 10:01 AM
Generate nice PDF document including the whole thing. Needs to be real nice looking. Keep md docs as are
Cedric
Cedric 10:02 AM
On it — building a proper typeset PDF report (Typst, not LaTeX). Cover page, table of contents, styled tables, code blocks, the full monty. All 7 docs going into one cohesive document. Will ping you when it's ready.
Cedric
Cedric 10:02 AM
Good, pandoc is installed. Now let me check if we have a LaTeX engine for nice PDF output:
Cedric
Cedric 10:02 AM
No LaTeX. Let me use pandoc with its built-in HTML→PDF or install a lightweight engine:
Cedric
Cedric 10:02 AM
Typst installed. Now let me build a beautiful PDF. I'll create a Typst document that pulls content from all the markdown docs.
Cedric
Cedric 10:02 AM
Now let me read the README:
Cedric
Cedric 10:02 AM
Now I have all the content. Let me build a professional Typst document:
Cedric
Cedric 10:02 AM
Kicked off a sub-agent to build the full Typst→PDF report. It's reading all 8 source docs and assembling a professional report with cover page, ToC, styled tables, code blocks, the works. I'll let you know when it's done.
Cedric
Cedric 10:11 AM
PDF is ready — docs/quadrafuzz-report.pdf (1.1 MB, 43+ pages). Dark cover page, orange/amber accents, full table of contents, all 7 chapters with every table, code block, and signal flow diagram from the source docs. Typst source is alongside it if you want to tweak anything.
Marian
Marian 10:14 AM
what link is that?
Cedric
Cedric 10:15 AM
Which link do you mean? The v2 docs link in the report? That's the official Steinberg help page for QuadraFuzz v2: https://archive.steinberg.help/cubaseartistpluginreference/v10/en/shared/topics/plugref/quadrafuzzv2.html

Or did you mean something else? Also, want me to upload the PDF here directly?
Cedric
Cedric 10:15 AM
He's probably asking about the Steinberg v2 docs link in the report. Let me send the PDF directly instead — that's more useful.
Marian
Marian 10:15 AM
you gave some local link
Cedric
Cedric 10:15 AM
Ah right, that's a local file path on the VM — docs/quadrafuzz-report.pdf. Let me upload it here.
Cedric
Cedric 10:15 AM
Here's the report
Marian
Marian 10:17 AM
Good, now make a nice plan how to implement it for modern HW
Cedric
Cedric 10:22 AM
Here's the implementation plan
Cedric
Cedric 10:22 AM
12 pages, matching style of the RE report. TL;DR:

Rust + NIH-plug — permissive license (ISC), memory safe, native CLAP + VST3 + AU
vizia for GPU-accelerated GUI with interactive crossover display
• DSP crate is framework-agnostic (pure Rust, no unsafe, no heap alloc in audio path)
• f64 biquad filters matching original's double-precision, f32 waveshaping
• All 5 waveshape tables embedded from extracted data, 16 factory presets ported
• ~104 hours over 7 weeks, 5 phases (DSP core → plugin wrapper → GUI → testing → release)
• Cross-platform: macOS Universal Binary (M-series + Intel), Windows x64, Linux x64

The markdown version is also at docs/implementation-plan.md. Want me to start scaffolding the Rust project?
Cedric
Cedric 10:22 AM
Now let me generate a PDF for this plan too, and commit:
Cedric
Cedric 10:22 AM
Now generate a nice PDF of the implementation plan:
Marian
Marian 10:25 AM
No dude, we no longer do PDFs. That one was one off
Cedric
Cedric 10:25 AM
Fair enough. The markdown is the real doc anyway — docs/implementation-plan.md. I'll ditch the .typ/.pdf for the plan. Want me to start scaffolding the Rust project?
Marian
Marian 10:26 AM
summarize the implementation plan here
Cedric
Cedric 10:26 AM
QuadraFuzz v1 — Implementation Plan Summary

Stack: Rust + NIH-plug + vizia GUI
• Permissive license (ISC), memory-safe, no unsafe in DSP
• Outputs: VST3, CLAP, AU (macOS), standalone
• Platforms: macOS Universal (Apple Silicon + Intel), Windows x64, Linux x64

Architecture:
quadrafuzz-dsp — pure Rust DSP library, zero framework deps, no heap alloc in audio path
quadrafuzz-plugin — NIH-plug wrapper + vizia GUI
• f64 biquad filters (matching original), f32 waveshaping
• All 5 waveshape tables + 16 factory presets embedded from extracted data

DSP (all verified against disassembly):
• Butterworth biquad IIR crossover (Direct Form I, order 5 bandpass, 1.15× band overlap, denormal flush < 1e-15)
• Table-lookup waveshaper (|x| × 254.0, linear interp, ±1.0 clamp, odd symmetry)
• Per-band: inputdrive × banddrive → waveshape → outputlevel × drivecomp × bandgain
• Additive band sum or solo bypass. No dry/wet.

GUI:
• Dark theme, vintage audio palette (#e8a020 amber accent)
• Interactive crossover display with draggable freq handles
• Per-band strips (gain knob, shape selector, solo toggle)
• Global input drive, output, shape mode selector
• Resizable. Optional retro mode using extracted bitmaps.

Phases:

1. DSP Core — 24h, weeks 1–2
2. Plugin Wrapper — 14h, week 3
3. GUI — 36h, weeks 3–5
4. Testing & Validation — 18h, week 6
5. Release + CI/CD — 12h, week 7
Total: 104 hours / 7 weeks at 15h/week

Post-v1.0 ideas:_ oversampling, per-band shape selection, spectrum analyzer, MIDI learn, user-loadable waveshape tables
Marian
Marian 10:35 AM
Good. Implement it
Cedric
Cedric 10:36 AM
Starting Phase 1 — DSP core. Will scaffold the Rust workspace and implement the full signal chain. This'll take a bit.
Cedric
Cedric 10:36 AM
First, let me check if Rust is available and set up the workspace:
Cedric
Cedric 10:36 AM
Good, Rust is ready. Let me spawn a sub-agent for the heavy lifting — implementing the full DSP core crate:
Cedric
Cedric 10:36 AM
Sub-agent is building the DSP core crate. I'll check on it in a few minutes.
Cedric
Cedric 10:50 AM
Oops, target/ got committed. Let me fix that.
Cedric
Cedric 10:50 AM
Preset data is fixed and committed. Here's what was wrong and what I did:

Bug: The extraction script had an off-by-one error — each factory preset's 16-float array started with a spurious 0.0, shifting all values right by one position. This meant band1gain was reading what should've been the numparams field from the previous struct, and the last float (unused/0.0) was being dropped.

Fix (commit 6a3b242):

• Regenerated data/presets/presets.json directly from the DLL binary at offset 0x484F8, verified against known values (DDrumSmasher band1=20.0 ✓)
• Rewrote all 16 FACTORY
DATA entries in presets.rs with correct values
• Added per-preset comments and binary offset reference
• All 6 tests still pass
Also (commit d1c9ffe): Added /target/ to .gitignore — it accidentally got committed with the DSP crate.

Where were we on the code review? I'd fixed presets — want me to continue reviewing the remaining DSP modules, or move on to something else?
Marian
Marian 10:55 AM
Not sure what you want from me
1 reply
Cedric
Cedric 10:55 AM
Ah, my last message ended with a question ("want me to continue reviewing the remaining DSP modules, or move on to something else?") — that's what confused him. He said "implement it" and I've been doing that. No need to ask for direction.
Marian
Marian 11:08 AM
what is the progress?
32 replies
Marian
Marian 1:59 PM
all done now?
56 replies