
Daylight Matchstick
VoronDesign/Voron-Hardware
Cool Hardware designed by the Voron Design group

Wireless MIDI interface firmware for ESP32-C6/S3: TRS MIDI to BLE MIDI, Network MIDI 2.0, RTP-MIDI, USB MIDI and ESP-NOW. MIDI-CI builds the web UI's controls from the synth; signed OTA updates with rollback. C11 core with host tests, hardware-in-the-loop tests.
Midi receiver is an open-source printed circuit board by TTeuber, from the TTeuber/AirMidi repository on GitHub, published under the MIT licence. It is a 2-layer board of 72 × 46 mm with 22 parts on 35 nets, routed with 119 tracks and 1 via.
Its parts include 7 resistors, 4 ICs, 3 connectors, 2 diodes and 2 switches. It belongs with the audio and music and radio and wireless boards and the ESP32 and RISC-V boards of this library.
A battery-powered wireless MIDI interface: it gives any TRS MIDI device (or DIN, with an adapter) Bluetooth and Wi-Fi, is set up from a browser or a phone, and updates itself over the air. This repo is its firmware, for an ESP32-C6 or ESP32-S3 on a custom PCB in a 3D-printed box, and the apps that play it: one for Android phones and one for the Mac, which sequences hardware synths through the box.

lib/, no ESP-IDF headers) with 17 suites of host tests under AddressSanitizer and
UndefinedBehaviorSanitizer, including property tests (the journal through 30-50% packet loss).
The receiver PCB: a Seeed XIAO ESP32-C6 (or ESP32-S3) on headers, MIDI out through a TRS Type A jack, MIDI in through a 6N138 optocoupler, a Li-ion cell with a TP4057 USB-C charger and a TPS63020 buck-boost to 3.3 V, a power switch, a button and an LED. An ESP32-S3-DevKitC-1 serves as the second box for USB MIDI and the ESP-NOW link. The board layer (board-and-settings.md) is the only code that names a GPIO.
hardware/ has the schematic, the KiCad project, Gerbers, BOM and the printable enclosure, with the board's revision history: the photo shows rev A, and rev B fixes what its bring-up found.
<name>.local), Setup (its own
access point). A long press switches mode, an 8 s press opens Setup, a double press sends all notes off.http://<name>.local: live traffic per port, battery, signal, settings, Wi-Fi networks, firmware
updates. Plain JS, no framework, 18 KB, built into the firmware._midi2._udp): macOS connects to it natively. FEC, retransmit and in-order
delivery over Wi-Fi: 0 of 600 lost at 5 ms spacing, 6.7 ms median Mac -> TRS, 4.2 ms back._apple-midi._udp) for clients without Network MIDI 2.0: lost packets repaired from the
recovery journal, sessions taken back after the box restarts. With macOS's driver: 0 of 600 lost each way at 5 ms
spacing, 7.3 / 5.5 ms median.

One Flutter project (app/) builds two apps over shared code: the box pages, the BLE and Wi-Fi links, and the synth page drawn from the synth's MIDI-CI control list.
Phone (Android; plan and decisions):
Desktop (macOS now, Windows and Linux later; plan, DAW design):
app/packages/midi_engine), a router between them, and the
box's play view: the synth's controls over the keys.


