Projects
Inventor Projects

MiniTeensy: Build a Six-Voice Synth with Teensy 4.1

Added October 3, 2026
9 min read
Nick Culbertson's finished MiniTeensy synthesizer with labeled knobs and a blue character LCD
Photo credit

MiniTeensyImage1.jpg

Nick Culbertson Β· MIT

Resized without cropping and converted to WebP.

Before you build

The source offers a minimal LCD-and-encoder build and a fuller hands-on control panel, alongside a USB-only configuration. Read the version notes before wiring: the v1.1 update changes menu-encoder pins and an amp-attack encoder connection. USB audio/MIDI is the documented current audio path; the standalone and DIN options have extra hardware or code requirements. This is a virtual-analog tribute, not a product affiliated with Moog. All original pin tables, installation steps, test sequence, and contributor acknowledgments are retained.

More builds

Nick Culbertson's full MiniTeensy README, original finished-instrument photograph, minimal and twenty-encoder wiring layouts, USB audio/MIDI setup, and testing sequence.

MiniTeensy Synth

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

Watch the video

Project featured on Synth Anatomy, Synthtopia, and Matrix Synth! πŸš€

Key Features

  • 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

Recent Updates

v1.1 - December 2025

  • 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 16

For existing builds: Swap CLK wire from pin 13 to pin 14, and SW wire from pin 15 to pin 16. Move enc18 DT (Amp Attack) encoder from pin 16 to 51 (under the Teensy).

Need the old version? Use v1.0 release for original pin assignments.

Hardware Requirements

NOTE: ENABLE YOUR HARDWARE SETUP IN CONFIG.H - You can build this with no additional components if you use USB audio and USB MIDI. Params are changed with MIDICC and you can change preset with Program Changes.

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:

Detailed Wiring & Pinout

Teensy 4.1 Complete Pinout Assignment

                    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  β”‚ Menu Encoder SW (Push Button)
    β”‚ 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  β”‚ Blank (LED Pin)
                                             β””β”€β”€β”€β”€β”€β”˜
    β”‚ 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  β”‚ enc18 DT  (Amp Attack)             (Under the Teensy)
                                             β”‚ 52  β”‚
                                             β””β”€β”€β”€β”€β”€β”˜

Minimal Build (LCD + 1 Encoder)

Perfect for testing or easier builds:

Menu Encoder Connections:

Menu Encoder Pin    β†’  Teensy 4.1 Pin    β”‚  Function
─────────────────────────────────────────┼─────────────
SW (Push Button)    β†’  16                β”‚  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.

Full Build (20 Encoders) - Complete Wiring

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→16) / 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    β”‚   51    β”‚ 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:

  1. Power test: Connect only Teensy + LCD, verify LCD backlight
  2. Menu test: Add menu encoder, verify menu navigation works
  3. Encoder test: Add other control encoders
  4. Audio test: Connect to computer, verify "Teensy Audio" device appears
  5. MIDI test: Send MIDI notes, verify synthesis works

Audio + MIDI Options

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)

Software Installation

  1. Install Arduino IDE 2.0+ from arduino.cc
  2. Add Teensy support:
    • Modern IDE: Tools β†’ Board Manager β†’ Search "Teensy" β†’ Install
    • Fallback: Download Teensyduino from PJRC
  3. Install libraries: Tools β†’ Manage Libraries β†’ Install "LiquidCrystal I2C" and "Encoder"
    • For DIN MIDI: Also install "MIDI Library" by Francois Best
  4. Download this project and open Mini-Teensy-Synth.ino
  5. Configure: Board→Teensy 4.1, USB Type→Audio+MIDI
  6. Upload! Your computer will show "Teensy Audio" device

Usage

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

Contributing

Fork, test on hardware, submit PR. Open source project!

Thanks

  • PJRC - Teensy platform and Audio Library
  • Minimoog - The OG
  • Open source community

This project was developed with assistance from Claude Code.

Source and license

Original documentation: Nick Culbertson. Reproduced under MIT. Individual image credits identify any separately licensed media. The full original copyright and permission notice is retained in that license file.

Republished the complete README text. Reformatted HTML as Markdown, resolved relative links, and served repository images locally. Photos resized without cropping; diagrams retain source resolution. Externally hosted or separately unverified media is linked at its original location. Introductory selection notes are by Meteor Makers; the original author is not responsible for those notes.

Source revision: 0abee0f6af64. Retrieved 2026-10-03. This is a source snapshot, not a claim that the project was first published today or that its creator endorses Meteor Makers.

Comments

Member comments are temporarily unavailable.

Log in to join the discussion.