home/ atoms/ ddsp-processor-api

The DDSP Processor separates unconstrained network outputs (inputs) from physically valid synthesizer controls

Every DDSP synth and effect inherits from Processor (a tf.keras.Layer). The class separates two steps: get_controls() maps raw network tensors into physically meaningful, constrained controls (e.g., positive amplitudes, band-limited harmonic distributions), and get_signal() converts those controls to audio. Calling the Processor directly invokes both in sequence. This split makes the physics explicit: you can inspect the controls before synthesis and you can easily swap networks while keeping the same DSP interpretation. The inputs are the raw neural outputs; the controls are the post-processed, interpretable parameters; the signal is the resulting audio tensor.

Examples

harmonic = ddsp.synths.Harmonic()
# inputs -> controls -> signal
audio = harmonic(amplitudes, harmonic_distribution, f0_hz)
# Or step by step:
controls = harmonic.get_controls(amplitudes, harmonic_distribution, f0_hz)
audio = harmonic.get_signal(**controls)

Assessment

Given a Processor subclass, identify which method applies constraints (e.g., removes harmonics above Nyquist) and which generates the audio waveform. Describe what physically invalid outputs the controls step prevents.

“Unlike other layers, Processors (such as Synthesizers and Effects) specifically format their `inputs` into `controls` that are physically meaningful.”
corpus · ddsp-differentiable-digital-signal-processing-magenta-code-c · chunk 3