Skip to content
PupoffPublic

About

Programmable MIDI Controler pedal

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

6 Commits

Folders and files

Repository files navigation

Solar Noon

Solar Noon MIDI controller

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.

The problem

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.


What it is

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:

1. Plugin mode: just describe your plugin

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.

2. Open mode: write your own behavior

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.


Hardware

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

Built-in screens

Parameter view

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.

Parameter view

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

Effect grid

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.

Effect grid


Info pages

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

Built by hand

Hand-built in Lyon, France. Soldering iron, drill press, multimeter. For now I build these myself and have a few units available.

Build step 1 Build step 2 Build step 3

Documentation

  • 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.

TODO

  • WiFi mode not implemented yet
  • Test on Windows and Mac (developed and tested on Linux only so far)
  • API Doc

About the PCB

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.


License

GPLv3, see LICENSE.

About

Programmable MIDI Controler pedal

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages