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.