A classic subtractive synth
- 2 VCOs
- Mixer
- LFO
- ADSR x2
- VCF
- VCA
Why Teensy 4.0 is Great for This
The Teensy 4.0 has a 600MHz ARM Cortex-M7 processor and the Teensy Audio Library which provides hardware-accelerated DSP — it’s practically designed for synthesizers.
Hardware You’ll Need
Teensy 4.0 + Teensy Audio Shield (Rev D) — the shield gives you a proper 16-bit stereo codec (SGTL5000), headphone amp, and line out.
Analog Inputs for Knobs/Switches:
- Teensy 4.0 has 14 analog inputs (A0–A13)
- For your module count you’ll need more — use a 74HC4051 or CD4067 analog multiplexer (8:1 or 16:1) to expand to 32–64+ inputs
- Standard 10kΩ linear potentiometers for all knobs
- Toggle switches or momentary buttons for on/off functions
Rough knob count:
| Module | Knobs/Controls |
|---|---|
| VCO × 2 | Tune, Fine, Octave, Waveform select = ~8 |
| Mixer | Level × 2, Pan = ~3 |
| LFO | Rate, Depth, Waveform = ~3 |
| ADSR × 2 | Attack, Decay, Sustain, Release = ~8 |
| VCF | Cutoff, Resonance, Env Amount, KBD track = ~4 |
| VCA | Level = ~1 |
| Total | ~27 controls |
You’d need ~2× CD4067 (16-channel mux) chips to handle all of these.
Software Architecture (Teensy Audio Library)
The Audio Library uses a patch-cable style object graph — you wire objects together in code exactly like a real synth:
cpp
#include <Audio.h>
// VCOs
AudioSynthWaveform vco1;
AudioSynthWaveform vco2;
// Mixer (combines VCOs)
AudioMixer4 mixer;
// LFO
AudioSynthWaveformSineHires lfo;
// VCF (State Variable Filter)
AudioFilterStateVariable vcf;
// VCA (via amplifier with envelope control)
AudioEffectEnvelope adsr1; // for VCF
AudioEffectEnvelope adsr2; // for VCA
AudioAmplifier vca;
// Output
AudioOutputI2S audioOut;
AudioControlSGTL5000 sgtlCodec;
// Patch cables
AudioConnection patchVCO1(vco1, 0, mixer, 0);
AudioConnection patchVCO2(vco2, 0, mixer, 1);
AudioConnection patchMix(mixer, 0, adsr1, 0); // ADSR1 on audio path
AudioConnection patchADSR1(adsr1, 0, vcf, 0);
AudioConnection patchVCF(vcf, 0, vca, 0); // lowpass out
AudioConnection patchVCA(vca, 0, audioOut, 0);
The multiplexed knob reading then maps to .frequency(), .amplitude(), .resonance(), .attack() etc. calls on each object.
Reading Multiplexed Knobs
cpp
// Example with CD4067 (16-ch mux) on SPI/digital pins
int readMux(int channel) {
// Set S0–S3 select pins
digitalWrite(S0, channel & 1);
digitalWrite(S1, (channel >> 1) & 1);
digitalWrite(S2, (channel >> 2) & 1);
digitalWrite(S3, (channel >> 3) & 1);
delayMicroseconds(5);
return analogRead(MUX_SIG_PIN); // 0–1023
}
Key Considerations
- MIDI input — add a 5-pin DIN MIDI jack or USB-MIDI (built into Teensy) for note control
- Power — pots + Teensy + audio shield runs fine from USB 5V; use decoupling caps near mux chips
- Panel — design a front panel in something like Front Panel Designer or laser-cut acrylic
- Polyphony — you could extend this to 4–8 voices given the Teensy 4.0’s CPU headroom
- Audio memory — call
AudioMemory(20)in setup; increase if you get clicks
Good Starting Points
- Teensy Audio System Design Tool — drag-and-drop patch graph generator at https://www.pjrc.com/teensy/gui/
- Teensy Forum synth projects — PJRC forums have many complete DIY synth builds to reference
- Look at the Ambika and Mutable Instruments open-source designs for panel layout inspiration