Skip to the content
4 layers414 × 62 mmEurorack busboard singlerow, the printed circuit board in 3D

Eurorack busboard singlerow

yry-dev/maddie-synths1

My Open Source / Public Eurorack projects

Size
414 × 62 mm
Copper layers
4
Thickness
1.6 mm
Parts
155
Nets
74
Pads
590
Tracks, vias
363, 175
Pours
5
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
27 Mar 2026
Updated
3 Nov 2026

Overview

Eurorack busboard singlerow is an open-source printed circuit board by yry-dev, from the yry-dev/maddie-synths repository on GitHub. It is a 4-layer board of 414 × 62 mm with 155 parts on 74 nets, routed with 363 tracks and 175 vias.

It is built around the SS54, SMBJ13A and AO3401A, with the SMBJ6.0A among its other parts. Its parts include 63 fuses, 43 capacitors, 26 connectors, 9 diodes and 4 resistors. It belongs with the audio and music boards of this library.

Main components

4

README

README.md

Maddie Synths

Licensing

The repo-wide default is MIT (LICENSE.md at the root, © 2026 Madelyn Yeary). Every source file carries a License: notice in its header saying which terms apply to it and where the code came from.

That default is overridden per directory: any directory containing its own LICENSE.md is governed by that file instead, for everything beneath it. The overrides exist because the work there either came from somewhere else or is deliberately released on different terms

Repo layout

text
.
├── firmwares/                  Arduino sketches — grouped by hardware platform
│   ├── hagiwo-mod1/mod1-*/     Arduino Nano modules  (mod1-euclidean.ino, …)
│   ├── hagiwo-mod2/mod2-*/     XIAO RP2350 modules   (mod2-vco.ino, …)
│   ├── hagiwo-30/hagiwo30-*/   HAGIWO #30 sequencer variants (Nano)
│   ├── rabid-audio-clk/        rabid.audio port, bare ATmega328P (Nano FQBN)
│   └── shared/                 repo-local Arduino library root
│       ├── SynthCore/src/      platform-pure DSP cores (*Core.h) shared with VCV
│       ├── Mod1Common/         Nano board helpers (pins, ADC, PWM)
│       ├── Mod2Common/         RP2350 board helpers (audio I/O, panel modes)
│       ├── Hagiwo30Common/     OLED + encoder UI for the #30 platform
│       └── Hagiwo30Sequencers/ sequencer engines for the #30 platform
│
├── rack-plugins/               VCV Rack 2 plugin (slug: maddie-synths)
│
├── panels/                     KiCad faceplate projects, grouped by platform
│   ├── hagiwo-mod1/<module>/   MOD1 faceplates      (blanks/ + house-style plates)
│   ├── hagiwo-mod2/<module>/   MOD2 faceplates
│   └── rabid-audio-clk/        rabid.audio CLK faceplate
├── hardware/                   KiCad PCBs and mechanical parts
│   ├── lib/                    shared KiCad symbol + footprint libraries
│   ├── m-power/                eurorack PSU (has its own CLAUDE.md)
│   ├── eurorack-busboard/      bus board
│   ├── maddie-sequencerV2/     sequencer PCB

Naming is mirrored across layers: firmwares/hagiwo-mod2/mod2-vco/mod2-vco.ino, rack-plugins/src/mod2-vco.cpp, panels/hagiwo-mod2/mod2-vco/, and firmwares/shared/SynthCore/src/VcoCore.h are the same module.

Tooling (macOS/linux + Homebrew)

  • Install tools:
    • brew install arduino-cli python
  • Optional GUI IDE:
    • brew install --cask arduino-ide

Repo-local Arduino CLI config

This repo uses arduino-cli.yaml at the root.

It currently includes RP2040 board index support and works for both:

  • Arduino Nano (official core)
  • Raspberry Pi Pico (Earle Philhower core)

One-time core install

  • Arduino Nano / AVR:
    • arduino-cli core install arduino:avr --config-file ./arduino-cli.yaml
  • Raspberry Pi Pico / RP2040:
    • arduino-cli core install rp2040:rp2040 --config-file ./arduino-cli.yaml

One-time library install

Install external libraries used by the hagiwo30-* sketches (the same set CI installs in .github/workflows/_firmware.yml):

  • arduino-cli lib install "Encoder" "FastGPIO" "Adafruit GFX Library" "Adafruit SSD1306"

