Skip to the content
PCBKitNew board
4 layers100 × 100 mmTouchSynth, the printed circuit board in 3D

Analog Monophonic Synthesizer with a touch keyboard. Controller by CH32V00x

Size
100 × 100 mm
Copper layers
4
Thickness
1.6 mm
Parts
246
Nets
167
Pads
610
Tracks, vias
1,773, 626
Pours
80
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
17 Oct 2026
Updated
18 Oct 2026

Overview

TouchSynth is an open-source printed circuit board by cpldcpu, from the cpldcpu/TouchSynth repository on GitHub, published under the MIT licence. It is a 4-layer board of 100 × 100 mm with 246 parts on 167 nets, routed with 1,773 tracks and 626 vias.

It is built around the TL072, LM324 and 74HC595, with the CD4051BE, 78L05 and LTV-817S among its other parts. Its parts include 110 resistors, 48 capacitors, 18 diodes, 13 transistors and 12 ICs. It belongs with the audio and music boards and the RISC-V boards of this library.

Main components

10

README

README.md

TouchSynth

A small MCU-controlled analog monophonic synthesizer on a 100 × 100 mm, 4-layer PCB. It has no potentiometers and no mechanical switches: 13 capacitive touch keys plus SHIFT / − / + play and edit it, and 16 LEDs show the settings. A CH32V003 (or CH32V002 / V006) generates the oscillator timing and four PWM control voltages for a discrete analog voice:

  • DCO: a TL072 integrator reset by the MCU timer. The charge current tracks pitch, so the saw amplitude stays flat. Saw, variable-width pulse, sub-oscillator and noise.
  • VCF: a 24 dB/oct transistor ladder (BC847BS) with an expo converter and resonance up to self-oscillation.
  • VCA: a differential-pair VCA. An 8-bit R-2R trim DAC nulls the CV feedthrough ("thump").
  • Line out, an audio loopback into the MCU ADC (for calibration and tests), and an optional MIDI in.

All assembled parts are JLCPCB Basic or Promotional Extended parts: 40 BOM lines, 196 placements, about USD 3.65 of parts per board at list price. The MCU, headers and MIDI parts are hand-soldered.

PCB top

Status (2026-10-18): board 1 (rev 0.1, CH32V006) is built and brought up. It passes the bring-up steps and functional tests T1, T2 and T4–T12 (noise marginal at about −55 dB); T3 (touch scan rate) and T14 (MIDI) have not been measured. The results are in the design report, section 10. Firmware 0.1 runs on the board, including multitrack demo pieces and percussion presets. Calibration storage in flash is still open.

The polyphonic_exp branch experiments with extensions. So far it turns the pulse output into a PWM DAC (CH32V006) for digital voices through the analog filter and VCA, starting with a modal timpani, the kettle (kettle_model.mp3; report, section 10.5).

Design: cpldcpu & Claude Opus 5.5.

Hear it

Recorded from board 1's line out. The synth is monophonic, so the multitrack pieces were played one part at a time and mixed:

PieceBoard 1Model
TouchSynth Demo, original, 7 parts (drums, acid bass, arp, lead, pad)demo_hwdemo_model
Purcell, Queen Mary's March: 4 trumpets, bass, timpani (modal synthesis on the PWM DAC)march_hwmarch_model
Bach, Toccata BWV 565, mm. 1–30: 9 organ voicestoccata_hwtoccata_model
Aerosphere, original space-synth piece, 8 partsaero_hwaero_model
Suite: Aerosphere intro into the Toccatasuite_hwsuite_model

