2.9 KiB
cs-midi
A standalone extraction of tttapa/Control-Surface (GPL-3.0) for embedded platforms.
cs-midi provides the full Control Surface MIDI element system — output elements, input elements, banks, selectors, MIDI routing, and the declarative Control_Surface singleton.
Supported platforms:
| Platform | Transport | Status |
|---|---|---|
| RP2xxx (pico-sdk) | BLE, USB, Serial, AppleMIDI | Stable |
| ESP32-S3 | BLE, USB, Serial | Planned |
| ESP32-C3 | BLE, Serial | Planned |
Use the Platform dropdown in the sidebar to view examples for your target device.
RP2xxx Radio Module Note
The RP2xxx BLE transport uses BTstack with the CYW43 radio (Infineon RM2 module). While other CYW43-based radio modules may work, only the RM2 has been tested and has its driver fully implemented.
A pico-sdk board file for the Waveshare RP2350B Plus W (RM2-equipped) is provided at boards/waveshare_rp2350b_plus_w.h. To use it, set PICO_BOARD_HEADER_DIRS in your CMake config:
set(PICO_BOARD waveshare_rp2350b_plus_w)
set(PICO_BOARD_HEADER_DIRS ${CMAKE_SOURCE_DIR}/lib/cs-midi/boards)
Getting Started
#include "pico/stdlib.h"
#include <cs_midi.h>
using namespace cs;
BluetoothMIDI_Interface midi;
NoteButton button {5, {MIDI_Notes::C[4], Channel_1}};
int main() {
stdio_init_all();
Control_Surface.begin();
while (true) {
Control_Surface.loop();
sleep_ms(1);
}
}
Build
cs-midi is a static library meant to be included in a pico-sdk project:
add_subdirectory(lib/cs-midi)
target_link_libraries(your_target cs_midi)
CMake options (set before add_subdirectory()):
| Option | Default | Description |
|---|---|---|
CS_MIDI_BLE |
ON | BLE MIDI via BTstack |
CS_MIDI_USB |
OFF | USB MIDI via TinyUSB |
CS_MIDI_SERIAL |
OFF | Serial MIDI over UART |
CS_MIDI_APPLEMIDI |
OFF | AppleMIDI (RTP-MIDI over WiFi) |
CS_MIDI_HID_KEYBOARD |
OFF | HID keyboard + Battery Service for BLE auto-reconnect |
USB MIDI requires tusb_config.h and usb_descriptors.c in your project — see templates/ for reference files.
To compile-verify all examples standalone:
cd lib/cs-midi && make tests
Differences from Control Surface
#include <cs_midi.h>replaces#include <Control_Surface.h>- Standard
main()replaces Arduinosetup()/loop() - All types live in the
cs::namespace - No
MCU::namespace yet — use raw CC numbers orMIDI_CC::constants - Direct MIDI sending and callbacks available on all interface objects
MIDI_CallbacksandFineGrainedMIDI_Callbacks<T>for incoming message handling
Credits
Original library: Control Surface by Pieter P (tttapa) (GPL-3.0). pico-sdk port: pszsh.