test/): the portable core under ASan + UBSan, with randomized round trips and property tests.app/test, flutter test): the strips, MPE and BLE MIDI packing, the router, and the DAW (editing,
timing, files, recording, the player against a fake MIDI engine)..github/workflows/ci.yml): host tests, the clang-format check, and the firmware for all three boards on
every push. tools/check.sh runs the same steps locally. Tagging vX.Y.Z builds, signs and publishes a release.tools/hil/): Python and Swift tools on the Mac drive the box and an Arturia AudioFuse
wired to its jacks. Their first runs found real bugs; each one is written up in docs/design.| Test | Checks |
|---|---|
bridge_test.py | TRS <-> BLE both ways: notes, CCs on all 16 channels, clock, long SysEx, bursts, two sources merged (15) |
ota_test.py, release_test.py, ble_ota_test.py | unsigned, corrupted and wrongly signed images refused; good ones installed over Wi-Fi, from a release and over BLE; rollback after a failed self-test or a crash (13, 8, 9) |
web_test.py, ws_test.py | the web API, and MIDI between the page and the jacks over WebSocket (14) |
ci_test.py, mac_ci_test.py | MIDI-CI against a stand-in synth on the Mac, and macOS's own MIDI-CI through the box (21, 12) |
resume_test.py, rtp_test.py | Network MIDI 2.0 and RTP-MIDI against macOS's drivers: loss, latency, box restarts (14, 13) |
central_test.py | the box as BLE central against a BLE MIDI stand-in on the Mac (14) |
usb_test.py, espnow_test.py | USB MIDI against BLE, and two boxes linked over ESP-NOW (9) |
latency.py, sleep_test.py | one-way latency per path, MIDI through each power mode |
One note per module, with the reasoning, the alternatives considered and what the hardware tests found:
app/): plan, phases and its decision loglib/ portable C11 core, no ESP-IDF headers docs/design/ one note per module
test/ host unit tests for lib/ (Unity) tools/hil/ hardware-in-the-loop tools for the Mac
firmware/ ESP-IDF project (C6 and S3) spikes/ early experiments, results in the plan
web/ the web UI (HTML/CSS/JS, gzipped into the firmware)
devices/ MIDI-CI device side: the Mac stand-in (CoreMIDI) and daisy_synth, the demo synth
hardware/ the receiver PCB and enclosure: schematic, KiCad project, Gerbers, BOM, STL
app/ Flutter: the Android app, the macOS app with the DAW, and the code they sharetools/check.sh # what CI runs: host tests, clang-format check, firmware for every board
firmware/build.sh c6 flash # build and flash the C6 board (s3 for the XIAO S3, s3kit for an S3 dev kit)
cd app && flutter test # the apps' tests
flutter build apk --release # the Android app (flutter build macos --release for the Mac)Needs ESP-IDF v5.5.5 or later in the v5.5 series (IDF_PATH, default ~/Developer/esp-idf), CMake, and uv (for
the pinned clang-format and the Python test tools). Each release has
the update image per board and a zip for a first install over USB (esptool.py write_flash @flash_args).
The firmware, software and documentation are MIT (LICENSE); the hardware in hardware/ is
CERN-OHL-P-2.0 (hardware/LICENSE), the permissive open hardware licence. Two bundled third-party
parts keep their own licenses: the Unity test framework in test/unity/ (MIT,
test/unity/LICENSE.txt) and the Geist font in web/ (SIL Open Font License 1.1,
web/OFL-Geist.txt).
| Qty | Value | Footprint | References |
|---|---|---|---|
| 4 | M3 | MountingHole:MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 2 | 100k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R1, R2 |
| 2 | 1k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R5, R7 |
| 1 | 10R | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R3 |
| 1 | 1N4148 | Diode_THT:D_DO-35_SOD27_P7.62mm_Horizontal | D1 |
| 1 | 220R | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R6 |
| 1 | 33R | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R4 |
| 1 | 6N138 | Package_DIP:DIP-8_W7.62mm_Socket | U4 |
| 1 | BAT JST-PH | Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal | J1 |
| 1 | MIDI IN | lcsc:AUDIO-TH_PJ307C | J3 |
| 1 | MIDI OUT | lcsc:AUDIO-TH_PJ307C | J2 |
| 1 | POWER | lcsc:SW-TH_3P-P4.80_HX-SS12D10G6-WJ | SW1 |
| 1 | STATUS | LED_THT:LED_D3.0mm | LED1 |
| 1 | TP4057 charger | measured:TP4057_Module | U2 |
| 1 | TPS63020 3V3 | measured:TPS63020_Module | U3 |
| 1 | USER | Button_Switch_THT:SW_PUSH_6mm_H13mm | SW2 |
| 1 | XIAO ESP32S3 | measured:XIAO_ESP32S3 | U1 |
It measures 72 × 46 mm and has 2 copper layers, 1.6 mm thick.
22 parts. 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.
From the TTeuber/AirMidi repository on GitHub, at the commit this page was made from: the board is hardware/pcb/kicad/midi_receiver.kicad_pcb and its schematic hardware/pcb/kicad/midi_receiver.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
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).

VoronDesign/Voron-Hardware
Cool Hardware designed by the Voron Design group

hoglet67/RGBtoHDMI
Bare-metal Raspberry Pi project that provides pixel-perfect sampling of Retro Computer RGB/YUV video and conversion to HDMI

hackclub/OnBoard
💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

abhishek-kakkar/BeagleLogic
A Software Suite that implements a logic analyzer with the PRU on the BeagleBone / BeagleBone Black.

Chrismettal/flipper-zero-backpacks
Backpack-style addon boards for the Flipper Zero!



CRImier/MyKiCad
My KiCad boards. Can't be bothered uploading individually anymore, so here you go.