Adafruit SSD1306 pulls Adafruit GFX Library and Adafruit BusIO automatically.

MOD2 Braids / Tides (Mutable Instruments port)

mod2-braids and mod2-tides depend on Mutable Instruments DSP code and two helper libraries that are not vendored in this repo. Install them once into your Arduino libraries folder (default ~/Documents/Arduino/libraries).

  1. Library Manager dependencies:

    • arduino-cli lib install "Bounce2" "RPI_PICO_TimerInterrupt"
  2. Mutable Instruments libraries from poetaster/arduinoMI (the modules live in separate submodule repos — clone the three we need over HTTPS straight into the libraries folder):

    • git clone https://github.com/poetaster/STMLIB.git ~/Documents/Arduino/libraries/STMLIB
    • git clone https://github.com/poetaster/BRAIDS.git ~/Documents/Arduino/libraries/BRAIDS
    • git clone https://github.com/poetaster/TIDES.git ~/Documents/Arduino/libraries/TIDES
  3. TIDES packaging fix. The TIDES library ships its sub-sources as .cc files and amalgamates them in src/tides_all.cpp, so arduino-cli compiles them twice and the link fails with multiple definition errors. BRAIDS already uses .inc for the same trick; make TIDES match by renaming its three sub-sources and updating the includes:

    sh
    cd ~/Documents/Arduino/libraries/TIDES/src
    for f in resources poly_slope_generator ramp_extractor; do
      mv "tides2/$f.cc" "tides2/$f.inc"
    done
    sed -i '' -E 's#(tides2/[a-z_]+)\.cc#\1.inc#' tides_all.cpp

PWMAudio.h (used by both) ships with the rp2040:rp2040 core, so no extra install is needed for it. After this, make mod2-braids and make mod2-tides build cleanly.

The same libraries also power the Tiny Tides and Tiny Braids VCV Rack modules (rack-plugins/src/mod2-{tides,braids}.cpp, library bodies compiled once in src/mi-libs.cpp), which are part of the default Rack build. The Rack Makefile finds them via MI_LIB_DIR (default ~/Documents/Arduino/libraries); CI fetches them automatically at the commits pinned in .github/mi-libs.env — to move to newer upstream commits, test locally first, then bump the SHAs there. Building without the libraries stops with a clear #error; to opt out instead, exclude mi-libs.cpp and both module .cpps the usual three-place way (WIP_SOURCES in rack-plugins/Makefile, the modelTinyTides / modelTinyBraids lines in plugin.{hpp,cpp}, and moving their plugin.json entries to wipModules).

Makefile firmware builds

  • Build every firmware into dist/<firmware>/:
    • make
  • Build for a different board target (MOD1_FQBN covers mod1-*/hagiwo30-* and any other ATmega328P sketch such as rabid-audio-*, MOD2_FQBN covers mod2-*):
    • make MOD2_FQBN=rp2040:rp2040:rpipico
  • Build a single firmware target:
    • make mod1-trigger-burst
  • List discovered firmware targets:
    • make list
  • Flash a firmware (discover ports with make board-list):
    • make upload FW=mod1-euclidean PORT=/dev/ttyACM0
  • Remove build output:
    • make clean

The Makefile discovers every sketch folder under firmwares/ that contains a same-named .ino entry file and excludes firmwares/shared/.

Flashing a bare ATmega328P over ISP

make upload drives a serial bootloader, so it needs a board with a USB-serial bridge. The rabid-audio-* ports run on a bare ATmega328P, which has no bootloader to talk to — and on the CLK board no serial either, since its 7-segment lines occupy the whole of PORTD, D0/D1 (RX/TX) included. Those chips are programmed in-circuit through the ICSP header with an ISP programmer:

text
make fuses-rabid-audio-clk     # ONCE per chip — sets the 16 MHz clock fuses
make isp-rabid-audio-clk       # build + flash, as often as you like

Do not skip the fuses- step on a new chip. A factory ATmega328P runs its internal 8 MHz RC divided by 8, so 1 MHz, while the firmware hard-assumes 16 MHz (sc::kClkTimerHz is 16 MHz / 1024). Flash a virgin part and it runs — just 16x slow, with nothing else to point at the cause. fuses- burns low_fuses=0xFF (full-swing external crystal, no CKDIV8) to match the board's 16 MHz crystal.

