Control Surface main
MIDI Control Surface library for Arduino


This is an example that demonstrates the use of MIDI Program Changers.

AVR, AVR USB, Nano Every, Due, Nano 33 IoT, Nano 33 BLE, Pi Pico, Teensy 3.x, ESP32, ESP8266


The internal pull-up resistor for the buttons will be enabled automatically.


Written by PieterP, 2019-08-07

#include <Control_Surface.h> // Include the Control Surface library
// Instantiate a MIDI over USB interface
// Instantiate a program changer with 3 programs
ProgramChanger<3> programChanger {
MIDI_PC::Acoustic_Grand_Piano, // list of programs
CHANNEL_1, // MIDI channel to use
// Instantiate a selector that reads three buttons and controls the program
// changer
ManyButtonsSelector<3> programSelector {
{{2, 3, 4}},
// The library comes with many different Selectors, like rotary encoders,
// push buttons that increment or decrement the setting, versions with LEDs
// to display the current setting, etc.
void setup() {
Control_Surface.begin(); // Initialize Control Surface
void loop() {
Control_Surface.loop(); // Update the Control Surface
constexpr Channel CHANNEL_1
Definition: Channel.hpp:118
The main header file that includes all Control-Surface header files.
Control_Surface_ & Control_Surface
A predefined instance of the Control Surface to use in the Arduino sketches.
void begin()
Initialize the Control_Surface.
void loop()
Update all MIDI elements, send MIDI events and read MIDI input.
Selector that reads from buttons.
A class for MIDI interfaces sending MIDI messages over a USB MIDI connection.
constexpr uint8_t Electric_Bass_Pick
constexpr uint8_t Rock_Organ
constexpr uint8_t Acoustic_Grand_Piano