The three built-in demo tunes (SHIFT + C' on the board), recorded from board 1: acid, prelude (Bach BWV 846) and ode (Beethoven). Also from the board: a waveform tour and a scale on the self-oscillating filter. The behavioural model renders every single feature (waveforms, filter, envelopes, glide, …) in docs/audio/features/. docs/README.md lists all audio files.

Documents

DocumentContent
docs/report/touchsynth_report.pdfdesign report: requirements, architecture, circuits, simulations, PCB, BOM, firmware, demo tunes and instruments, V&V with the board 1 results
docs/README.mdindex of everything in docs/: documents, figures, result data, audio
docs/spec.mdspecification and design decisions (some pre-layout details are outdated; the report is current)
docs/sim_report.mdsimulation report S1–S7 and the behavioural model
docs/verification_plan.mdbring-up, functional tests, calibration and validation, board 1 results
docs/touchsynth_schematic.pdfschematic (7 sheets)
firmware/touchsynth/README.mdfirmware build, playing instructions and test console
hw/README.mdschematic generator scripts

Repository layout

text
docs/        report (LaTeX), spec, simulation report, V&V plan, figures, audio examples, result CSVs
sim/         ngspice simulations S1–S7 (one folder per block), shared netlists and models, behavioural model
hw/          design.py (single source of truth) -> KiCad schematic, PCB, routing and fab outputs
  touchsynth/  KiCad 10 project (generated; edit the Python sources, not the KiCad files)
firmware/    touchsynth/ firmware 0.1, ch32fun (git submodule)
parts/       JLCPCB Basic / Promotional Extended part lists
tools/       bench tools: hardware tests, scope recording, multitrack mixing, figures; Freerouting jar (not in git)

Flow

Every stage is generated by scripts from hw/design.py, which holds the parts, values, LCSC numbers and nets.

text
simulate      sim/s*/s*.py                 ngspice-42 in WSL -> docs/results/*.csv, docs/figures/*.png
model         sim/behav/validate.py        behavioural model vs. ngspice
              sim/behav/examples.py        audio examples + spectrograms
schematic     hw/gen_sch2.py               -> hw/touchsynth/*.kicad_sch
              hw/check_netlist.py          KiCad netlist == design.py
              hw/check_sim.py              design.py == simulation netlists
PCB           hw/gen_pcb.py [--route]      placement, silkscreen art, planes, Freerouting + GND stitching
              hw/gen_pcb.py --finish       post-route clean-up (islands, leftovers via the A* router)
fab           hw/fab.py                    gerbers, drill, BOM and CPL -> hw/touchsynth/production/
report        docs/report/gen_tables.py    then: latexmk -pdf touchsynth_report.tex (WSL)
firmware      firmware/touchsynth/gen_tables.py, check_pins.py, make
tunes         sim/behav/tunes.py, pieces.py    demo tunes, multitrack pieces and presets (-> firmware tables)
bench         tools/hwtest.py              functional tests over the SWIO console -> docs/results/hw_board1*
              tools/hw_figures.py          board 1 figures for the report
              tools/record_parts.sh        record one multitrack part per take with the scope (on the lab PC)
              tools/mix_parts.py, suite.py align, clock-correct and mix the takes -> docs/audio/

The bench tools need the lab setup (the PC with the programmer, the scope address) in tools/lab.conf: copy tools/lab.conf.example and edit it; lab.conf is not in git.

gen_pcb.py needs KiCad's bundled Python (pcbnew) and Java 17 for Freerouting 1.9.0. The hw scripts find KiCad 10 in its standard install folder, or in KICAD_DIR if set. The other Python scripts use a normal Python 3 with numpy and matplotlib. ngspice, LaTeX and the RISC-V toolchain run in WSL.

Key numbers

Supply9–12 V DC, about 31 mA (simulated); board 1: 25 mA, MCU running, LEDs off
Pitch rangeC1 … C8, saw amplitude flat within ±2.2 %
Filter20 Hz … 20 kHz cutoff, −23 dB/oct, self-oscillation
VCA121 dB off-attenuation, thump < 0.6 mV after trim
Outputabout 1.2 Vpp line level, AC-coupled
Control4 × 12-bit CV (10-bit PWM at 46.9 kHz + 2-bit dither), 1 kHz envelope / LFO rate
Touch16 pads via 2 × CD4051, 1.4 kHz scan
PCB100 × 100 mm, 4 layers (signal / GND / split power / signal), 242 parts, 166 nets

Parts

246
QtyValueFootprintReferences
294.7kResistor_SMD:R_0603_1608MetricR16, R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R102, R103 +13
17100nCapacitor_SMD:C_0603_1608MetricC2, C4, C15, C17, C18, C19, C20, C21, C22, C26, C28, C34, C36, C41, C45, C48 +1
1710kResistor_SMD:R_0603_1608MetricR6, R7, R55, R63, R64, R66, R67, R73, R81, R82, R85, R86, R87, R104, R106, R109 +1
16redLED_SMD:LED_0603_1608MetricD3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15, D16, D17, D18
151kResistor_SMD:R_0603_1608MetricR1, R9, R10, R11, R12, R48, R52, R57, R62, R74, R78, R90, R94, R98, R99
10100kResistor_SMD:R_0603_1608MetricR34, R36, R38, R40, R42, R44, R46, R65, R68, R108
9200kResistor_SMD:R_0603_1608MetricR32, R33, R35, R37, R39, R41, R43, R45, R47
810µCapacitor_SMD:C_0603_1608MetricC1, C5, C10, C11, C12, C13, C14, C46
81µCapacitor_SMD:C_0603_1608MetricC3, C7, C8, C9, C16, C35, C39, C44
833nCapacitor_SMD:C_0603_1608MetricC23, C27, C30, C31, C32, C33, C37, C42
8BC847BSPackage_TO_SOT_SMD:SOT-363_SC-70-6Q4, Q5, Q6, Q7, Q8, Q9, Q11, Q13
415kResistor_SMD:R_0603_1608MetricR51, R77, R93, R110
4470kResistor_SMD:R_0603_1608MetricR70, R71, R72, R96
4M3MountingHole_3.2mm_M3H1, H2, H3, H4
4MMBT3904Package_TO_SOT_SMD:SOT-23Q1, Q3, Q10, Q12
322kResistor_SMD:R_0603_1608MetricR89, R105, R107
322nCapacitor_SMD:C_0603_1608MetricC24, C38, C43
333kResistor_SMD:R_0603_1608MetricR53, R59, R97
374HC595Package_SO:SOIC-16_3.9x9.9mm_P1.27mmU7, U8, U9
3TL072Package_SO:SOIC-8_3.9x4.9mm_P1.27mmU2, U10, U11
21.5kResistor_SMD:R_0603_1608MetricR5, R60
21nCapacitor_SMD:C_0603_1608MetricC29, C47
22.2kResistor_SMD:R_0603_1608MetricR8, R54
2CD4051BPackage_SO:SOIC-16_3.9x9.9mm_P1.27mmU5, U6
2GNDConnector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_VerticalTP1, TP2
1+5VTestPoint:TestPoint_Pad_D1.0mmTP4
110Resistor_SMD:R_0603_1608MetricR3
110nCapacitor_SMD:C_0603_1608MetricC25
1120kResistor_SMD:R_0603_1608MetricR80
1150kResistor_SMD:R_0603_1608MetricR69
11MResistor_SMD:R_0603_1608MetricR100
11N4148WDiode_SMD:D_SOD-123D2
12.4kResistor_SMD:R_0603_1608MetricR13
1220Resistor_SMD:R_0603_1608MetricR14
12MResistor_SMD:R_0603_1608MetricR101
12N7002Package_TO_SOT_SMD:SOT-23Q2
13.3kResistor_SMD:R_0603_1608MetricR4
1300kResistor_SMD:R_0603_1608MetricR61
14.7µCapacitor_SMD:C_0603_1608MetricC40
1470Resistor_SMD:R_0603_1608MetricR15
16.2kResistor_SMD:R_0603_1608MetricR79
178L05Package_TO_SOT_SMD:SOT-89-3U1
19.1kResistor_SMD:R_0603_1608MetricR2
1CH32V003F4P6 / CH32V002F4P6Package_SO:TSSOP-20_4.4x6.5mm_P0.65mmU3
1LINE OUTConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ4
1LM324Package_SO:SOIC-14_3.9x8.7mm_P1.27mmU12
1LPFTestPoint:TestPoint_Pad_D1.0mmTP15
1LTV-817SPackage_DIP:SMDIP-4_W9.53mmU4
1MIDI INConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ3
1NRSTTestPoint:TestPoint_Pad_D1.0mmTP11
1PWR 9-12VConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ1
1RESOUTTestPoint:TestPoint_Pad_D1.0mmTP18
1SAWTestPoint:TestPoint_Pad_D1.0mmTP12
1SS14Diode_SMD:D_SMAD1
1SWIOConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ2
1TAILTestPoint:TestPoint_Pad_D1.0mmTP14
1Touch +TouchSynth:TouchPad_FuncKEY16
1Touch -TouchSynth:TouchPad_FuncKEY15
1Touch ATouchSynth:TouchPad_WhiteKEY10
1Touch A#TouchSynth:TouchPad_BlackKEY11
1Touch BTouchSynth:TouchPad_WhiteKEY12
1Touch CTouchSynth:TouchPad_WhiteKEY1
1Touch C#TouchSynth:TouchPad_BlackKEY2
1Touch C'TouchSynth:TouchPad_WhiteKEY13
1Touch DTouchSynth:TouchPad_WhiteKEY3
1Touch D#TouchSynth:TouchPad_BlackKEY4
1Touch ETouchSynth:TouchPad_WhiteKEY5
1Touch FTouchSynth:TouchPad_WhiteKEY6
1Touch F#TouchSynth:TouchPad_BlackKEY7
1Touch GTouchSynth:TouchPad_WhiteKEY8
1Touch G#TouchSynth:TouchPad_BlackKEY9
1Touch SHIFTTouchSynth:TouchPad_FuncKEY14
1V25TestPoint:TestPoint_Pad_D1.0mmTP7
1VB0TestPoint:TestPoint_Pad_D1.0mmTP8
1VB2TestPoint:TestPoint_Pad_D1.0mmTP9
1VB4TestPoint:TestPoint_Pad_D1.0mmTP10
1VBIASTestPoint:TestPoint_Pad_D1.0mmTP6
1VCAOUTTestPoint:TestPoint_Pad_D1.0mmTP19
1VPTestPoint:TestPoint_Pad_D1.0mmTP3
1VREFTestPoint:TestPoint_Pad_D1.0mmTP5

The 241 most common of 246 parts.

Questions

How big is the TouchSynth PCB?

It measures 100 × 100 mm and has 4 copper layers, 1.6 mm thick.

What parts does the TouchSynth use?

246 parts, built around the TL072, LM324, 74HC595 and CD4051BE. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the TouchSynth KiCad files?

From the cpldcpu/TouchSynth repository on GitHub, at the commit this page was made from: the board is hw/touchsynth/touchsynth.kicad_pcb and its schematic hw/touchsynth/dco.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the TouchSynth design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layers58 × 65 mmAdsr vca core, the printed circuit board in 3D

    Adsr vca core

    shmoergh/moduleur

    Fully analog DIY-friendly modular synth

    68 parts222
  • 2 layers70 × 100 mm03 quad vca mixer, the printed circuit board in 3D

    03 quad vca mixer

    bmurauer/cynthia

    Plans for my modular synthesizer

    153 parts
  • 4 layers133.9 × 165.1 mmMain VCO board, the printed circuit board in 3D

    Main VCO board

    JordanAceto/micro_ox

    Monosynth with analog signal path and digital controls. SSI2130 VCOs and SSI2140 VCF.

    295 parts8CC-BY-4.0
  • 2 layers100 × 100 mmPower supply, the printed circuit board in 3D

    Power supply

    gabrielfbdiniz/PFC-Boost-STM32

    Conversor estático de potência CA/CC com Correção Ativa do Fator de Potência (Active PFC) na topologia Boost, projetado para elevar a tensão da rede elétrica retificada (127V / 220V AC) para um barramento CC…

    89 parts
  • 4 layers71.1 × 99.1 mmQuad adsr, the printed circuit board in 3D

    Quad adsr

    JordanAceto/quad_ADSR_board

    PCB for a quad eurorack ADSR

    197 parts5
  • 4 layers87.6 × 84 mmFlashover, the printed circuit board in 3D

    Flashover

    Cherry-Blossom-Development/GreywireStudio

    GreywireStudio - a combined software/hardware product

    95 parts
  • 2 layers56 × 85.4 mmFU-3, the printed circuit board in 3D

    FU-3

    soggybag/FU-3

    An octave / "tripler" distortion with a big two-knob tone stage: the Distort-o-matic XI (Stompboxology Vol. 13 No.

    84 parts
  • 2 layers53 × 52.1 mmUglyFace 03, the printed circuit board in 3D

    UglyFace 03

    soggybag/Ugly-Face-3-SMD

    A gated, envelope-controlled square-wave synth fuzz for guitar, in a Hammond 1590B. A TL072 preamp (gain 201) gates and bends a TLC555 oscillator, with a MIX control to blend the dry fuzz with the synth tone.

    84 parts