The programmer defaults to ISP=usbasp. Override it for other hardware; run arduino-cli board details --fqbn arduino:avr:nano --list-programmers for the valid ids, and note that arduinoasisp also wants a PORT=:

text
make isp-rabid-audio-clk ISP=usbtinyisp
make isp-rabid-audio-clk ISP=arduinoasisp PORT=/dev/cu.usbmodemXXXX

If the programmer can't see the chip, its SCK is probably too fast for a virgin 1 MHz part — the ISP clock has to stay under a quarter of the target's. On a USBasp, close the slow-SCK jumper (JP3) and run fuses- again; once the crystal fuses are set the part is at 16 MHz and the jumper can come off. make isp-help repeats all of this at the terminal.

VCV Rack plugin builds

The same root Makefile also drives the VCV Rack plugin in rack-plugins/ (which shares the platform-agnostic voice cores in firmwares/shared/SynthCore):

  • Build the plugin:
    • make rack
  • Build + install into Rack's user plugins folder:
    • make rack-install
  • Package a distributable .vcvplugin:
    • make rack-dist
  • Remove the plugin build output:
    • make rack-clean
  • Build everything (all firmwares + the plugin):
    • make everything
  • Build against a non-vendored Rack SDK:
    • make rack RACK_DIR=~/Rack-SDK

The plugin manifest is the canonical plugin.json at the repo root; the rack-plugins/ Makefile syncs a build-time copy into its own folder (which the Rack SDK requires) so the manifest lives in exactly one place. See rack-plugins/README.md and rack-plugins/PORTING.md for details.

CI and releases

