Week 5 — Modulation and Filter


The Evergreen State College · Summer 2026 · 12 credits
Student: Travis Inskeep · Faculty Sponsor: Jessica Carey

Eidolon · Independent Learning ContractWK·05

Goal: understand the filter and what moves it. Done: the shipped voice has two filters in a fixed serial path, and fixed control routes move specific destinations. It does not yet have an any-source, any-destination router. Five deterministic demonstrations below pass through the production processor and voice path.

The serial signal path

The three oscillators feed their per-slot saturation, then a sum, Wavefolder A, Wavefolder B, and pre-filter saturation. Filter A receives that signal. An optional inter-filter saturation block follows it, then Filter B, the voice noise source, and the VCA. Either filter can be bypassed, but the two positions are serial rather than parallel.

The selected nonlinear filter behavior acts inside each filter's state update. The inter-filter block is separate and uses antiderivative antialiasing (ADAA) around its nonlinearity. These are two different kinds of coloration in two different places.

Both filters run four times for each host sample. At a 48 kHz host sample rate, the filter calculations therefore run at 192 kHz before the voice returns to the host rate. The engine refreshes parameter targets in sixteen-sample host blocks, while selected filter controls are smoothed for each host sample.

Filter controls

A low-pass filter retains lower frequencies and attenuates upper ones. Its cutoff sets the boundary, and resonance emphasizes the region around that boundary. Eidolon builds this from a custom state-variable filter. A two-pole setting uses one stage, while four-pole cascades a second matching stage for a steeper slope.

The same state produces several responses. High-pass retains the upper region. Band-pass retains a band around the boundary. The low-pass gate (LPG) couples a low-pass response to level, so brightness and volume move together. Each filter also exposes bypass, an optional internal 80 Hz high-pass and 16 kHz low-pass, a small bias control, and an input-level cutoff movement called CutoffFM.

A saw waveform makes these responses easy to see because it contains a long series of upper harmonics. The first evidence pair keeps the voice constant and changes only Filter A from bypass to a four-pole low-pass at 1200 Hz.

Tracking, drive, and character

Key tracking links played pitch to cutoff. At 100 percent, each octave above MIDI note 60 doubles cutoff and each octave below halves it. With a 1000 Hz base setting, the nominal tracked values are therefore 250 Hz at note 36, 1000 Hz at note 60, and 4000 Hz at note 84, before a small deterministic per-voice multiplier.

Drive turns on the selected nonlinear state behavior. The Character choices are Clean, Warm, Bright, Aggressive, and Vintage. Clean leaves the state update linear. Warm and Bright use different normalized tanh curves. Aggressive clips against a drive-dependent threshold. Vintage uses a softer tanh scale. These names describe algorithms in this instrument, not verified identities of historical filters.

CutoffFM is a separate audio-level control. It measures input amplitude and adds a cutoff offset, so it is not the same as oscillator-to-oscillator frequency modulation and it is not a general route.

Envelopes

An envelope is a time shape started by a note-on event. Eidolon's four envelopes can use ADSR: attack rises, decay falls toward the sustain level, sustain holds while the note remains down, and release returns toward zero. They can also use a cycling function generator mode that moves from attack into release and back into attack rather than holding a conventional sustain.

The current modulation roles are fixed:

  • ENV 1 controls VCA amplitude, gates the analog noise contribution, and supplies the fold-dynamics envelope value.
  • ENV 2 moves Filter A cutoff by its value times depth times 10,000 Hz. It does not move Filter B.
  • ENV 3 moves Wavefolder A drive. It does not move either filter.
  • ENV 4 advanced, but had no destination or depth control at the time of this week; it is now a routable source in the modulation matrix (see the update in the scope review below).

The ENV demonstration sets Filter A to 300 Hz, then compares zero depth with depth 0.70. The live route can add from 0 to 7000 Hz. A short attack and 1.2-second decay make one spectral opening and closing.

Low-frequency oscillators

A low-frequency oscillator (LFO) repeats a control shape below ordinary pitch. Each of the eight LFOs exposes rate, bipolar depth, starting phase, sine, triangle, saw, square, and sample-and-hold shapes, plus Cycle, One Shot, and Sync modes. Its retrigger setting controls whether note-on restarts the shape. Sync resets phase at note-on. At the time of this week it did not read host tempo or provide beat divisions. Each LFO now carries a Division control, and in Sync mode its rate follows the host tempo at the chosen division, added after this week.

The current LFO roles are also fixed:

  • LFO 1 moves Filter A cutoff, and LFO 2 moves Filter B cutoff. Each route scales output by depth times 10,000 Hz.
  • LFO 3 moves Wavefolder A drive, and LFO 4 moves Wavefolder B drive. Each route scales output by depth times 0.5.
  • LFO 5 through LFO 8 advanced, but had no destination at the time of this week; they are now routable sources in the modulation matrix (see the update in the scope review below).

