Chapter 04: Modulation Matrix
LFO, ModEnv, Marbles, Lorenz, Cellular, Tidal, Orbital, XY Pad, and Macro Knobs.
4.1 Modulation Architecture
The modulation system in TOMiC is one of the most comprehensive ever built into a drum synthesizer. Each layer (A and B) of every channel features up to 4 instances of each of the 3 base modulator types (LFO, ModEnv, Marbles), plus 4 instances each of 7 advanced modulator types (Markov, Lorenz, Cellular, Tidal, Orbital, Chladni, CvGranular) — 40 modulator instances per layer in total. Additionally, at the channel level (shared across A/B, not duplicated per layer), 4 HandMade/Record instances and 2 XY Pad instances are available. Only the first instance of each type is enabled by default; the rest are pre-allocated slots revealed with the "+ Add" button in the UI.
Each modulator features 15 routing destination slots (m1_dest..m15_dest with matching m1_amt..m15_amt), allowing a single LFO — or any other modulator — to drive up to 15 parameters simultaneously, each at its own depth. The XY Pad is a special case: its X and Y axes each get their own independent bank of 15 slots (mx1..mx15 / my1..my15), for 30 destinations per instance.
All modulators share one master destination list — the LfoTarget enum — which currently spans roughly 450 possible targets, covering virtually every sound-shaping and FX parameter in the synth, from oscillator pitch and filter cutoff to reverb send and even other modulators' own parameters (see 4.9).

