Solar Noon is an ESP32-based MIDI controller built around the guitar pedal workflow: a few knobs, a screen that tells you what they do, and navigation between effects rather than a wall of identical controls. It works in two distinct modes: Plugin mode, where you describe your plugin in a config file and the built-in screens handle everything, and Open mode, a fully programmable platform where you write your own display modes and behaviors using a clean C++ API. No code needed for the first; full hardware access for the second.
Guitar amp/effects plugins have a lot of parameters. Most MIDI controllers try to solve this with a big grid of identical knobs or pads: you end up with a wall of controls, no way to tell what anything does without staring at a cheat sheet, and no feedback when the plugin changes a value on its own.
I wanted something that works the way guitar pedals do: you deal with one effect at a time. You see five knobs on screen labeled Gain, Mix, Decay, and so on (whatever that effect actually has). When you're done, you step to the next effect. You never look at forty controls simultaneously. And when your DAW changes a parameter (preset switch, automation), the controller reflects it.
I couldn't find that. So I built it.
Five knobs, three footswitches, a three-way switch, an OLED display, RGB and monochrome LED feedback, USB or Bluetooth MIDI, battery-powered, plus a programming API if you want to go further than the built-in screens.
There are two ways to use it:
Edit one file (effectControls.h), list your effects and their CC numbers, and the built-in screens take over:
// Example: a reverb effect with its CC numbers
effectControls[REVERB][0] = Switch(45, "REVERB"); // on/off
effectControls[REVERB][1] = Knob (46, "Mix");
effectControls[REVERB][2] = Knob (47, "Decay");
effectControls[REVERB][3] = Knob (48, "LowCut");
effectControls[REVERB][4] = Knob (49, "HighCut");That's it. You get (see Built-in screens):
- Parameter view: your five knobs mapped to that effect's parameters, labeled on screen, with LED rings tracking the values. If an effect has more than 5 parameters, they are split across pages; navigate pages within the same effect, then move to the next effect. The number of pages is automatic, derived from how many parameters you declared.
- Effect grid: an at-a-glance overview of every effect section: which are on, which is selected. One press jumps to any of them.
- MIDI feedback: when the plugin changes a parameter (preset change, automation, mouse click), the display and LED rings update automatically. No stale values.
- Soft takeover: switching to a different effect never causes an audible jump. Knobs wait until they physically cross the current value before taking over.
The sections, CC assignments, labels, and per-section colors are all declared in one place and automatically flow into every screen, LED, and MIDI binding. Nothing needs to be hand-wired.
If the built-in screens don't fit your workflow, the firmware is a programmable platform. The API lets you add display modes from scratch: choose what the screen shows, which knobs do what, how the LEDs behave.
// A display mode that reads knob 1, sends CC 90, lights the LED ring
driveKnobToCC(1, 0, 90, lastSent[0]);
// Bind a footswitch to toggle a named parameter
driveSwitchFromControl(PIN_SW_A, swA, effectControls[OTHER][4]);
// Draw anything you want on the OLED (Adafruit GFX API)
display.fillRect(0, 0, 128, 10, SH110X_WHITE);
display.print("MY MODE");
// Set any LED to any color
setRGBledRaw(LED_SWITCH_A, CRGB(255, 100, 0));The effectControls[][] table you filled in above is still the source of truth: your custom mode can read live parameter values and .known state from it, and MIDI feedback updates it automatically regardless of which mode is active.
See GETTING_STARTED.md for a full walkthrough with two complete worked examples.
| Component | Details |
|---|---|
| MCU | ESP32 (USB and BLE MIDI at boot, hardware switch selects) |
| Knobs | 5 analog pots (knob 3 optionally an endless encoder) |
| Footswitches | 3, each with its own RGB LED |
| Three-way switch | Momentary rocker with 3 position-indicator LEDs |
| Display | 128×64 OLED (SH1106G, SPI) |
| LED rings | 16-LED monochrome ring around each knob |
| RGB strip | 24-LED ring around the display + 4 addressable status LEDs |
| Power | Battery (BQ24074 charger), with voltage readout, low-battery warning, and deep sleep |
The main working screen. The five knobs map to the current effect's parameters; the display shows each parameter's label and live value. A footswitch steps through effects (Amp → Delay → Compressor → …), and the RGB LED under that footswitch changes color to match the current effect.
When MIDI feedback arrives, the display and LED rings update in place: you always see the actual plugin state, not just what you last sent.
The parameter view layout is configurable. Three templates are available and can be switched directly from the controller:
| Vertical list | 2+3 grid | Compact 5-column |
|---|---|---|
![]() |
![]() |
![]() |
An overview of all effects at once: which are active, which is selected, navigation to jump straight to any of them in the parameter view.
Accessible at any time from the controller itself, no companion app:
| Page | What it shows |
|---|---|
| Status | Firmware version, battery voltage, MIDI connection state, uptime |
| Bluetooth | Connection mode (USB or BLE) and pairing status |
| Brightness | Per-element brightness for knob rings, RGB LEDs, OLED contrast, and encoder sensitivity, all adjustable and saved to flash |
| Layout | Parameter view layout: vertical list, compact 5-column, or 2+3 grid |
Hand-built in Lyon, France. Soldering iron, drill press, multimeter. For now I build these myself and have a few units available.
![]() |
![]() |
![]() |
- GETTING_STARTED.md: how to customize the firmware. Covers generic tweaks, the API building blocks (knobs, MIDI, LEDs, display modes), and two full worked examples.
- Headers: exact function signatures in
leds_rgb.h,leds_mono.h,midi.h,knobs.h,switches.h,effects.h,display.h.
- WiFi mode not implemented yet
- Test on Windows and Mac (developed and tested on Linux only so far)
- API Doc
I've been using PCBWay for my projects for a while now and the quality has always been solid. For this one I was a bit unsure, because the front panel has detailed artwork that needs to be reproduced perfectly. But the result is stunning for the price, so it definitely works for PCB art.
GPLv3, see LICENSE.