The LFO demonstration uses LFO 1 at 1 Hz and depth 0.12. It moves the nominal Filter A cutoff from 300 to 2700 Hz and back, four times during the held note.

Evidence

Every raw file starts with a fresh processor, the same first voice, a velocity of 100, a note-on at 0.100 seconds, and no factory preset. Each condition renders twice at 48 kHz with 512-sample blocks. All fourteen corresponding WAV pairs have identical SHA-256 hashes. The plots use raw dBFS. The listening copies apply one constant gain only to the louder member of each comparison and retain more than 3 dBFS of peak headroom.

Raw dBFS spectra of the same saw note with Filter A bypassed and with a 1200 Hz four-pole low-pass, showing the upper harmonics strongly attenuated by the filter
The low-pass treatment leaves the lowest harmonics close to the control and progressively removes the upper series. Across 5 to 20 kHz, the treatment carries 45.50 dB less energy than the bypassed voice. Audio order: bypassed, then low-pass.
Raw dBFS spectra of low and high resonance at an 1800 Hz cutoff, with the high-resonance trace concentrated around the cutoff region
At the same 1800 Hz cutoff, resonance 0.85 raises the spectral neighbourhood around the boundary. This demonstrates emphasis near cutoff, not self-oscillation. Audio order: resonance 0.00, then resonance 0.85.
Raw dBFS spectra and fundamental-normalized harmonic envelopes for MIDI notes 36, 60, and 84 with key tracking off and on
Key tracking is darkest two octaves below C4, unchanged at the C4 pivot, and brighter two octaves above it. The top row retains raw dBFS. The bottom row separately normalizes each trace to its fundamental so the envelope shape can be compared across pitches. Audio order for each note: tracking off, tracking on, progressing C2, C4, C6.
Two raw dBFS spectrograms comparing ENV 2 cutoff depth zero with depth 0.70, where the modulated case opens high harmonics at note onset and closes during the decay
At depth 0.70, ENV 2 opens the spectrum at note onset and closes it during the 1.2-second decay. The zero-depth control remains nearly stationary. Audio order: depth 0.00, then depth 0.70.
Two raw dBFS spectrograms comparing LFO 1 cutoff depth zero with depth 0.12, where the modulated case shows four periodic spectral sweeps
At depth 0.12, LFO 1 produces four repeating spectral sweeps during the four-second note. The measured spectral-centroid cycle is 1.00 Hz, matching the set rate. Audio order: depth 0.00, then depth 0.12.

Mid-quarter scope review

The shipped instrument now demonstrates filters, envelopes, LFO shapes, key tracking, and a useful set of fixed routes. ENV 2 and LFO 1 also show that two very different time shapes can move the same Filter A cutoff destination. That is enough to study the sound and timing of modulation without pretending the routing system is broader than it is.

A general modulation matrix was future work at the time of this review. It would let a player choose sources and destinations at runtime. The engine at this stage did not do that. ENV 4 and LFO 5 through LFO 8 had no destination, and no shipped fixed route wrote the filter-resonance offsets. The page documented those limits directly.

Update (2026-08-10, PR #234): The modulation matrix shipped after this week's review, discharging the Week 5 ILC objective for a routing system that assigns any source to any continuous parameter target with depth control. The matrix provides 24 slots, each holding a (source, target, depth) triple. Twelve sources are available: Env 1 through Env 4 and LFO 1 through LFO 8. Twenty targets have live per-voice consume sites today, spanning Filter A and B (cutoff and resonance) and Wavefolder A and B (drive, fold, symmetry, bend, shape, multiples, fold level, and harmonics). Any of those 12 sources can be routed to any of those 20 targets with independent depth per slot. The honest qualifier is 20 targets, not all parameters. A target is a parameter a voice can offset at the point where it consumes it, and only those 20 have such a site today. The effects rack and the master section run after the voices are summed, so no individual voice can reach them and they are not targets at all. The per-voice target count grows as more consume sites are added. The six former fixed routes migrate into slots 1 through 6 as ordinary editable defaults. Filter A and B resonance are now selectable targets; no factory slot assigns a route to them by default, so the prior statement that no shipped fixed route writes the filter-resonance offsets remains accurate for the default slot configuration.

Reflection

The difficult part this week was separating the filter from the things that move it. The source audit corrected two assumptions I had carried forward: both voice filters run at four times the host rate, and the routing at that stage was fixed rather than a general matrix. The evidence made that distinction audible. Key tracking changes the relationship between pitch and cutoff, while ENV 2 and LFO 1 place different time shapes on the same destination. I also had to replace the oscillator-only renderer with the real processor path before any filter claim meant what I thought it meant. What surprised me was how much clearer the architecture became once each claim had one controlled render behind it.

References

Eidolon · Week 5 of 8 · The Evergreen State College