The Geometry of Pitch
In a modular synthesizer, pitch is not a note name, a MIDI number, or a frequency dial — it is a voltage on a wire. The whole standard fits in one sentence: one volt is one octave, and 0 V is middle C. Everything else about musical pitch — semitones, cents, why an octave “sounds the same,” why detuning by a few millivolts makes a chorus — falls out of a single exponential, \( f(V) = 261.63 \cdot 2^{V} \). Drag the marker below and watch the geometry happen.
The yellow ruler is the pitch CV — the voltage a
sequencer or keyboard actually sends down a V/Oct
cable. The blue curve above it is the frequency
a VCO turns that voltage into, plotted on a linear Hz axis so you can feel the
exponential: each volt to the right doesn’t add frequency, it doubles it.
Set the pitch CV to
+0.750 V
and read the marker — at exactly +0.750 V you get A4 = 440 Hz, nine semitones
above middle C. Now switch quantize to semitones on: the marker snaps to the
nearest multiple of 1/12 V while a faint ghost keeps tracking the raw voltage.
That snap is Quiver’s Quantizer module — a pitch quantizer is nothing more
than rounding a voltage to the semitone grid. The piano strip riding on the
ruler makes the volts↔notes bijection tactile: every key sits on an exact
multiple of 1/12 V, so tapping E4 is setting the CV to +0.333 V.
And switch on detune demo to hear the raw pitch and its quantized ghost
sounding together: the slow swelling and fading you hear — and see in the
envelope strip that appears — is beating, the audible form of the cents
readout, undulating at exactly \( |f_{raw} - f_{quantized}| \) times per
second. The lower strip replots the same
curve on a log-frequency axis, where it becomes a perfectly straight line.
This is why engineers love log axes for pitch: equal musical intervals are equal
frequency ratios, and ratios only become equal distances on a log axis.
Things to try
- Drag the marker up by exactly +1 V from anywhere — from 0 V to +1 V, or from −1.317 V to −0.317 V — and watch the frequency readout exactly double. The starting point never matters; only the voltage distance does.
- Each semitone is 1/12 V ≈ 83.3 mV. Turn quantize on and drag slowly: the raw ghost glides continuously while the marker holds, then jumps a whole 83.3 mV step at once — a staircase built from a ramp.
- Scrub the voltage by just a few millivolts (arrow keys on the scrub work too). The cents readout shows how far off-pitch you are: 1 cent is a mere 0.83 mV, which is why analog oscillators need precise, temperature-stable volt-per-octave circuits.
- Compare the two plots at the top of the range. From +2 V to +3 V the linear plot rockets from about 1046 Hz to 2093 Hz — the same 1 V that only moved you 65 Hz down at −2 V. On the log strip below, those two steps are identical distances. Same geometry, different lens.
- Press play interval: you hear the marker’s note, then the note exactly +1.0 V above it — twice the frequency — then both together. That fused, “same-note-but-higher” quality is what a 2:1 ratio sounds like.
- Park the marker at +0.750 V and press ▶ hear it: the orchestra’s tuning A, produced by nothing but \( 261.63 \cdot 2^{0.75} \).
- Tap C4, then C#4, then D4 on the piano strip and watch the raw CV climb by exactly 83.3 mV per key — the keyboard is a voltage ladder, one rung per semitone.
- Turn on detune demo and tap E4: the envelope strip is flat — raw and quantized agree, so there is nothing to beat. Now drag a hair sharp and count the slow swells: at +5 ¢ they come about once per second, and the beat rate readout predicts exactly the rate you count, \( |f_{raw} - f_{quantized}| \approx 0.95\ \text{Hz} \).
What you just saw
The V/Oct standard is one function. With \( f_{C4} = 261.6255653\ \text{Hz} \) (the 0 V reference), a pitch voltage \( V \) maps to frequency as
\[ f(V) = f_{C4} \cdot 2^{V}. \]
Because the volt lives in the exponent, adding voltage multiplies frequency: \( f(V + 1) = 2 f(V) \) is the octave, and dividing the volt into twelve equal slices gives the equal-tempered semitone as a ratio,
\[ \text{one semitone} = \tfrac{1}{12}\ \text{V} \ \Longrightarrow\ f\left(V + \tfrac{1}{12}\right) = 2^{1/12} f(V) \approx 1.0595 f(V). \]
Cents subdivide the semitone a hundred times further. The widget’s cents readout is the distance from the nearest note on the semitone grid:
\[ \text{cents}(V) = 100 \left( 12V - \operatorname{round}(12V) \right), \]
so 1 cent is 1/1200 V ≈ 0.83 mV. Finally, taking \( \log_2 \) of the pitch law explains the straight line in the lower strip:
\[ \log_2 f = \log_2 f_{C4} + V. \]
On a log-frequency axis, frequency is a linear function of voltage — slope exactly one octave per volt. Pitch is geometry: intervals are ratios, and the log axis is the space in which those ratios become plain distances. The quantizer is just \( V \mapsto \operatorname{round}(12V)/12 \), rounding in that space.
The Quiver code
The same three ideas as the widget — a pitch voltage, a semitone quantizer, and
the exponential VCO — as a real patch. Offset with nothing patched into its
input is the idiomatic constant-CV source; Quantizer snaps it to the chromatic
grid (the real module also adds hysteresis so a CV parked on a boundary doesn’t
chatter between notes); the Vco applies \( f = 261.63 \cdot 2^{V} \)
internally via voct_to_hz.
use quiver::prelude::*;
fn main() {
let sample_rate = 44100.0;
let mut patch = Patch::new(sample_rate);
// A constant pitch CV: +0.762 V — a few cents sharp of A4, on purpose.
let pitch = patch.add("pitch", Offset::new(0.762));
// Snap to the semitone grid: round(12·V)/12. The quantizer commits
// +0.750 V — exactly A4.
let quant = patch.add("quant", Quantizer::new(Scale::Chromatic));
// The VCO turns volts into Hz: f = 261.63 · 2^V, so +0.750 V -> 440 Hz.
let vco = patch.add("vco", Vco::new(sample_rate));
let output = patch.add("output", StereoOutput::new());
patch.connect(pitch.out("out"), quant.in_("in")).unwrap();
patch.connect(quant.out("out"), vco.in_("voct")).unwrap();
patch.connect(vco.out("sin"), output.in_("left")).unwrap();
patch.set_output(output.id());
patch.compile().unwrap();
// Render one second of the tuning A.
for _ in 0..sample_rate as usize {
let (_left, _right) = patch.tick();
}
}
Swap Scale::Chromatic for Scale::Major or Scale::PentatonicMinor and the
same rounding idea snaps to a musical scale instead of all twelve semitones —
that’s the entire difference between Quantizer’s modes.
Go deeper
- Reference: V/Oct Reference — the complete note/voltage/frequency table this page is built on.
- Concept: Signals — where
VoltPerOctavesits among Quiver’s signal kinds. - Tutorial: Sequenced Bass — a step sequencer emitting these very voltages into a VCO.
- Next explorable: Two Oscillators, One Wire — what happens when the thing modulating pitch is itself an oscillator.