A 6-voice polyphonic virtual analog synthesizer built with the Teensy 4.1 microcontroller, inspired by the classic Minimoog. Features comprehensive synthesis with USB audio/MIDI and intuitive menu control.
Video: DIY Minimoog Inspired Synth | A Teensy Powered Tribute
Project featured on Synth Anatomy, Synthtopia, and Matrix Synth! π
- 6-voice polyphony with 3 oscillators per voice (18 total)
- 6 waveforms per oscillator
- Noise shared white/pink noise
- 24dB Moog-style ladder filter with ADSR envelopes
- Independent LFO with pitch/filter/amp targets
- Macro knob system - remap filter knobs to LFO controls
- USB Audio + MIDI - single cable to computer
- MIDI channel selection - receive on specific channel or omni mode
- 20 hardware encoders + LCD for real-time control
- 20 Presets - 80s Brass, Saw Keys, Bass sounds, Pads, and more
- Multiple play modes - Mono, Poly, Legato with glide
- Added MIDI Host Support
- Added MIDICC Support
BREAKING CHANGE Menu encoder pin assignments changed to fix encoder timing issues:
- Menu Encoder CLK: Pin 13 β Pin 14
- Menu Encoder DT: Pin 14 β Pin 15
- Menu Encoder SW: Pin 15 β Pin 13
For existing builds: Swap CLK wire from pin 13 to pin 14, and SW wire from pin 15 to pin 13.
Need the old version? Use v1.0 release for original pin assignments.
Full Build:
- Teensy 4.1 microcontroller
- 19x Rotary Encoders + 1x Menu Encoder with push button
- 16x2 I2C LCD display
- Enclosure, knob caps, hookup wire
If using the Teensy's MIDI Host enable USE_MIDI_HOST in config.
Minimal Build:
- Teensy 4.1 + 1x Menu Encoder + LCD
- USB cable for audio/MIDI output
- All parameters accessible via menu system
Parts:
- Teensy 4.1 (https://www.sparkfun.com/teensy-4-1-without-ethernet.html)
- Menu Encoder (https://www.amazon.com/Taiss-KY-040-Encoder-15Γ16-5-Arduino/dp/B07F26CT6B/ref=sr_1_3_pp)
- Other Encoders (https://www.aliexpress.us/item/3256801237549169.html)
- LCD 2X16 (https://www.amazon.com/Hosyond-Display-Module-Arduino-Raspberry/dp/B0BWTFN9WF/ref=sr_1_2)
- Knobs (https://www.amazon.com/Taiss-Silver-Rotary-Potentiometer-Diameter/dp/B07F25NMJ7/ref=sr_1_5)
Teensy 4.1 Pinout Map
βββββββ βββββββ
β 0 β enc3 CLK (Osc3 Range) 5V β VIN β LCD Power
β 1 β enc3 DT (Osc3 Range) β GND β All encoders daisy-chained to ground + LCD and Menu
β 2 β enc2 CLK (Osc2 Range) β 3V β Menu Encoder Power
β 3 β enc2 DT (Osc2 Range) β 23 β enc15 CLK (Filter Decay/LFO Depth)
β 4 β enc1 CLK (Osc1 Range) β 22 β enc15 DT (Filter Decay/LFO Depth)
β 5 β enc1 DT (Osc1 Range) β 21 β enc11 CLK (Osc3 Volume)
β 6 β enc5 CLK (Osc2 Fine) β 20 β enc11 DT (Osc3 Volume)
β 7 β enc5 DT (Osc2 Fine) β 19 β SCL (LCD I2C) LCD Clock
β 8 β enc4 CLK (Osc1 Fine) β 18 β SDA (LCD I2C) LCD Data
β 9 β enc4 DT (Osc1 Fine) β 17 β enc18 CLK (Amp Attack)
β 10 β enc8 CLK (Osc3 Wave) β 16 β enc18 DT (Amp Attack)
β 11 β enc8 DT (Osc3 Wave) β 15 β Menu Encoder DT (Filter Cutoff when not in menu)
β 12 β enc7 CLK (Osc2 Wave) β 14 β Menu Encoder CLK (Filter Cutoff when not in menu)
βββββββ β 13 β Menu Encoder SW (Push Button)
βββββββ
β 24 β enc7 DT (Osc2 Wave) β 41 β enc14 DT (Filter Attack/LFO Rate)
β 25 β enc6 CLK (Osc1 Wave) β 40 β enc20 CLK (Amp Sustain)
β 26 β enc10 DT (Osc2 Volume) β 39 β enc20 DT (Amp Sustain)
β 27 β enc6 DT (Osc1 Wave) β 38 β enc19 CLK (Amp Decay)
β 28 β enc10 CLK(Osc2 Volume) β 37 β enc19 DT (Amp Decay)
β 29 β enc9 CLK (Osc1 Volume) β 36 β enc16 CLK (Filter Sustain/LFO Target)
β 30 β enc9 DT (Osc1 Volume) β 35 β enc16 DT (Filter Sustain/LFO Target)
β 31 β enc17 CLK(Noise Volume) β 34 β enc13 CLK (Filter Resonance)
β 32 β enc17 DT (Noise Volume) β 33 β enc13 DT (Filter Resonance)
βββββββ β β
β 50 β enc14 CLK (Filter Attack/LFO Rate) (Under the Teensy)
β 51 β
β 52 β
βββββββ
Perfect for testing or easier builds:
Menu Encoder Connections:
Menu Encoder Pin β Teensy 4.1 Pin β Function
ββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββ
SW (Push Button) β 13 β Menu Select
CLK β 14 β Rotary Clock
DT β 15 β Rotary Data
VCC β 3.3V β Power (3.3V)
GND β GND β Ground
LCD I2C Connections:
LCD Pin β Teensy 4.1 Pin β Function
βββββββββββββββββββββββββββββββββΌβββββββββββββββββ
VCC β 5V (VIN) β Power
GND β GND β Ground
SDA β 18 β I2C Data
SCL β 19 β I2C Clock
Power:
- Single USB cable to computer provides power and audio/MIDI
That's it! All synthesis parameters accessible through menu.
All Encoder Connections:
Function β Encoder β CLK Pin β DT Pin β Purpose
βββββββββββββββββββββΌββββββββββΌββββββββββΌββββββββββΌββββββββββββββββββββββ
Osc1 Range β enc1 β 4 β 5 β Footages: 32', 16', 8', 4', 2'
Osc2 Range β enc2 β 2 β 3 β Footages: 32', 16', 8', 4', 2'
Osc3 Range β enc3 β 0 β 1 β Footages: 32', 16', 8', 4', 2'
Osc1 Fine Tune β enc4 β 8 β 9 β Β±7 semitone detune
Osc2 Fine Tune β enc5 β 6 β 7 β Β±7 semitone detune
Osc1 Waveform β enc6 β 25 β 27 β Triangle, Sawtooth, Square, Pulse, etc.
Osc2 Waveform β enc7 β 12 β 24 β Triangle, Sawtooth, Square, Pulse, etc.
Osc3 Waveform β enc8 β 10 β 11 β Triangle, Sawtooth, Square, Pulse, etc.
Osc1 Volume β enc9 β 29 β 30 β Mixer level control
Osc2 Volume β enc10 β 28 β 26 β Mixer level control
Osc3 Volume β enc11 β 21 β 20 β Mixer level control
Menu Navigation β menu β 14 β 15 β Main interface (SWβ13) / Filter Cutoff when not in menu
Filter Resonance β enc13 β 34 β 33 β Resonance Q factor
Filter Envelope Amt β enc14 β 50 β 41 β Attack / LFO Rate*
Filter Decay β enc15 β 23 β 22 β Decay / LFO Depth*
Filter Sustain β enc16 β 36 β 35 β Sustain / LFO Target*
Noise Volume β enc17 β 31 β 32 β White/Pink noise mix level
Amp Attack β enc18 β 17 β 16 β Envelope attack time
Amp Decay β enc19 β 38 β 37 β Envelope decay time
Amp Sustain β enc20 β 40 β 39 β Envelope sustain level
*Macro Mode: enc14/enc15/enc16 switch between Filter envelope and LFO controls
Standard Encoder Wiring (for each encoder):
Encoder Terminal β Connection β Notes
ββββββββββββββββββββββββββββββββββββββ-ββββββββΌββββββββββββββββββββββ
CLK β Specific Teensy pin β See table above
DT β Specific Teensy pin β See table above
GND/- β Common ground bus β Daisy-chain ALL grounds
IMPORTANT - Ground Connections: All encoder GND pins must be connected together and to Teensy GND:
- Daisy-chain method: Connect GND wire from encoder 1 β encoder 2 β encoder 3 β ... β Teensy GND
Power Distribution:
Power Rail β Source β Connects To
βββββββ-ββββββββΌβββββββββββββββββΌβββββββββββββββββββββββββββββ
5V β USB port β Teensy VIN, LCD VCC
3.3V β Teensy 4.1 β Menu Encoder VCC
GND β Teensy 4.1 β All encoder GND, LCD GND
Testing Procedure:
- Power test: Connect only Teensy + LCD, verify LCD backlight
- Menu test: Add menu encoder, verify menu navigation works
- Encoder test: Add other control encoders
- Audio test: Connect to computer, verify "Teensy Audio" device appears
- MIDI test: Send MIDI notes, verify synthesis works
Option 1: Computer DAW (Current Setup)
- Single USB cable provides audio output + MIDI input
- Plug-and-play with some DAWs
Option 2: Standalone with MIDI Keyboard
For standalone use without computer:
- Connect USB MIDI keyboard to Teensy USB Host pins
- Requires USB Host cable
- Audio output through computer USB (or modify code for I2S/line out)
- Note: Requires code modification for USB Host MIDI instead of USB Device
Option 3: DIN MIDI Support (Hardware Modification) Add traditional 5-pin DIN MIDI input for hardware compatibility:
Hardware Required:
- 6N138 optocoupler IC
- 220Ξ© resistor
- 5-pin DIN MIDI connector
- Standard MIDI interface circuit (see MIDI spec)
Wiring:
- Connect MIDI interface circuit output to Teensy Serial1 (Pin 0)
- MIDI input circuit connects to DIN connector pins 4,5
- Important: Pin 0 is currently used by enc3 (Osc3 Range). You'll need to move enc3's CLK wire from Pin 0 to one of the surface mount pins on the bottom of the Teensy 4.1 board (pins 42-47 are available)
Code Changes Required:
// In Mini-Teensy-Synth.ino, uncomment this line:
#define ENABLE_DIN_MIDI
// That's it! The DIN MIDI support code is already included.Features:
- Supports both USB MIDI and DIN MIDI simultaneously
- Selectable MIDI channel (1-16 or Omni) via Settings menu
- Standard MIDI implementation (Note On/Off, CC, Pitch Bend)
- Install Arduino IDE 2.0+ from arduino.cc
- Add Teensy support:
- Modern IDE: Tools β Board Manager β Search "Teensy" β Install
- Fallback: Download Teensyduino from PJRC
- Install libraries: Tools β Manage Libraries β Install "LiquidCrystal I2C" and "Encoder"
- For DIN MIDI: Also install "MIDI Library" by Francois Best
- Download this project and open
Mini-Teensy-Synth.ino - Configure: BoardβTeensy 4.1, USB TypeβAudio+MIDI
- Upload! Your computer will show "Teensy Audio" device
Menu Navigation: Click encoder to navigate, turn to adjust values. All parameters accessible via hierarchical menu system.
Macro Knobs: Settings β Macro Knobs toggles filter envelope controls between Filter (Attack/Decay/Sustain) and LFO (Rate/Depth/Target) modes.
MIDI Channel: Settings β MIDI Channel sets which MIDI channel to receive (1-16, or Omni for all channels).
Menu Structure:
Presets | OSC 1-3 | Noise | Envelopes | Filter | LFO | Voice Mode | Settings
Fork, test on hardware, submit PR. Open source project!
- PJRC - Teensy platform and Audio Library
- Minimoog - The OG
- Open source community