Control Surface master
MIDI Control Surface library for Arduino


This example demonstrates the use of addressable LEDs that respond to incoming MIDI note events. This example uses a custom color mapper to get a rainbow effect across the LED strip.

AVR, AVR USB, Due, Nano 33 IoT, Teensy 3.x, ESP32
You might lose incoming MIDI data while the LED strip is being updated. To avoid this, don't use an Arduino UNO.



If a MIDI Note On event for note 0x3C (C4 or middle C) is sent, the first LED will light up, if a Note Off event for that note is sent, the LED will turn off.
If a MIDI Note On event for note 0x3D (C#4) is sent, the second LED will light up, etc.
(A Note On event with a velocity of zero also counts as a Note Off event.)


Route the MIDI output of a MIDI keyboard to the Arduino's MIDI input. Then play a middle C and some notes above it on the keyboard.

Written by PieterP, 2019-10-15

#include <FastLED.h>
// Must be before Control Surface to enable FastLED features of Control Surface
// Define the array of leds.
Array<CRGB, 8> leds {};
// The data pin with the strip connected.
constexpr uint8_t ledpin = 2;
// Create a functor that maps the velocity and the index of a note to a color.
struct RainbowColorMapper {
CHSV operator()(uint8_t velocity, uint8_t index) const {
return CHSV(255 * index / leds.length, 255, 255u * velocity / 127u);
NoteRangeFastLED<leds.length, RainbowColorMapper> midiled {
void setup() {
// See FastLED examples and documentation for more information.
FastLED.addLeds<NEOPIXEL, ledpin>(, leds.length);
void loop() {
if (midiled.getDirty()) { // If the colors changed; // Update the LEDs with the new colors
midiled.clearDirty(); // Clear the dirty flag
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.
Generic base class for classes that listen for MIDI Note, Control Change and Key Pressure events on a...
A class for MIDI interfaces sending MIDI messages over a USB MIDI connection.
constexpr Note C
C (Do)
Definition: Notes.hpp:40