Skip to content

Scanning Generator Wrapper Architecture

atom edited this page Sep 3, 2026 · 1 revision

Scanning Generator Wrapper Architecture

This is the implementation view of Scanning. For ordinary use, import, and export, start with Scanning Recipes.

Scanning automates an ordinary FWG generator rather than introducing duplicate generator DSP.

For each resolved LFO position, the wrapper converts the Scanning recipe into one ordinary Pot1/Pot2/Pot3 coordinate and then calls the selected base generator's normal Smooth/Crunchy A–D path. Wavetable Type, routing, windows, Table Safety, Phase-Coherent Mode, Morph and downstream render processing therefore remain ordinary FWG stages.

Declarative recipe boundary

A Scanning recipe is data:

  • base generator;
  • Pot 1 trajectory;
  • Pot 2 trajectory;
  • Pot 3 trajectory.

It contains no executable DSP and is variant-agnostic. See Scanning Recipes for the public file format and custom-recipe workflow.

Built-in Scanning entries are curated named recipes using the same trajectory grammar as imported custom recipes. A custom recipe is resolved through the same base-generator implementation as a built-in recipe.

Direct/runtime equivalence

The important invariant is:

same recipe + variant + resolved LFO position + routing + Wavetable Type ⇒ the same ordinary-generator table regardless of whether the state came from a direct/static path or the Scanning runtime.

FWG's regression suite exercises this across the built-in Scanning catalogue.

LFO and offline rendering

Scanning LFO Rate spans 0.1–30 Hz. Live audition, animated display and offline deterministic rendering have different workload constraints, but they resolve the same declarative trajectory. Offline rendering is authoritative for exported audio; display frame-rate optimisations do not reduce audio/render precision.

Caching and Table Safety

Scanning caches store deterministic intermediate candidates, not history-dependent standby substitutions. Table Safety is resolved in the ordinary ownership path after cache lookup. This prevents earlier preview history, a cancelled render, or support diagnostics from changing an otherwise identical render plan.

Caches are bounded and treated as disposable optimisations.

Custom recipes

Imported custom recipes live only in the current page session. Reloading clears the session library. Morph/Explorer JSON embeds any custom recipe definitions it needs so exported work remains portable without requiring the recipient's session library.

Continuous Drawn-LFO shape interpolation

When START and END carry different Drawn LFO contours, semantic interpolation uses the exact continuous Morph position rather than rounding it to a 1/512 cache coordinate. Nearby Morph positions inside the old bucket therefore continue to produce changing LFO shapes instead of held states followed by a jump.

The expensive 512-point spectral inverse reconstruction is implemented as a radix-2 inverse FFT of the same Hermitian spectrum. This is an implementation optimisation only: pre-release direct-inverse-DFT versus IFFT equivalence tests produced Float32-identical reconstructed LFO tables and matching representative rendered PCM.

Fractured Wavetable Generator

Start here

🎹 Workspaces

🎹 Build and shape sounds

🎹 Make and keep results

🎹 Scanning and custom trajectories

Help and reference

🔧 Advanced / technical reference

Clone this wiki locally