

TouchSynth
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
10TL072
SOP-8-18V~18V 0℃~+70℃ 1.4mA 1.5nA 10V/us 10mV 2 2.5nA 3MHz 85dB SOP-8 Operational Amplifier ROHSGcoreOperational AmplifierLM324
SOP-14-1.5V~10V 0℃~+70℃ 24V 250nA 3V~20V 4 40mA 50nA 700uA 7mV 80dB SOP-14 Operational Amplifier ROHSHXY MOSFETOperational Amplifier74HC595
SOP-16-40℃~+85℃ 1 100ns@5V,50pF 10MHz 2V~6V 74HC 8 Serial-to-Serial or Parallel Tri-State SOP-16 Shift Registers ROHSGRShift RegistersCD4051BE
PDIP-16-55℃~+125℃ 125Ω 20MHz 3V~20V 450ns 8 8:1 PDIP-16 Analog Switches, Multiplexers ROHSTexas InstrumentsAnalog Switches, Multiplexers78L05
SOT-89-3-20℃~+120℃@(Tj) 1 1.7V 100mA 2mA 30V 40uV 49dB@(120Hz) 5V Fixed Over Temperature Protection、Short Circuit Protection Positive SOT-89-3 Voltage Regulators - Linear, Low Drop Out (LDO) Regulators ROHSUMWVoltage Regulators - Linear, Low Drop Out (LDO) RegulatorsLTV-817S
SMD-4P-55℃~+110℃ 1 1.2V 100mV@20mA,1mA 200mW 35V 3us 4us 50% 50mA 50mA 5kV 600% 6V DC Phototransistor SMD-4P Transistor, Photovoltaic Output Optoisolators ROHSLite-OnTransistor, Photovoltaic Output OptoisolatorsBC847BS
SOT-363Bipolar (BJT)hongjiachengMMBT3904
SOT-23-55℃~+150℃ 1 NPN 100 100nA 200mA 200mW 300MHz 300mV 40V 6V NPN SOT-23 Bipolar (BJT) ROHSJiangsu Changjing Electronics Technology (CJ)Bipolar (BJT)1N4148W
SOD-123150mA 1A 1V@50mA 1uA@75V 400mW 4ns 75V Independent SOD-123 Switching Diodes ROHSSTMicroelectronicsSwitching DiodesSS14
SMA(DO-214AC)-55℃~+150℃ 1A 25A 300uA@40V 40V 550mV@1A Independent SMA(DO-214AC) Schottky Diodes ROHSMDDSchottky Diodes
README
README.mdTouchSynth
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.

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:
| Piece | Board 1 | Model |
|---|---|---|
| TouchSynth Demo, original, 7 parts (drums, acid bass, arp, lead, pad) | demo_hw | demo_model |
| Purcell, Queen Mary's March: 4 trumpets, bass, timpani (modal synthesis on the PWM DAC) | march_hw | march_model |
| Bach, Toccata BWV 565, mm. 1–30: 9 organ voices | toccata_hw | toccata_model |
| Aerosphere, original space-synth piece, 8 parts | aero_hw | aero_model |
| Suite: Aerosphere intro into the Toccata | suite_hw | suite_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
| Document | Content |
|---|---|
| docs/report/touchsynth_report.pdf | design report: requirements, architecture, circuits, simulations, PCB, BOM, firmware, demo tunes and instruments, V&V with the board 1 results |
| docs/README.md | index of everything in docs/: documents, figures, result data, audio |
| docs/spec.md | specification and design decisions (some pre-layout details are outdated; the report is current) |
| docs/sim_report.md | simulation report S1–S7 and the behavioural model |
| docs/verification_plan.md | bring-up, functional tests, calibration and validation, board 1 results |
| docs/touchsynth_schematic.pdf | schematic (7 sheets) |
| firmware/touchsynth/README.md | firmware build, playing instructions and test console |
| hw/README.md | schematic generator scripts |
Repository layout
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.
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
| Supply | 9–12 V DC, about 31 mA (simulated); board 1: 25 mA, MCU running, LEDs off |
| Pitch range | C1 … C8, saw amplitude flat within ±2.2 % |
| Filter | 20 Hz … 20 kHz cutoff, −23 dB/oct, self-oscillation |
| VCA | 121 dB off-attenuation, thump < 0.6 mV after trim |
| Output | about 1.2 Vpp line level, AC-coupled |
| Control | 4 × 12-bit CV (10-bit PWM at 46.9 kHz + 2-bit dither), 1 kHz envelope / LFO rate |
| Touch | 16 pads via 2 × CD4051, 1.4 kHz scan |
| PCB | 100 × 100 mm, 4 layers (signal / GND / split power / signal), 242 parts, 166 nets |
Parts
246| Qty | Value | Footprint | References |
|---|---|---|---|
| 29 | 4.7k | Resistor_SMD:R_0603_1608Metric | R16, R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R102, R103 +13 |
| 17 | 100n | Capacitor_SMD:C_0603_1608Metric | C2, C4, C15, C17, C18, C19, C20, C21, C22, C26, C28, C34, C36, C41, C45, C48 +1 |
| 17 | 10k | Resistor_SMD:R_0603_1608Metric | R6, R7, R55, R63, R64, R66, R67, R73, R81, R82, R85, R86, R87, R104, R106, R109 +1 |
| 16 | red | LED_SMD:LED_0603_1608Metric | D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15, D16, D17, D18 |
| 15 | 1k | Resistor_SMD:R_0603_1608Metric | R1, R9, R10, R11, R12, R48, R52, R57, R62, R74, R78, R90, R94, R98, R99 |
| 10 | 100k | Resistor_SMD:R_0603_1608Metric | R34, R36, R38, R40, R42, R44, R46, R65, R68, R108 |
| 9 | 200k | Resistor_SMD:R_0603_1608Metric | R32, R33, R35, R37, R39, R41, R43, R45, R47 |
| 8 | 10µ | Capacitor_SMD:C_0603_1608Metric | C1, C5, C10, C11, C12, C13, C14, C46 |
| 8 | 1µ | Capacitor_SMD:C_0603_1608Metric | C3, C7, C8, C9, C16, C35, C39, C44 |
| 8 | 33n | Capacitor_SMD:C_0603_1608Metric | C23, C27, C30, C31, C32, C33, C37, C42 |
| 8 | BC847BS | Package_TO_SOT_SMD:SOT-363_SC-70-6 | Q4, Q5, Q6, Q7, Q8, Q9, Q11, Q13 |
| 4 | 15k | Resistor_SMD:R_0603_1608Metric | R51, R77, R93, R110 |
| 4 | 470k | Resistor_SMD:R_0603_1608Metric | R70, R71, R72, R96 |
| 4 | M3 | MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 4 | MMBT3904 | Package_TO_SOT_SMD:SOT-23 | Q1, Q3, Q10, Q12 |
| 3 | 22k | Resistor_SMD:R_0603_1608Metric | R89, R105, R107 |
| 3 | 22n | Capacitor_SMD:C_0603_1608Metric | C24, C38, C43 |
| 3 | 33k | Resistor_SMD:R_0603_1608Metric | R53, R59, R97 |
| 3 | 74HC595 | Package_SO:SOIC-16_3.9x9.9mm_P1.27mm | U7, U8, U9 |
| 3 | TL072 | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U2, U10, U11 |
| 2 | 1.5k | Resistor_SMD:R_0603_1608Metric | R5, R60 |
| 2 | 1n | Capacitor_SMD:C_0603_1608Metric | C29, C47 |
| 2 | 2.2k | Resistor_SMD:R_0603_1608Metric | R8, R54 |
| 2 | CD4051B | Package_SO:SOIC-16_3.9x9.9mm_P1.27mm | U5, U6 |
| 2 | GND | Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical | TP1, TP2 |
| 1 | +5V | TestPoint:TestPoint_Pad_D1.0mm | TP4 |
| 1 | 10 | Resistor_SMD:R_0603_1608Metric | R3 |
| 1 | 10n | Capacitor_SMD:C_0603_1608Metric | C25 |
| 1 | 120k | Resistor_SMD:R_0603_1608Metric | R80 |
| 1 | 150k | Resistor_SMD:R_0603_1608Metric | R69 |
| 1 | 1M | Resistor_SMD:R_0603_1608Metric | R100 |
| 1 | 1N4148W | Diode_SMD:D_SOD-123 | D2 |
| 1 | 2.4k | Resistor_SMD:R_0603_1608Metric | R13 |
| 1 | 220 | Resistor_SMD:R_0603_1608Metric | R14 |
| 1 | 2M | Resistor_SMD:R_0603_1608Metric | R101 |
| 1 | 2N7002 | Package_TO_SOT_SMD:SOT-23 | Q2 |
| 1 | 3.3k | Resistor_SMD:R_0603_1608Metric | R4 |
| 1 | 300k | Resistor_SMD:R_0603_1608Metric | R61 |
| 1 | 4.7µ | Capacitor_SMD:C_0603_1608Metric | C40 |
| 1 | 470 | Resistor_SMD:R_0603_1608Metric | R15 |
| 1 | 6.2k | Resistor_SMD:R_0603_1608Metric | R79 |
| 1 | 78L05 | Package_TO_SOT_SMD:SOT-89-3 | U1 |
| 1 | 9.1k | Resistor_SMD:R_0603_1608Metric | R2 |
| 1 | CH32V003F4P6 / CH32V002F4P6 | Package_SO:TSSOP-20_4.4x6.5mm_P0.65mm | U3 |
| 1 | LINE OUT | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J4 |
| 1 | LM324 | Package_SO:SOIC-14_3.9x8.7mm_P1.27mm | U12 |
| 1 | LPF | TestPoint:TestPoint_Pad_D1.0mm | TP15 |
| 1 | LTV-817S | Package_DIP:SMDIP-4_W9.53mm | U4 |
| 1 | MIDI IN | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J3 |
| 1 | NRST | TestPoint:TestPoint_Pad_D1.0mm | TP11 |
| 1 | PWR 9-12V | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J1 |
| 1 | RESOUT | TestPoint:TestPoint_Pad_D1.0mm | TP18 |
| 1 | SAW | TestPoint:TestPoint_Pad_D1.0mm | TP12 |
| 1 | SS14 | Diode_SMD:D_SMA | D1 |
| 1 | SWIO | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J2 |
| 1 | TAIL | TestPoint:TestPoint_Pad_D1.0mm | TP14 |
| 1 | Touch + | TouchSynth:TouchPad_Func | KEY16 |
| 1 | Touch - | TouchSynth:TouchPad_Func | KEY15 |
| 1 | Touch A | TouchSynth:TouchPad_White | KEY10 |
| 1 | Touch A# | TouchSynth:TouchPad_Black | KEY11 |
| 1 | Touch B | TouchSynth:TouchPad_White | KEY12 |
| 1 | Touch C | TouchSynth:TouchPad_White | KEY1 |
| 1 | Touch C# | TouchSynth:TouchPad_Black | KEY2 |
| 1 | Touch C' | TouchSynth:TouchPad_White | KEY13 |
| 1 | Touch D | TouchSynth:TouchPad_White | KEY3 |
| 1 | Touch D# | TouchSynth:TouchPad_Black | KEY4 |
| 1 | Touch E | TouchSynth:TouchPad_White | KEY5 |
| 1 | Touch F | TouchSynth:TouchPad_White | KEY6 |
| 1 | Touch F# | TouchSynth:TouchPad_Black | KEY7 |
| 1 | Touch G | TouchSynth:TouchPad_White | KEY8 |
| 1 | Touch G# | TouchSynth:TouchPad_Black | KEY9 |
| 1 | Touch SHIFT | TouchSynth:TouchPad_Func | KEY14 |
| 1 | V25 | TestPoint:TestPoint_Pad_D1.0mm | TP7 |
| 1 | VB0 | TestPoint:TestPoint_Pad_D1.0mm | TP8 |
| 1 | VB2 | TestPoint:TestPoint_Pad_D1.0mm | TP9 |
| 1 | VB4 | TestPoint:TestPoint_Pad_D1.0mm | TP10 |
| 1 | VBIAS | TestPoint:TestPoint_Pad_D1.0mm | TP6 |
| 1 | VCAOUT | TestPoint:TestPoint_Pad_D1.0mm | TP19 |
| 1 | VP | TestPoint:TestPoint_Pad_D1.0mm | TP3 |
| 1 | VREF | TestPoint:TestPoint_Pad_D1.0mm | TP5 |
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 mm

- 2 layers70 × 100 mm

- 4 layers133.9 × 165.1 mm

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 mm

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 mm

- 4 layers87.6 × 84 mm

Flashover
Cherry-Blossom-Development/GreywireStudio
GreywireStudio - a combined software/hardware product
95 parts - 2 layers56 × 85.4 mm

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 mm

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