draft: false
Name: Voder
short-description: "The 1939 Bell Labs Voder - a filter and formant based voice-synthesis machine, invented by Homer Dudley - played by hand from the panel or from a Music Thing 8mu over USB MIDI Host"
Language: C++ (Pico SDK + ComputerCard)
Creator: Andy Jenkinson (uglifruit)
Version: "1.0.1"
Status: Released
License: MIT
repository: https://github.com/uglifruit/WorkshopTract8
Editor: none
date-created: 2026-08-28
date-updated: 2026-08-31
# Voder is an original implementation after Homer Dudley's machine (Bell Labs,
# 1939). No code from the original survives - it was relays and vacuum tubes -
# so the debt is conceptual rather than legal.
#
# It vendors, unmodified and under their own MIT terms:
# usb_midi_host.c/.h + usb_midi_host_app_driver.c
# (c) 2023 rppicomidi, https://github.com/rppicomidi/usb_midi_host
# ComputerCard.h
# (c) Chris Johnson
# Their copyright headers are intact in those files. See LICENSE.
contact:
social:
github: https://github.com/uglifruit
uf2:
- path: UF2/tract8.uf2
name: Voder 1.0.1
tags:
- synth
- formant
- vocal
- speech
- emulation
- filter
- usb-host
- midi
summary: |
The Voder was the first machine that could talk, demonstrated at the 1939
New York World's Fair and invented by Homer Dudley at Bell Labs. It had no
vocabulary and no text input: it made two raw sounds, a buzz and a hiss,
and a trained operator shaped them into speech in real time using ten
finger keys, a wrist bar and a foot pedal. Operators trained for
months.
This card is that instrument with eight bandpass filters instead of ten,
played from its own panel or from a Music Thing 8mu over USB MIDI Host. It
is not a vocoder and not a text-to-speech engine - nothing analyses an
input signal and nothing knows what a word is. What comes out is whatever
your hands put in.
Turning the card on gives BABBLE, where each knob drives several things at
once so it talks from a single gate with nothing else attached. Main
sweeps the vowel and the pitch together, X sets how fast and bright the
syllables are, and Y runs from a rounded hum to a breathy whisper. Switch
up for a second page that shapes the voice itself rather than what it is
saying: size, animation and consonants. The momentary switch is a gate -
hold it and the card sounds for as long as you hold it, with nothing
patched at all. Hold it for two seconds and it starts talking by itself
in phrases, with pauses long enough to read as breaths.
Holding the switch down at power-on gives the deliberate mode instead, one
knob to one parameter, where the vowel is a point in a three-dimensional
space: how open the mouth is, whether the tongue is forward or back, and
how far the lips are rounded. Every vowel lives somewhere in that cube,
with diphthongs on the way between.
With an 8mu the two vowel axes are on faders 1 and 8, the outermost pair,
so the hand spans the device; rounding is the left-right lift of the
controller. Fader 3 is breath, fader 4 pitch, fader 5 brightness, fader 7
volume, and faders 2 and 6 shape the plosive. Tilting front to back swings
the volume either side of the fader, so a phrase can be swelled and ducked
without letting go of anything.
Every CV input adds to its control rather than replacing it, so a random
voltage wanders the sound around wherever the knobs are parked and nothing
goes dead when a cable goes in. CV In 2 sweeps the vowel cube diagonally,
which is the input to patch a sample-and-hold into. Audio In 1 sums with
the internal sources rather than replacing them, so the card can speak
over whatever is patched in, both shaped by the same vowel.
Technical: eight 2-pole IIR bandpass sections at 250, 450, 700, 1000,
1400, 1900, 2600 and 3800 Hz, Q=4, entirely fixed point with Q15
coefficients. The buzz is a polyBLEP-corrected sawtooth. Core 0 runs the
48 kHz audio interrupt at 192 MHz; Core 1 owns the TinyUSB host stack and
nothing else, and never parses inside a USB callback. All code is copied
to RAM to keep flash-cache jitter out of the audio path. The whole engine
is 32-bit integer arithmetic - measured at 60% of the per-sample budget
on hardware, where the 64-bit version it replaced was at 100%.
panel:
inputs:
- id: AudioIn1
name: Exciter
type: audio
description: >
External audio, summed with the internal buzz and noise rather than
replacing them - so the card can speak over whatever is patched in,
both shaped by the same vowel.
- id: AudioIn2
name: Volume
type: cv
description: >
Bipolar CV over the output level, swelling and ducking around the
base level rather than replacing it - an envelope here articulates
a phrase without controlling absolute level.
- id: CVIn1
name: Pitch
type: cv
description: 1V/oct control of the buzz oscillator's F0.
- id: CVIn2
name: Formant
type: cv
description: >
Bipolar CV that sweeps the vowel cube along its diagonal, opening
the mouth as the tongue moves back. One random voltage here walks
through recognisably different vowels.
- id: PulseIn1
name: Click
type: pulse
description: >
Fires a plosive burst on the rising edge, retriggering, so a fast
gate stream stutters it.
- id: PulseIn2
name: Gate
type: pulse
description: >
Glottal gate. Opens fully up to about 200 Hz and above that becomes
amplitude modulation rather than clicking.
outputs:
- id: AudioOut1
name: Out
type: audio
description: Mono Voder output.
- id: AudioOut2
name: Out
type: audio
description: The same mono output, duplicated for convenience.
- id: CVOut1
name: Energy
type: cv
description: >
Formant energy envelope, smoothed to roughly 5 ms - follows how much
the filter bank is passing rather than the audio itself.
- id: CVOut2
name: Vowel
type: cv
description: >
The openness axis of the vowel cube as a control voltage, 0-5 V
from closed to open. In BABBLE and auto-chatter it wanders on its
own, so it is a modulation source musically related to what is
being heard rather than an unrelated LFO.
- id: PulseOut1
name: Voiced
type: pulse
description: High while the buzz dominates the noise.
- id: PulseOut2
name: Frozen
type: pulse
description: High while formant freeze is latched.
controls:
switch:
middle:
name: Page 1
description: >
In BABBLE, what is said - vowel sweep, chatter rate, character. In
the deliberate mode, openness, front and breath.
up:
name: Page 2
description: >
In BABBLE, who is saying it - voice size, animation, consonants. In
the deliberate mode, pitch, brightness and rounding. Between the two
pages the panel reaches every parameter the 8mu can.
down:
name: Gate / auto-chatter
description: >
Spring-loaded. Holding it sounds the card for as long as it is held -
the panel's copy of Pulse In 2, so the card can be played from the
panel alone with nothing patched. It sustains rather than chatters,
because a finger on a button is one continuous intent where a gate
from a sequencer is a stream of events. In BABBLE, holding it for
two seconds engages auto-chatter, where the card talks by itself in
phrases until the switch is tapped again; the LEDs fill left to right
during the hold, and the card sounds throughout it. In the deliberate
mode, holding it turns LEDs 0-3 into a silence diagnostic.
knobs:
- when:
z: middle
main:
name: VOWEL SWEEP
description: >
BABBLE page 1. Walks the vowel diagonally across the cube while
raising the pitch with it - one knob for a whole spoken gesture. In
the deliberate mode this is OPENNESS, the cube's first axis: how far
the jaw is open (F1).
x:
name: CHATTER
description: >
Syllable rate and brightness together, 2 to 20 Hz. Faster and
brighter are the two things that make speech sound hurried. In the
deliberate mode this is FRONT, the cube's second axis: where the
tongue sits (F2).
y:
name: CHARACTER
description: >
Breath against rounding - a rounded hum at one end, a breathy
whisper at the other. In the deliberate mode this is BREATH alone,
a ratio rather than a level: it changes how breathy the voice is,
not how loud.
- when:
z: up
main:
name: VOICE SIZE
description: >
BABBLE page 2. Pitch, brightness and vowel placement together, from
a small bright voice to a large dark one. Page 1 is what is said;
page 2 is who is saying it. In the deliberate mode this is PITCH,
the base F0 for the buzz oscillator, 50 to 500 Hz.
x:
name: ANIMATION
description: >
How far the voice wanders between syllables, from a monotone to
muttering. Drawn per syllable and held, which is how speech moves.
In the deliberate mode this is BRIGHTNESS, a spectral tilt shading
the vowel darker or brighter.
y:
name: CONSONANTS
description: >
How many syllables get a plosive, and how loud. Capped short of
every syllable, which would read as percussion rather than speech.
In the deliberate mode this is ROUNDING, the cube's third axis -
lip rounding, toward the OO corner.
leds:
- display: list
items:
- id: LED0
name: Bands 1-2
description: >
Energy in the 250 and 450 Hz bands. LEDs 0 to 3 are the formant
display, one per pair of bands, so the vowel being made is
visible as a shape rather than a level.
At boot these show a chase across all six while the switch
settles, then even LEDs for BABBLE and odd for the deliberate
mode - nothing is shown until the switch has been read once,
after the full boot window, so the mode is never guessed at.
Holding the switch down in the deliberate mode turns LEDs 0-3
into a silence diagnostic: excitation gated shut, external input
taken over, formant freeze latched, or all eight band gains near
zero.
- id: LED1
name: Bands 3-4
description: Energy in the 700 and 1000 Hz bands.
- id: LED2
name: Bands 5-6
description: Energy in the 1400 and 1900 Hz bands.
- id: LED3
name: Bands 7-8
description: Energy in the 2600 and 3800 Hz bands.
- id: LED4
name: 8mu
description: Lit while a USB MIDI controller is mounted.
- id: LED5
name: Voiced
description: >
Bright while voiced, dim while unvoiced. Pulses with each
syllable while auto-chatter is running, so the panel shows the
card is talking by itself rather than merely left switched on.
All six LEDs go to an even half brightness while the formants are
frozen, and dimmer still while muted - a flat glow is unlike
every other display on the card, so a frozen or muted card cannot
be mistaken for a broken one.