# cs-midi A standalone extraction of [tttapa/Control-Surface](https://github.com/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: ```cmake pico set(PICO_BOARD waveshare_rp2350b_plus_w) set(PICO_BOARD_HEADER_DIRS ${CMAKE_SOURCE_DIR}/lib/cs-midi/boards) ``` ## Getting Started ```cpp pico #include "pico/stdlib.h" #include 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: ```cmake pico 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: ```sh cd lib/cs-midi && make tests ``` ## Differences from Control Surface - `#include ` replaces `#include ` - Standard `main()` replaces Arduino `setup()`/`loop()` - All types live in the `cs::` namespace - No `MCU::` namespace yet — use raw CC numbers or `MIDI_CC::` constants - Direct MIDI sending and callbacks available on all interface objects - `MIDI_Callbacks` and `FineGrainedMIDI_Callbacks` for incoming message handling ## Credits Original library: [Control Surface](https://github.com/tttapa/Control-Surface) by **Pieter P (tttapa)** (GPL-3.0). pico-sdk port: [pszsh](https://else-if.org).