Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Utilities

Utility modules for signal routing, mixing, and manipulation.

Mixer

4-channel audio mixer.

let mixer = patch.add("mixer", Mixer::new());

Inputs

PortSignalDescription
in_1 - in_4AudioAudio inputs
gain_1 - gain_4Unipolar CVChannel gains
masterUnipolar CVMaster gain

Output

PortSignalDescription
outAudioMixed output

VCA (Voltage-Controlled Amplifier)

Controls signal amplitude with CV.

let vca = patch.add("vca", Vca::new());

Inputs

PortSignalDescription
inAudioAudio input
cvUnipolar CVGain control (0-10V = 0-100%)

Output

PortSignalDescription
outAudioAmplitude-controlled output

Response

Linear response: $$\text{out} = \text{in} \times \frac{\text{cv}}{10}$$


Attenuverter

Attenuates, inverts, or amplifies signals.

let atten = patch.add("atten", Attenuverter::new());

Inputs

PortSignalDescription
inAnyInput signal
amountBipolar CVScale factor (-2 to +2)

Output

PortSignalDescription
outAnyScaled output

Amount Values

AmountEffect
-2.0Inverted and doubled
-1.0Inverted
0.0Silent
0.5Half level
1.0Unity (unchanged)
2.0Doubled

Offset

Adds DC offset (constant voltage source).

let offset = patch.add("offset", Offset::new(5.0));  // 5V

Output

PortSignalDescription
outCVConstant voltage

Common Uses

// Center LFO modulation
patch.connect(offset.out("out"), vcf.in_("cutoff"))?;  // Base cutoff
patch.connect(lfo.out("sin"), vcf.in_("fm"))?;         // Modulation

Multiple

Signal splitter (1 input to 4 outputs).

let mult = patch.add("mult", Multiple::new());

Input

PortSignalDescription
inAnyInput signal

Outputs

PortSignalDescription
out_1 - out_4AnyIdentical copies

UnitDelay

Single-sample delay (z⁻¹).

let delay = patch.add("delay", UnitDelay::new());

Input/Output

PortSignalDescription
inAnyInput
outAnyDelayed by 1 sample

Essential for feedback loops.


Crossfader

Crossfade between two signals with equal-power curve.

let xfade = patch.add("xfade", Crossfader::new());

Inputs

PortSignalDescription
aAudioFirst signal
bAudioSecond signal
mixUnipolar CVCrossfade position
panBipolar CVStereo position

Outputs

PortSignalDescription
leftAudioLeft output
rightAudioRight output

Equal Power Curve

$$\text{gain}_A = \cos\left(\frac{\pi}{2} \cdot \text{mix}\right)$$ $$\text{gain}_B = \sin\left(\frac{\pi}{2} \cdot \text{mix}\right)$$


Precision Adder

High-precision CV addition for V/Oct signals.

let adder = patch.add("adder", PrecisionAdder::new());

Inputs

PortSignalDescription
aV/OctFirst pitch
bV/OctSecond pitch (offset)

Output

PortSignalDescription
outV/OctSum of pitches

Use for transpose, octave shifts, and pitch offsets.


StereoOutput

Final stereo output stage.

let output = patch.add("output", StereoOutput::new());
patch.set_output(output.id());

Inputs

PortSignalDescription
leftAudioLeft channel
rightAudioRight channel (normalled to left)

Behavior

If only left is patched, right mirrors it (mono).


ExternalInput

Injects external CV/audio into the patch.

use std::sync::Arc;
let cv = Arc::new(AtomicF64::new(0.0));
let input = patch.add("pitch", ExternalInput::voct(Arc::clone(&cv)));

Factory Methods

MethodSignal Type
::voct()V/Oct pitch
::gate()Gate signal
::trigger()Trigger
::cv()Unipolar CV
::cv_bipolar()Bipolar CV

Output

PortSignalDescription
outVariesExternal value

Common Patterns

Voltage Processing Chain

// LFO → Attenuverter → Offset → Target
// Allows precise control of modulation depth and center
patch.connect(lfo.out("sin"), atten.in_("in"))?;
patch.connect(atten.out("out"), adder.in_("a"))?;
patch.connect(offset.out("out"), adder.in_("b"))?;
patch.connect(adder.out("out"), vcf.in_("cutoff"))?;

Parallel Signal Path

// Split signal to dry and wet paths
patch.connect(input, mult.in_("in"))?;
patch.connect(mult.out("out_1"), dry_path)?;
patch.connect(mult.out("out_2"), wet_path)?;
patch.connect(dry_path, xfade.in_("a"))?;
patch.connect(wet_path, xfade.in_("b"))?;