.github/workflows/ci.yml runs on every push and pull request and builds only what changed: the Rack plugin when rack-plugins/**, plugin.json, or firmwares/shared/SynthCore/** is touched, and each firmware whose sketch changed (all of them when anything under firmwares/shared/ changes). The actual builds live in two reusable workflows:

  • _rack.yml — make rack-dist against a freshly downloaded Rack SDK for Linux, macOS (x64 + arm64), and Windows.
  • _firmware.yml — arduino-cli builds grouped by board (.hex for AVR, .uf2 for RP2040). Individual compile failures are tolerated and skipped, mirroring make dist — the repo intentionally carries some WIP sketches that don't compile in a clean checkout (license-gated sample.h, un-vendored Mutable libraries).

release.yml runs on release tags, builds every Rack platform and every firmware, and publishes a GitHub release whose assets are one .vcvplugin per platform plus one flashable binary per firmware. Push a tag to trigger it:

  • vYYMM.DD → dated release (e.g. v2608.15)
  • vYYMM.DD-next → pre-release / nightly (version stamped with the commit)

Use scripts/release-tag.fish to cut one from today's date rather than typing the tag by hand.

The workflow derives the plugin version from the tag, so the tag is the single source of truth for a release's version. The date lands in the MINOR.REVISION half only — the MAJOR stays 2 because VCV reads it as the Rack generation the plugin was built for, not as our release number, so v2608.15 publishes plugin version 2.2608.15. Stable (non pre-release) tags also force-move a rolling latest tag to the same commit with the same assets, so download URLs like .../releases/download/latest/mod2-vco.uf2 always resolve to the newest stable build. A manual workflow_dispatch run builds everything without publishing, for testing.

Parts

155
QtyValueFootprintReferences
411.1A PTCeurorack_bus:ER_PTC_1812F1, F2, F10, F11, F13, F14, F16, F17, F19, F20, F22, F23, F25, F26, F28, F29 +25
40100neurorack_bus:ER_Chip_0805C1, C2, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23 +24
200R5 PTCeurorack_bus:ER_Chip_1206F3, F12, F15, F18, F21, F24, F27, F30, F33, F36, F39, F42, F45, F48, F51, F54 +4
20BUSeurorack_bus:ER_BusHeader_2x08_ShroudedJ1, J2, J3, J4, J5, J10, J11, J12, J13, J14, J15, J16, J17, J18, J19, J20 +4
9M3eurorack_bus:ER_MountingHole_M3H1, H2, H3, H4, H5, H6, H7, H8, H9
3220u/25Veurorack_bus:ER_CP_Radial_D8_P3.5C41, C42, C43
3SS54eurorack_bus:ER_Diode_SMCD1, D2, D3
22.6A PTCeurorack_bus:ER_PTC_1812F61, F62
23k9eurorack_bus:ER_Chip_0805R2, R3
2PWR INeurorack_bus:ER_MiniFitJr_2x03_RAJ21, J22
2SMBJ13Aeurorack_bus:ER_Diode_SMBD4, D5
1100keurorack_bus:ER_Chip_0805R1
11keurorack_bus:ER_Chip_0805R4
1AO3401Aeurorack_bus:ER_SOT23Q1
1GNDeurorack_bus:ER_WirePad_2.2mmJ24
1IN_N12eurorack_bus:ER_WirePad_2.2mmJ23
1IN_P12eurorack_bus:ER_WirePad_2.2mmJ25
1IN_P5eurorack_bus:ER_WirePad_2.2mmJ26
1LED_GRNeurorack_bus:ER_LED_0805D8
1LED_REDeurorack_bus:ER_LED_0805D7
1LED_YELeurorack_bus:ER_LED_0805D9
1SMBJ6.0Aeurorack_bus:ER_Diode_SMBD6

More from yry-dev/maddie-synths

6
  • 2 layers92.9 × 125.4 mmPico tracker, the printed circuit board in 3D

    Pico tracker

    yry-dev/maddie-synths

    My Open Source / Public Eurorack projects

    43 parts1
  • 2 layers24.5 × 25 mmEs8388-breakout, the printed circuit board in 3D

    Es8388-breakout

    yry-dev/maddie-synths

    My Open Source / Public Eurorack projects

    36 parts1
  • 2 layers38.1 × 95.9 mmSequencer front pcb, the printed circuit board in 3D

    Sequencer front pcb

    yry-dev/maddie-synths

    My Open Source / Public Eurorack projects

    34 parts1
  • 2 layers92.9 × 125.4 mmPico tracker, the printed circuit board in 3D

    Pico tracker

    yry-dev/maddie-synths

    My Open Source / Public Eurorack projects

    30 parts1
  • 2 layers19.8 × 110 mmEurorack psu twobrick, the printed circuit board in 3D

    Eurorack psu twobrick

    yry-dev/maddie-synths

    My Open Source / Public Eurorack projects

    23 parts1
  • 2 layers38.1 × 65.4 mmSequencer back pcb, the printed circuit board in 3D

    Sequencer back pcb

    yry-dev/maddie-synths

    My Open Source / Public Eurorack projects

    14 parts1

Similar boards

  • 4 layers160 × 80 mmAmos, the printed circuit board in 3D

    Amos

    des256/pcbs

    Making electronics as well

    401 parts
  • 4 layers195 × 58 mmEzo pmp controller, the printed circuit board in 3D

    Ezo pmp controller

    dephekt/dosing-pump-hardware

    Open schematics and design files for a computer controlled nutrient dosing system

    83 partsCERN-OHL-S-2.0
  • 4 layers195.5 × 114.3 mmOpenNAS, the printed circuit board in 3D

    OpenNAS

    mquerostudio/OpenNAS

    107 parts
  • 2 layers81 × 78 mmFan controller, the printed circuit board in 3D

    Fan controller

    rmskkn/fanny

    USB 4ch PC fan controller

    97 parts
  • 4 layers100 × 100 mmSTM32 ESC HW, the printed circuit board in 3D

    STM32 ESC HW

    cej830/STM32_BLDC_ESC_Firmware

    STM32_BLDC_ESC_Firmware

    162 parts
  • 4 layers100 × 70 mmTuner, the printed circuit board in 3D

    Tuner

    k8tar/screwdriver-antenna-auto-tuner

    An open source Screwdriver Antenna Auto Tuner

    60 partsMIT
  • 2 layers84.5 × 43.8 mmControl v1.5, the printed circuit board in 3D

    Control v1.5

    miketrombley/Sole-Pod

    All things sole.

    50 parts

Questions

How big is the Eurorack busboard singlerow PCB?

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

What parts does the Eurorack busboard singlerow use?

155 parts, built around the SS54, SMBJ13A, AO3401A and SMBJ6.0A. 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 Eurorack busboard singlerow KiCad files?

From the yry-dev/maddie-synths repository on GitHub, at the commit this page was made from: the board is hardware/eurorack-busboard/eurorack-busboard-singlerow.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the Eurorack busboard singlerow design in my own project?

Its repository states no licence, so its author keeps all rights: ask yry-dev before reusing the design.