Modulation Matrix and Modulators
Figure 4.1: Modulation panel — LFOs, Modulation Envelopes (ModEnv), and destination matrix routings.
Patch-Cable Routing
Every modulator panel has a small output jack. Dragging from it produces an animated "patch cable" — release it over any modulatable knob to wire that modulator into the knob's first free routing slot at a default amount of 50%. Every eligible knob highlights with a colored ring while a cable is in flight, and dropping outside a valid target retracts the cable. This is in addition to (not a replacement for) manually picking a destination from the m1_dest..m15_dest dropdowns in the modulator's own panel.
4.2 LFO (Low Frequency Oscillator) — Up to 4 per Layer
LFO Parameters:
Routing Slots:
Each LFO features 15 modulation routing slots. Each slot consists of:
m1_dest..m15_dest): Modulation target selected from the complete LfoTarget listm1_amt..m15_amt): Modulation depth (−100% to +100%)4.3 Mod Envelope (ModEnv) — Up to 4 per Layer
Modulation envelopes are single-shot ADSR generators designed for dynamic parameter shaping — separate from the oscillator/noise amplitude envelopes, which are dedicated volume-only controls.
EnvCurve): Envelope shape — Exp (exponential, default), Linear, or Log4.4 Marbles — Stochastic CV Modulator (Up to 4 per Layer)
Inspired by the eurorack module Mutable Instruments Marbles, a random control voltage generator providing unique randomness controls:
4.5 Advanced Modulator Types (Up to 4 Instances per Layer Each)
In addition to the classic LFO/ModEnv/Marbles, TOMiC offers 7 advanced modulator algorithms, each with its own dedicated parameter set, Depth/Polarity output stage, a Seed for reproducible randomness, and the full 15-slot routing matrix.
4.5.1 Markov — Probabilistic State-Chain Modulator
Walks a chain of nodes with controllable randomness, from a strict step sequence to fully unpredictable jumps.
| Parameter | Range | Description |
|---|---|---|
| Rate | 0.1–50 Hz | Step clock speed |
| Sync Enabled / Div | — | Optional tempo sync |
| Entropy | 0–100% | 0 = sequential walk (node 0→1→2→…), 100% = fully random jumps between nodes |
| Loop Lock | on/off | Freezes the last Loop Length generated steps into a repeating pattern |
| Loop Length | 1–8 steps | Length of the frozen loop when Loop Lock is engaged |
| Mutation | 0–100% | Per-step probability of a random sign flip or one-node offset, keeping a locked loop from feeling perfectly static |
| Glide | 0–100% | 0 = quantised steps between nodes, 100% = smooth glide |
| Depth / Polarity / Seed | — | Standard output stage |
4.5.2 Lorenz — Chaotic Attractor Modulator
A numerically-integrated Lorenz attractor, the classic 3D chaotic system, generating complex, never-exactly-repeating trajectories.
| Parameter | Range | Description |
|---|---|---|
| Rate | 0.01–50 | Integration speed (not a musical clock — no tempo-sync concept) |
| Chaos (Rho) | 10–50 | Drives the system from stable/near-periodic toward full turbulence |
| Damping (Beta) | 0.5–5.0 | Energy decay rate of the system |
| Scale | 0–100% | Output amplitude scaling |
| Smoothing | 0–100% | Post-integration smoothing |
| Output | X / Y / Z | Which of the attractor's three axes is used as the modulation signal |
| Depth / Polarity / Seed | — | Standard output stage |
4.5.3 Cellular — Cellular Automaton Modulator
Evolves a 1D row of cells generation by generation using a Wolfram elementary cellular-automaton rule, converting the pattern into a control signal.
| Parameter | Range | Description |
|---|---|---|
| Rule | 0–255 | Wolfram rule number governing how each cell's next state is computed (e.g. Rule 30 = chaotic, Rule 90 = Sierpiński-like) |
| Rate | 0.1–50 Hz | Generation-advance speed |
| Sync Enabled / Div | — | Optional tempo sync |
| Width | 4–32 cells | Number of cells in the row |
| Mutation | 0–100% | Probability of a random cell flip each generation, preventing the automaton from settling into total silence/stasis |
| Output Mode | Density / Center of Mass / Weighted Sum | Density = fraction of live cells; Center of Mass = mean live-cell position regardless of count; Weighted Sum = position-biased sum (later cells count more) |
| Reset Pattern | on/off | Re-seed the row on trigger |
| Depth / Polarity / Seed | — | Standard output stage |
4.5.4 Tidal — Layered Tidal/Wave Modulator
Combines a slow, tempo-locked "tide" with a faster, free-running fractal "wave" riding on top of it — two motion layers in one modulator.
| Parameter | Range | Description |
|---|---|---|
| Tide Period | 1/4/8/16/32/64 bars | Macro tide cycle length — always tempo-relative |
| Roughness | 0.1–0.9 | Hurst exponent of the wave layer: low = jagged, high = smooth elastic drift |
| Octaves | 1–4 | Number of fractal noise octaves layered into the wave |
| Wave Rate | 0.05–4 Hz | Base speed of the wave layer — free-running, no tempo relationship |
| Tide Depth | 0–100% | Contribution of the slow tide layer to the output |
| Wave Depth | 0–100% | Contribution of the fast wave layer to the output |
| Depth / Polarity / Seed | — | Standard output stage |
4.5.5 Orbital — Orbital-Mechanics Modulator
Simulates a body in a gravitational orbit, kicked by each note trigger; gravity, friction and the kick shape determine how the orbit evolves and decays.
| Parameter | Range | Description |
|---|---|---|
| Gravity | 1–200 | Central pull strength |
| Friction | 0–2 | Orbital viscosity: 0 = eternal orbit, 2 = decays fast to center |
| Eccentricity | 0–100% | Note-on kick blend: 0 = tangential (circular orbit), 100% = radial (elongating orbit) |
| Kick Strength | 0–100% | Energy injected into the orbit on each trigger |
| Output | Radius / Angular Velocity / X / Y | Which orbital quantity is used as the modulation signal |
| Depth / Polarity / Seed | — | Standard output stage |
4.5.6 Chladni — Chladni-Plate Modulator
Models the interference pattern of a vibrating plate at a listening point, in the spirit of Chladni figures — two independent listening frequencies and a source count shape the resulting field.
| Parameter | Range | Description |
|---|---|---|
| Freq A / Freq B | 0.02–2 Hz | Listening-point frequencies on the plate's X and Y axes |
| Sources | 2–6 | Number of vibration sources contributing to the interference field |
| Damping | 0–3 | Radial damping: 0 = signal spans the full plate, 3 = concentrated at the center |
| Phase Offset | 0–100% | Lissajous-style Y-phase offset, reshaping the traced curve |
| Output | Field / X / Y | Field = the interference amplitude at the listening point; X/Y = the raw listening-point coordinates |
| Depth / Polarity / Seed | — | Standard output stage (Seed jitters the source angles) |
4.5.7 CvGranular — CV Granulator
A granular engine applied to control voltage instead of audio: it spawns short randomized "grains" of modulation rather than a continuous wave.
| Parameter | Range | Description |
|---|---|---|
| Rate | 0.5–40 Hz | Grain spawn rate |
| Sync Enabled / Div | — | Optional tempo sync |
| Grain Length | 5–500 ms | Duration of each grain |
| Duration Jitter | 0–100% | Randomizes grain length around the base Grain Length |
| Amplitude Jitter | 0–100% | Randomizes each grain's peak level |
| Shape | 0–100% | Attack/release balance of the grain envelope: 0 = percussive, 100% = slow |
| Depth / Polarity / Seed | — | Standard output stage |
4.6 HandMade / Record — 4 Instances per Channel
The HandMade modulator (HandMadeParams) lets you either record a knob gesture in real time or hand-draw a custom modulation curve, then loop it back as a modulation source. It is defined at the channel level, shared across the A/B layers (not duplicated per layer).
4.7 XY Pad — 2 Instances per Channel
The XY Pad modulator (XyPadParams) is a 2-dimensional touch/draw controller generating two independent modulation signals (X and Y) from one recorded or hand-drawn trajectory. It is also defined at the channel level, shared across A/B layers. It is capped at 2 instances rather than 4 because its editor widget is significantly larger on screen than a knob.
mx1_dest..mx15_dest / mx1_amt..mx15_amt for X, my1_dest..my15_dest / my1_amt..my15_amt for Y — so one XY Pad instance can drive up to 30 destinations total4.8 Macro Knobs
Per-Channel Macros — 7 per Channel
Seven Macro knobs (MacroParams) per channel give quick access to a curated combination of parameters under a single knob. Each Macro's raw value (0–100%) fans out through its own 15-slot routing matrix, and — unlike the plain modulators above — each of those 15 slots carries an extra per-slot Mode setting (Bipolar / UniPlus / UniMinus), so the same knob can push some destinations up and others down, or in both directions, simultaneously. Macro names are user-editable. A Macro's own value can itself be modulated by any other modulator (via the Macro1Value..Macro7Value targets — see 4.9), letting an LFO, envelope, or step lane drive the "super-knob" automatically.
Global Macros — 4 Global
Four Global Macro knobs (GlobalMacroParams) live at the plugin level, not per channel, and are shown on the transport bar next to the Limiter section. Their 15 routing slots work like the per-channel Macros (destination, amount, Bi/Uni+/Uni- mode) but each slot additionally carries its own target channel selector — so a single Global Macro slot can be aimed at any one of the 16 drum channels independently of the others, letting one knob sculpt a coordinated move across the whole kit. Global Macros are also the only modulation source that can reach the small set of master-bus-only targets (master compressor threshold/makeup gain, master limiter ceiling), since those live outside any per-channel patch.
4.9 The Complete Modulation Destination List (LfoTarget)
LfoTarget)Every modulator — LFO, ModEnv, Marbles, all 7 advanced types, HandMade, XY Pad, and both Macro types — draws its destinations from one shared list, LfoTarget, which currently contains roughly 450 targets. The categories below (as they appear in the destination dropdown) group them by section:
| Category | Example destinations |
|---|---|
| Global | Level, Pan, Mix, Morph, OscLayerMix, NoiseLayerMix, FeedbackAmt, AccentAmount |
| Dynamics | CompThresh/Ratio/Attack/Release, TransAttack/Sustain |
| Oscillator 1 / 2 | Pitch, OscPwm, OscSync, SubLevel, FmAmount/Ratio/Attack/Decay/Sustain, OscAttack/Decay, PitchCurve, PitchHold, PitchModAmt/Rate, ClusterSpread, HarmonicsSpace/Peak/Rolloff/Decay, BraidsTimbre/Color/Aux, BraidsWave, GranGrainSize/Pitch/Position/StereoWidth, ClDensity/Texture/Blend/Feedback/Reverb (and matching Osc2 variants) |
| Noise 1 / 2 | NoiseFilter/FilterQ, NoiseAttack/Decay, NoiseColor, NoiseCharacter, MetalTune/Feedback/Damp, SamplePitch/Start/Length (+ per-round-robin variants B/C/D), KarplusFreq/Decay/Damp, WireMix/Tune/Tension/Damping/Width/Body/BodyFreq, ClockedRate/Jitter, ClusterNoiseFreq/Spread, LfsrClock, GrainFreq/FmIndex/Size, FbankRate/Sweep (and matching Noise2 variants) |
| Filter | Filter/FilterRes/FilterDrive/FilterModel/FilterCharacter, repeated across 8 independent filter slots (Filter…Filter8) for the oscillator path, and again across 8 slots each for the Noise 1 and Noise 2 filter paths |
| FX | Distort, BitCrush/Mix/Dither, FreqShift/Mix, EqLow/Mid/High Gain+Freq, RingModFreq/Mix/Stereo, WidenerAmt, WavefoldAmt |
| Delay | DelayTime, DelayFeedback, DelaySend, DelayTone, DelayDrive, DelayWidth, DelayWobble, DelayDuck, DelayTapSpread |
| Reverb | ReverbSize, ReverbDecay, ReverbDamp, ReverbPinch, ReverbSqueeze, ReverbSend, ReverbPreDelay |
| Phaser / Chorus | PhaserRate/Depth/Feedback/Mix/Position; ChorusRate/Depth/Send/Feedback/Mix/Width |
| Spectral / Resonator | SpectralSend/Gate/Tilt/Morph/Smooth/Decay/Resonance; ResSend/Freq/Structure/Brightness/Damping/Position |
| Clouds FX / Stutter | CloudsPosition/GrainSize/Pitch/Density/Texture/Blend/StereoSpread/Feedback/Reverb; StutOffset/Chance/Gate/Pitch/FilterFreq/Width/Volume/Decay and more |
| Master (Global Macro only) | MasterCompThresh, MasterCompMakeup, MasterLimitCeiling |
Modulate-a-Modulator (Cross-Modulation)
Beyond synthesis and FX parameters, a dedicated block of targets — grouped under "MOD: LFO", "MOD: ENV", "MOD: MARBLES", "MOD: REC", "MOD: MKV", "MOD: LOR", "MOD: CEL", "MOD: TID", "MOD: ORB", "MOD: CHL", "MOD: GRA" and "MOD: MACRO" in the destination dropdown — points at another modulator's own parameter instead of a sound/FX field: an LFO can sweep Lorenz 2's Chaos amount, a Markov sequence can bend an LFO's Rate, or a modulator can even bend its own Rate (self-modulation is explicitly allowed and safe). Each family exposes its two most musically useful parameters this way (typically Rate/Speed plus one character knob, e.g. Lor1Rate/Lor1Rho, Mkv1Rate/Mkv1Entropy, Cel1Rate/Cel1Mut), plus every Macro's raw knob value (Macro1Value..Macro7Value).
These cross-modulation targets are resolved in a dedicated pass at the very start of each audio block, using the previous block's source values — this one-block delay is what makes feedback loops and self-modulation safe instead of causing runaway or undefined behavior.