Sinew is a monophonic synthesiser built around wavetable and physical-model oscillators, zero-delay-feedback filters, a 32-mode modal resonator and a reorderable output-FX chain. Everything is driven by a 64-slot modulation matrix and a radial knot that acts as the instrument's sole meta-modulator.
tools/gen_user_manual.py. Ranges, defaults, choice lists and destination names are read out of the C++, not transcribed — so they cannot drift out of date without the build gate noticing. The prose, diagrams and interactives are hand-written; where an interactive mirrors a shipped formula, the source line it mirrors is cited in the page's script.
Click any stage to jump to its section. The two toggles are real routing switches, not illustrations — they change where the Body and Sub actually inject.
A common misreading: the output FX are not one freely draggable list. They sit in three zones, and a stage only ever moves within its own zone.
fx_eq_order, fx_comp_order, fx_fold_order).fx_delay_order, fx_gran_order).fx_width_order, fx_reverb_order). Defaults to Width then Reverb. Putting Reverb first changes what Width acts on: its mono maker then highpasses the reverb's own side content and its decorrelator widens the tail, instead of the reverb receiving an already-widened signal.The Output FX page has a sandbox you can drag.
1. On the Source page set Osc 1 Type to Wavetable Sine and raise Osc 1 Drift to about 0.05 for slow pitch movement.
2. On Tone, pick the Sallen-Key filter, cutoff near 500 Hz, resonance 0.40, then route LFO 1 → Filter Cutoff in the Mod matrix.
3. On Output FX, enable Reverb, Mix to about +0.5 and Decay to about 0.8. (Decay is a 0–1 control, not a time in seconds.)
4. On Morph, capture pole A, change the patch, capture pole B, and drag the puck between them.
1. On Body, switch Body Enabled on and bring Body Wet up to about 0.70. Wet is an additive level, so the dry voice is still there underneath.
2. Set Body Decay to 300 ms, Body Material to 0.35 and Body Damping to 1.2.
3. Raise Body Strike to 0.80 with Strike Decay at 15 ms — that is the velocity-scaled noise burst, armed on every note-on.
4. Pull Body Dry Level to 0.0 to hear the resonator alone, and play short staccato notes.
1. On Source, set Osc 1 Type to SuperSaw and detune with Osc 1 Fine.
2. On Tone, choose the Diode Ladder, cutoff near 300 Hz, and push Filter Drive up. Drive is a 0–1 control, not dB.
3. On Output FX, enable the Fold stage, set Distortion Type to Chebyshev and raise Drive until the upper harmonics bloom. Turn Folder Oversample on in Master Settings if it starts to sound gritty rather than rich — that grit is aliasing.
4. Leave the Limiter on. It always is by default.
The Knot page is the performance surface. Six macros — Weight, Warmth, Tension, Life, Anchor and Morph — are laid over a radial filament visualiser you can drag. The knot is also Sinew's sole meta-modulator: it is the only thing that reaches modulation-depth destinations while knot_active is on.
Dragging the knot writes the macros directly. The three knot_x/y/z parameters are a separate, absolute input path — meant for external XYZ control such as a phone or a Leap Motion mapped through host MIDI — and they blend over your manual macro values rather than replacing them:
At 0.5 the axis is released and your manual macro value passes through untouched — which is why the defaults are 0.5 and not 0. Each axis is a plain automatable parameter, and all three are surfaced as knobs in Master Settings so a host's "link to last tweaked control" picks up the axis rather than the six macros the knot is shouting.
knot_active ON (the default) means the knot drives the macros and only macro sources reach meta destinations — modulator depths, drift depth, tendon amounts. Switch it OFF for flat-patch mode: the macros freeze at their manual values and meta routes from any source go live. It is automatable by design, as a performance switch between expressive and flat modes.
The Source page hosts two independent oscillators, a per-oscillator FX slot, an FM operator and a noise generator. Everything here sums onto the pre-filter bus.
Each oscillator picks from eleven models.
Osc 1 and Osc 2 share the list except at index 1, where Osc 1 reads Wavetable Sine and Osc 2 reads Wavetable Triangle. Both default to index 1; Osc 2 also defaults to −12 semitones at level 0.
Each oscillator has its own FX slot with eight types: None, Spasm, Sync, Phase Squeeze, Ring Modulator, Freq Shift Up, Freq Shift Dn, Undertow. Each type reads a different subset of the slot's controls — the rest are inert.
By default each mip level is peak-normalised, so the top octave stays bright and consistent. Natural Mip (Master Settings) keeps the raw per-mip harmonic energy instead, so higher notes shed highs the way an acoustic source would — subtler, more analogue, quieter up top.
The Tone page carries the voice filter, the amplitude and filter envelopes, and the node editor for the Expression Filter.
Eleven types. Types 9 and 10 are four-pole; the Sallen-Key is two-pole; Dispersion, Formant, Multi Node and Draw Free are not simple rolloffs at all, so no single dB/octave figure describes them.
filter_cutoff uses a JUCE skewed range with skew 0.35, which denormalises as 20 + 19980·n^(1/0.35) — a power law with exponent 2.857, not a logarithm. The two agree only at the endpoints. A knob sitting at 50% is not at the geometric middle of 20 Hz–20 kHz. The explorer above works in Hz for exactly this reason.
The Ladder is a four-pole ZDF topology using tanh differential pairs — the classic transistor ladder, with warm resonant clipping. The Diode Ladder models diode junction loading in both directions; its DC divergence is handled by a corrected pole elimination.
The Expression Filter (the dancing EQ) is five movable nodes. Nodes 1 and 5 are end nodes and can each be a Shelf or a Cut; nodes 2–4 are bells. Each node has its own frequency, gain and Q, and filter_resonance scales every node's Q on top.
The same engine is what the Output FX EQ card binds. There is no separate three-band parametric EQ any more — see the note on the Output FX page.
The Sub page is a dedicated sub-oscillator with an additive harmonic mixer, its own envelope and a note-tracking law that keeps it out of the mid-range as you play up the keyboard. It ships on, at level 0.5.
Three partials, weighted independently. At the defaults — fundamental 1.0, h2 and h3 at 0, note-follow 0 — the sub is a pure sine.
Sub Env Follow decides two things at once. On, the sub is glued to the voice amplitude envelope and runs through the whole FX chain. Off — with the Sub ENV card enabled — the sub uses its own attack/release and injects post-FX, straight to the limiter, as an independent layer. Sub Env Smoothing softens the follower's transient response; 0 leaves it unsmoothed.
(main + sub)/√(1 + level²), up to −3 dB on the sum as the sub rises — instead of stacking additively. It is one opt-in for both the sub law and the Body dry/wet law. Off, the two sum additively and get louder as levels rise.
The Body page is an additive parallel modal resonator: a bank of 32 coupled-form resonators running alongside the voice, not in series with it. It models the ring of strings, membranes, wood and metal.
Every mode's frequency, gain and ring time comes out of the same control-rate recompute. The plot below is that computation, ported line-for-line — including the Logic Bender's partial stride.
1 + spread·n²·0.02. Negative compresses the bank downward and growls; positive stretches it and shimmers.0.025 + 0.35·density closes around Focus.|sin(π·(n+1)·x)| comb weighting — modes with a node at that point drop out, exactly as they would on a real string. Both fade in over the first 12% of travel, so 0 means "distributed excitation, all-mode pickup" rather than "position zero".t60 = decay · stretched^(−damping): how much faster the high modes die than the low ones.Body Exciter balances a noise source against the selected continuous tap; despite its modal_drive_mix ID it is a source blend, not saturation. Actual saturation is Body Drive, in dB into the bank-sum tanh. Body Strike is separate again: a velocity-scaled coloured-noise burst armed on every note-on.
Body Exciter Tap chooses what feeds the bank. Raw Oscillators taps pre-filter so the resonator hears the full harmonic source; Post Filter taps after the voice filter, so filter movement and drive colour the excitation.
Body Wet is an additive level. Body Dry Level scales the dry voice inside the blend, so Dry 0 with Wet up gives you the resonator solo. With Equal Power on, the blend is normalised as 1/√(dry² + wet²), capped at 4×, so balancing dry against wet holds perceived level.
Body Inject (Pre-FX) decides whether the Body sum enters at output-FX slot 1 — shaped by the whole chain — or goes straight to the limiter.
Eight stages in three zones plus a pinned limiter. Only the mono and time zones reorder.
Three bands split by 24 dB/oct Linkwitz-Riley crossovers. Each band has independent downward compression (threshold, ratio — peaks pulled down) and upward compression (threshold, ratio — quiet material lifted), plus its own attack and release.
Three global scalars sit on top of the per-band settings. Down Depth and Up Depth scale the computed gain-reduction and gain-lift in dB; Depth is then a per-band wet/dry mix of the result. Comp Up Ceiling is the one that matters most in practice — upward makeup is otherwise unbounded, and at quiet levels with a high ratio it will compute tens of dB and shove noise, tails and resonances into every nonlinear stage downstream. 24 dB is effectively uncapped.
Nine algorithms: Wavefold, Chebyshev, Slew, Memory, Tube, Tape, Diode, Neural Axon, Orbital Phasor.
Dispersion sits just ahead of the folder: one bipolar knob, magnitude for strength and sign for direction, 0 at centre meaning off and the folder path bit-exact. Folder Tone is a bipolar 1 kHz tilt on the wet fold signal only — positive brightens. Folder Oversample trades CPU for a cleaner fold, most audible on bright content at heavy drive.
A stereo delay with a filtered, degradable feedback loop. Time follows either milliseconds or a host-synced division; Time Mode decides what happens while the time changes — Tape pitches as it moves, Pitch Neutral holds pitch, Jump cuts. Time Slew sets how lazily the line chases a new time.
Inside the loop you get a filter (LP/HP/BP with cutoff and resonance), a low cut, bit-depth reduction down to 2 bits and sample-rate reduction down to 1 kHz — each repeat is degraded again, so the tail evolves rather than just fading. Cross Feedback and Feedback Rotate move the repeats around the stereo field. Duck pulls the repeats down while the dry signal is loud.
Feedback is capped at 0.95 so the loop is always contractive. The Logic Bender can lift that past unity.
A pitch-tracking granulator built for bass. It splits the input at Crossover — expressed as a multiple of the tracked fundamental — and granulates only the band above, so the low end stays solid. Sub Drive then drives that untouched low band.
Grain Size, Grain Pitch (±1 octave), Density and Weave shape the cloud; Freeze holds the buffer so it sustains on captured material. Tracking follows the played MIDI note by default, or Manual F0 if you switch that off.
A mono maker plus a decorrelator. Everything below Mono Freq stays centred; above it, the chosen decorrelator generates the side signal:
Mix is bipolar with an equal-power crossfade. Decay and Time (pre-delay) are 0–1 normalised controls, not seconds. Xover Freq lets bass bypass the tank entirely, mirroring the Width mono maker.
Always last, and on by default. Three modes: Lookahead reports its latency to the host as PDC and updates it dynamically; Soft Clip is memoryless tanh; Hard Clip is a straight clamp. The detector is high-passed (SC Freq / SC Slope) so low-frequency energy doesn't pump the whole mix.
Behind everything, a fixed ±4.0 host clamp catches the signal before it leaves the plugin, whatever else is going on.
The Adapt cards change the instrument's behaviour based on what you play. This is the one documented exception to Sinew's no-hidden-DSP rule: these cards deliberately reach across the synth.
Global living detune. Three characters — Analog Slow, Organic Uneven, Unstable Rubber — with depth and rate. Drift Depth is a meta destination, so the knot can open and close it.
Four shapes, each using a different subset of the four amount slots. Slots that a shape doesn't use are inactive rather than hidden:
All four Tendon amounts are meta destinations.
Suppresses upper-partial energy on high keys so notes approaching Nyquist don't alias. Separate bipolar weights for the upper oscillator content, the sub, the drive stages and wavetable position.
Charges a storage cell on note strikes and bleeds it back slowly, the way a soundboard keeps ringing after the note. Three modes — Warm Trace, Acid Latch, Hollow Follow — with charge rate, decay rate, amount and bipolar note tracking.
The modulation matrix is 64 independent routes. Each route picks one of 21 sources, one of 192 destinations, a bipolar amount and a bypass. Every slot is identical and every slot works — there is nothing special about the first three beyond their parameter IDs predating the rest.
Sinew carries two LFOs, two MSEGs, the Logic engine, a sidechain input, the standard MIDI sources and the six knot macros.
Some destinations are meta: they modulate a modulator's own depth rather than an audio parameter — LFO depths, MSEG depths, Drift Depth, the Tendon amounts, Filter Env Amount. While knot_active is on, only the knot macros reach them. Turn Knot Active off and meta routes from any source go live. The route builder above flags them.
When you modulate a synced rate, Rate Snap decides what happens between divisions. Stepped (default) snaps to the nearest division and glides between steps via smoothing. Free glide sweeps continuously and only snaps once the value settles.
Mod Flip is a single global control that morphs the polarity of every route at once. 0 is identity.
The Mod page's sixth tab is a piano roll and a four-tab console: Arp, Note Follow, Touch and MIDI Out.
Sinew is monophonic. Hold a chord with the arp on and the single voice walks it — Mode sets the order, Division the step length, Octaves and Octave Direction how far it climbs. A note added mid-cycle joins in place without restarting the pattern. Hold latches the chord so it survives releasing the keys; the next fresh chord replaces it.
Notes generates extra tones from each held key rather than taking them from your fingers — spread across the Octaves range and snapped to the key. Density thins the pattern to rests without reordering it. Gate, Swing and the velocity controls shape each step; Gate and Swing are mod destinations, sampled once per step, so an LFO or MSEG can push the groove around.
Key Mode quantises to a scale. Quantise Scope decides how far that reaches: generated notes only, the notes you play as well, or everything.
Steps follow the host transport. Transport Stop chooses what happens when the host parks — silence, free-run on the internal clock, or hold the current step. Arp Tempo drives that internal clock standalone, and is ignored whenever a host transport exists.
The arp is outside the morph: no pole captures it and no morph position moves it, so it stays under your hand while the puck travels.
Note Follow turns key position into a modulation source: a note window with a response curve, optional bipolar output about the centre, and a choice between tracking pitch continuously or latching at each note-on. Touch shapes the Velocity, Aftertouch and Mod Wheel sources — curve, range and smoothing each. Both tabs shape sources; neither does anything until you route it in the matrix.
Sinew plays the bass note and emits a voiced chord above it on MIDI channel 2. Route that to another instrument and one finger drives both. Harmony sets the chord's relationship to the bass note and Polyphony its size; Voicing inverts it a tone at a time. Rate decides when the chord re-strikes, and Timing slides it up to half a step either side of the beat — pushing it early needs the arp running, because only a scheduled step can be anticipated.
With the layer enabled, incoming notes on channel 2 are dropped, so a host that loops Sinew's output back to its input cannot make it play itself. Sinew is never a MIDI thru: nothing you play arrives at its output.
Patch Morph captures four whole patches into poles A–D and interpolates between them as you move a puck across a 2D field.
Click a slot chip to capture the current patch into it. Right-click opens the pole menu — Edit, Copy, Swap, Clear. In Edit mode you tweak parameters directly on that pole and then commit them back into the slot; right-click cancels.
The puck sits at morph_x / morph_y. Drag it, automate the two parameters from your host, or route anything in the Mod matrix to Morph X and Morph Y — they are ordinary modulation destinations, so an LFO, an MSEG or a knot macro can take the wheel.
Some parameters are deliberately excluded from the morph and hold their live value across the whole field — the performance inputs (knot_x/y/z), output_gain and mono_mode among them. Otherwise moving the puck would yank your output level and voice mode around mid-performance.
The whole arp sits outside the morph too. It is a performance layer, not patch character — a time division is not a useful thing to crossfade — so the morph never writes to it and it stays editable while you move the puck.
Sinew uses a lock-free triple-buffer snapshot system:
The cog at the top right opens the master-settings modal. Most of its controls are dual — they also live on their own page — but a few are only here. They are grouped as Quality, Routing & Setup, Dynamics, Knot XYZ, Performance and Logic Bender.
| Setting | What it does |
|---|---|
Natural Mip osc_mip_natural | Un-normalised wavetable mip levels. Higher notes shed highs like an acoustic source instead of holding a peak-normalised top octave. |
Folder Oversample fx_folder_oversample | Runs the wavefolder at a multiple of the sample rate and decimates. More CPU, less aliasing. |
Source Balancing src_level_scaling | Additive or Percentage. Percentage is attenuate-only: it scales the pre-filter bus back to unity if the authored level knobs sum above 1.0, and leaves a bus summing ≤1.0 exactly as it is. It bounds the authored knob sum, not the instantaneous signal, so a modulated source can still peak past its share. |
Body Inject (Pre-FX) modal_pre_fx | Body sum through the FX chain, or straight to the limiter. |
Body Exciter Tap modal_exciter_tap | Raw oscillators or the post-filter voice. |
Equal Power modal_sum_comp | One opt-in for the whole sub/body headroom law. Off is the additive path for both. |
Sub Env Follow sub_env_follow | Sub glued to the voice envelope and run through the FX chain, or independent and injected post-FX. |
Comp Up Ceiling fx_comp_up_ceil | Hard cap in dB on the compressor's upward makeup. |
Expr Trim expr_output_trim | Output trim on the Expression Filter, replacing the hidden ±1 brickwall. |
Knot X / Y / Z knot_x · knot_y · knot_z | The three knot axes as plain knobs, so a host's "link to last tweaked control" picks up the axis instead of the six macros the knot sends more loudly. |
Rate Snap rate_snap_mode | Stepped or Free glide, for modulated synced rates. |
Mono Mode · Glide Time · Glide Curve · Pitch Bend Range performance | Voice allocation, portamento and bend range. |
The Logic Bender exposes normally-hidden algorithmic fields so you can push them past their musical bounds. It is gated behind a deliberate consent step.
Each field only affects its module when that module is enabled.
Every automatable parameter in the instrument, searchable by name, ID or description. Generated from the plugin's parameter layout.
These entries appear in your host's automation list but drive nothing in the engine. They are flagged in the tables above and collected here.