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

Oscillators

Oscillators are the sound sources in any synthesizer—they generate the raw waveforms that filters and effects shape.

VCO (Voltage-Controlled Oscillator)

The primary sound source for subtractive synthesis.

let vco = patch.add("vco", Vco::new(44100.0));

Inputs

PortSignalRangeDescription
voctV/Oct±10VPitch (0V = C4)
fmBipolar CV±5VFrequency modulation
pwUnipolar CV0-10VPulse width (5V = 50%)
syncGate0/5VHard sync reset

Outputs

PortSignalDescription
sinAudioSine wave
triAudioTriangle wave
sawAudioSawtooth wave
sqrAudioSquare/pulse wave

Waveform Mathematics

Sine: $$y(t) = A \sin(2\pi f t)$$

Sawtooth (BLIT): $$y(t) = 2 \left( \frac{t}{T} - \lfloor \frac{t}{T} + 0.5 \rfloor \right)$$

Triangle: $$y(t) = 2 \left| 2 \left( \frac{t}{T} - \lfloor \frac{t}{T} + 0.5 \rfloor \right) \right| - 1$$

Square/Pulse: $$y(t) = \text{sign}(\sin(2\pi f t) - \cos(\pi \cdot \text{PW}))$$

Usage Example

// Basic VCO with external pitch
patch.connect(pitch_cv.out("out"), vco.in_("voct"))?;

// FM synthesis
patch.connect(modulator.out("sin"), vco.in_("fm"))?;

// PWM (pulse width modulation)
patch.connect(lfo.out("tri"), vco.in_("pw"))?;

LFO (Low-Frequency Oscillator)

Sub-audio oscillator for modulation.

let lfo = patch.add("lfo", Lfo::new(44100.0));

Inputs

PortSignalRangeDescription
rateUnipolar CV0-10VFrequency (0.01-30 Hz)
depthUnipolar CV0-10VOutput amplitude
resetTrigger0/5VPhase reset

Outputs

PortSignalDescription
sinBipolar CVSine wave (±5V)
triBipolar CVTriangle wave
sawBipolar CVSawtooth wave
sqrBipolar CVSquare wave
sin_uniUnipolar CVUnipolar sine (0-10V)

Rate Mapping

Default rate curve: $$f = 0.01 \cdot e^{(\text{CV}/10) \cdot \ln(3000)}$$

CVFrequency
0V0.01 Hz
5V~1 Hz
10V30 Hz

Noise Generator

White and pink noise sources.

let noise = patch.add("noise", NoiseGenerator::new());

Outputs

PortSignalDescription
white_leftAudioWhite noise (left)
white_rightAudioWhite noise (right)
pink_leftAudioPink noise (left)
pink_rightAudioPink noise (right)

Noise Spectra

White noise: Equal energy per frequency (flat spectrum)

$$S(f) = \text{constant}$$

Pink noise: Equal energy per octave (-3dB/octave)

$$S(f) \propto \frac{1}{f}$$

Pink noise is generated using the Voss-McCartney algorithm.


AnalogVco

VCO with analog imperfections for authentic vintage sound.

use quiver::analog::AnalogVco;

let vco = patch.add("vco", AnalogVco::new(44100.0));

Additional Features

  • V/Oct tracking errors
  • Component tolerance variation
  • High-frequency rolloff
  • Soft saturation

See Analog Modeling for details.


Common Patterns

Detuned Oscillators

let vco1 = patch.add("vco1", Vco::new(sr));
let vco2 = patch.add("vco2", Vco::new(sr));

// Slight detune for thickness
let detune = patch.add("detune", Offset::new(0.01));  // ~12 cents

patch.connect(pitch.out("out"), vco1.in_("voct"))?;
patch.connect(pitch.out("out"), vco2.in_("voct"))?;
patch.connect(detune.out("out"), vco2.in_("voct"))?;  // Adds to pitch

Hard Sync

// Slave syncs to master
patch.connect(master.out("sqr"), slave.in_("sync"))?;

// Modulate slave pitch for classic sync sweep
patch.connect(lfo.out("sin"), slave.in_("voct"))?;

FM Synthesis

// Carrier:Modulator = 1:1 for harmonic FM
patch.connect(modulator.out("sin"), carrier.in_("fm"))?;

// Control FM depth with envelope
patch.connect(env.out("env"), fm_vca.in_("cv"))?;
patch.connect(fm_vca.out("out"), carrier.in_("fm"))?;