{"id":25629168,"url":"https://github.com/tttapa/Control-Surface","last_synced_at":"2026-06-10T09:30:24.183Z","repository":{"id":39969709,"uuid":"102390805","full_name":"tttapa/Control-Surface","owner":"tttapa","description":"Arduino library for creating MIDI controllers and other MIDI devices.","archived":false,"fork":false,"pushed_at":"2024-12-21T21:29:06.000Z","size":108198,"stargazers_count":1332,"open_issues_count":244,"forks_count":145,"subscribers_count":62,"default_branch":"main","last_synced_at":"2025-02-21T09:05:58.964Z","etag":null,"topics":["arduino","arduino-library","ble-midi","control-surface","esp32","midi","midi-controller","midi-over-usb","raspberry-pi-pico","teensy","usb-midi"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tttapa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-09-04T18:31:49.000Z","updated_at":"2025-02-21T00:24:08.000Z","dependencies_parsed_at":"2023-12-24T20:21:45.897Z","dependency_job_id":"fc314ebd-36c6-404c-9ca3-4b6d4cf03d7c","html_url":"https://github.com/tttapa/Control-Surface","commit_stats":{"total_commits":1759,"total_committers":3,"mean_commits":586.3333333333334,"dds":0.006822057987492913,"last_synced_commit":"748fad2dfb0f810287b1a7fd2cbc51d330506be7"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tttapa%2FControl-Surface","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tttapa%2FControl-Surface/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tttapa%2FControl-Surface/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tttapa%2FControl-Surface/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tttapa","download_url":"https://codeload.github.com/tttapa/Control-Surface/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240222477,"owners_count":19767460,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arduino","arduino-library","ble-midi","control-surface","esp32","midi","midi-controller","midi-over-usb","raspberry-pi-pico","teensy","usb-midi"],"created_at":"2025-02-22T19:17:04.661Z","updated_at":"2026-06-10T09:30:22.009Z","avatar_url":"https://github.com/tttapa.png","language":"C++","funding_links":[],"categories":["C++","硬件_其他"],"sub_categories":["资源传输下载"],"readme":"[![CI Tests](https://github.com/tttapa/Control-Surface/actions/workflows/ccpp.yml/badge.svg)](https://github.com/tttapa/Control-Surface/actions/workflows/ccpp.yml)\n[![Test Coverage](https://img.shields.io/endpoint?url=https://tttapa.github.io/Control-Surface-doc/Coverage/shield.io.coverage.json)](https://tttapa.github.io/Control-Surface-doc/Coverage/index.html)\n[![Examples](https://github.com/tttapa/Control-Surface/actions/workflows/examples.yaml/badge.svg)](https://github.com/tttapa/Control-Surface/actions/workflows/examples.yaml)\n[![GitHub](https://img.shields.io/github/stars/tttapa/Control-Surface?label=GitHub\u0026logo=github)](https://github.com/tttapa/Control-Surface)\n[![Documentation](https://img.shields.io/badge/Documentation-main-blue)](https://tttapa.github.io/Control-Surface-doc/Doxygen)\n\n# Control Surface\n\nControl Surface is an Arduino library for building MIDI controllers and control\nsurfaces.\n\nAt its core, the library features a flexible [**MIDI abstraction layer**](https://tttapa.github.io/Control-Surface-doc/Doxygen/d3/df7/midi-tutorial.html)\nwith support for serial **5-pin DIN** MIDI, MIDI over **USB**, MIDI over **BLE**, etc.\nThese MIDI interfaces are compatible with a wide range of Arduino boards\n(a full table can be found [here](https://tttapa.github.io/Control-Surface-doc/Doxygen/d8/d4a/md_pages_MIDI-over-USB.html))\nand are useful in any Arduino MIDI project.\n\nIn addition to MIDI input/output, Control Surface also provides easy-to-use utilities\nintended for building MIDI controllers, supporting controls that send MIDI messages\n─ like potentiometers, push buttons, rotary encoders, etc. ─\nand controls that react to incoming MIDI messages ─ LEDs, displays, and so on.\nMore advanced controls that combine MIDI input and output ─\nsuch as [motorized faders](https://github.com/tttapa/Control-Surface-Motor-Fader)\n─ are supported as well.\n\nIn projects with large numbers of inputs and outputs, Control Surface allows you\nto seamlessly add multiplexers, shift registers and other port expanders, and\ntreat them as if they were ordinary GPIO pins.\n\n\u003e Table of contents  \n\u003e \u003cspan class=\"mono\"\u003e¶\u003c/span\u003e\u0026emsp;[Example usage](#example-usage)  \n\u003e \u003cspan class=\"mono\"\u003e¶\u003c/span\u003e\u0026emsp;[Getting started](#getting-started)  \n\u003e \u003cspan class=\"mono\"\u003e¶\u003c/span\u003e\u0026emsp;[Documentation](#documentation)  \n\u003e \u003cspan class=\"mono\"\u003e¶\u003c/span\u003e\u0026emsp;[Feature overview](#feature-overview)  \n\u003e \u003cspan class=\"mono\"\u003e¶\u003c/span\u003e\u0026emsp;[Supported boards](#supported-boards)  \n\u003e \u003cspan class=\"mono\"\u003e¶\u003c/span\u003e\u0026emsp;[Change log and updating](#change-log-and-updating)  \n\n## Example usage\n\nAn extensive list of examples can be found [in the documentation](https://tttapa.github.io/Control-Surface-doc/Doxygen/d4/de9/examples.html).\nBelow are a handful of simple examples that give an idea of how the Control\nSurface library can be used.\n\n**Example 1**: A complete sketch for a MIDI controller with a potentiometer that sends out MIDI\nControl Change message can be written in just five lines of code:\n\n```cpp\n#include \u003cControl_Surface.h\u003e\n\nUSBMIDI_Interface midi;\nCCPotentiometer pot { A0, MIDI_CC::General_Purpose_Controller_1 };\n\nvoid setup() { Control_Surface.begin(); }\nvoid loop() { Control_Surface.loop(); }\n```\n\n**Example 2**: Larger MIDI controllers can be implemented very easily as well, with clean and\neasy to modify code.\nThe following sketch is for 8 potentiometers (connected using an analog\nmultiplexer) that send out MIDI Control Change messages over USB. A detailed\nwalkthrough of this example can be found on the [Getting Started](https://tttapa.github.io/Control-Surface-doc/Doxygen/d5/d7d/md_pages_Getting-Started.html) page.\n\n```cpp\n#include \u003cControl_Surface.h\u003e  // Include the library\n \nUSBMIDI_Interface midi;  // Instantiate a MIDI Interface to use\n \n// Instantiate an analog multiplexer\nCD74HC4051 mux {\n  A0,       // Analog input pin\n  {3, 4, 5} // Address pins S0, S1, S2\n};\n \n// Create an array of CCPotentiometer objects that send out MIDI Control Change \n// messages when you turn the potentiometers connected to the 8 inputs of the mux.\nCCPotentiometer volumePotentiometers[] {\n  { mux.pin(0), { MIDI_CC::Channel_Volume, Channel_1 } },\n  { mux.pin(1), { MIDI_CC::Channel_Volume, Channel_2 } },\n  { mux.pin(2), { MIDI_CC::Channel_Volume, Channel_3 } },\n  { mux.pin(3), { MIDI_CC::Channel_Volume, Channel_4 } },\n  { mux.pin(4), { MIDI_CC::Channel_Volume, Channel_5 } },\n  { mux.pin(5), { MIDI_CC::Channel_Volume, Channel_6 } },\n  { mux.pin(6), { MIDI_CC::Channel_Volume, Channel_7 } },\n  { mux.pin(7), { MIDI_CC::Channel_Volume, Channel_8 } },\n};\n \nvoid setup() {\n  Control_Surface.begin();  // Initialize the Control Surface\n}\n\nvoid loop() {\n  Control_Surface.loop();  // Update the Control Surface\n}\n```\n\n**Example 3**: Control Surface also supports many types of MIDI inputs. \nFor example, an LED that turns on when a MIDI Note On message for middle C is\nreceived:\n```cpp\n#include \u003cControl_Surface.h\u003e\n\nUSBMIDI_Interface midi;\nNoteLED led { LED_BUILTIN, MIDI_Notes::C[4] };\n\nvoid setup() { Control_Surface.begin(); }\nvoid loop() { Control_Surface.loop(); }\n```\n\n**Example 4**: Control Surface's MIDI interfaces can also be used directly, for example, to\nimplement a MIDI-over-USB to MIDI-over-BLE adapter:\n```cpp\n#include \u003cControl_Surface.h\u003e\n\n// Instantiate MIDI over BLE and MIDI over USB interfaces\nBluetoothMIDI_Interface midi_ble;\nUSBMIDI_Interface midi_usb;\n// Pipes allow routing between MIDI interfaces\nBidirectionalMIDI_Pipe pipes;\n\nvoid setup() {\n  // Route the MIDI input from the USB interface to the BLE interface,\n  // and the MIDI input from the BLE interface to the USB interface\n  midi_usb | pipes | midi_ble;\n  // Initialize the MIDI interfaces\n  MIDI_Interface::beginAll();\n}\n\nvoid loop() {\n  // Continuously poll all interfaces and route the traffic between them\n  MIDI_Interface::updateAll();\n}\n```\n\n## Getting started\n\nSee the [**Getting Started**](https://tttapa.github.io/Control-Surface-doc/Doxygen/d5/d7d/md_pages_Getting-Started.html)\npage to get started using the library.  \nIt'll also point you to the [**Installation Instructions**](https://tttapa.github.io/Control-Surface-doc/Doxygen/d8/da8/md_pages_Installation.html).\n\nThe [**MIDI tutorial**](https://tttapa.github.io/Control-Surface-doc/Doxygen/d3/df7/midi-tutorial.html)\nmight be useful if you want to use Control Surface as a regular MIDI library,\nfor sending and receiving MIDI messages.\n\n## Documentation\n\nDetailed documentation for this library can be found here:  \n[**Documentation**](https://tttapa.github.io/Control-Surface-doc/Doxygen/index.html)  \nArduino examples can be found here:  \n[**Examples**](https://tttapa.github.io/Control-Surface-doc/Doxygen/d4/de9/examples.html)\n\nThe [**User Manual**](https://tttapa.github.io/Control-Surface-doc/Doxygen/d3/da5/manual.html)\nis the best entry point to the documentation. To get a complete overview of all\nfeatures of the Control Surface library, have a look at the following section\nand at the\n[**Topics**](https://tttapa.github.io/Control-Surface-doc/Doxygen/topics.html) page.\n\nYou can find an answer to some frequently asked questions on the \n[**FAQ**](https://tttapa.github.io/Control-Surface-doc/Doxygen/da/dc1/FAQ.html) page.\n\n## Feature overview\n\nThis library turns your Arduino-compatible board into a MIDI control surface.  \nJust connect some push buttons, potentiometers, LEDs ... and declare them in\nyour code.\n\nThe following sections give a brief overview of the features of the library.\n\n### MIDI Interfaces\n\n - **MIDI over USB**\n - **Serial MIDI** (e.g. 5-pin DIN MIDI)\n - **Debug MIDI** (prints out the messages in a readable format, and allows you\n                   to input text based messages, like a MIDI monitor)\n - **MIDI over Bluetooth LE**\n - **AppleMIDI** over WiFi or Ethernet\n\n\u003csub\u003e→ [_MIDI Interfaces documentation_](https://tttapa.github.io/Control-Surface-doc/Doxygen/dc/df0/group__MIDIInterfaces.html)\u003c/sub\u003e\n\n### MIDI Control Output\n\n - **Push buttons** and **toggle switches**\n - **Potentiometers**, **faders** and other analog sensors\n - **Rotary encoders**\n - **Scanning keyboard matrices**\n\nDigital inputs are **debounced**, and analog inputs are filtered using \n**digital filters and hysteresis**. This results in high accuracy without noise,\nwithout introducing latency.\n\nThese MIDI control outputs can be used to send MIDI notes, Control Change,\nPitch Bend, Program/Patch change, etc.\n\n\u003csub\u003e→ [_MIDI Output Elements documentation_](https://tttapa.github.io/Control-Surface-doc/Doxygen/d7/dcd/group__MIDIOutputElements.html)\u003c/sub\u003e\n\n### MIDI Control Input\n\n - **LEDs** (e.g. to indicate whether a track is muted/armed/soloed)\n - **LED rings** (e.g. to indicate the position of a pan knob)\n - **LED strips** (using the [FastLED](https://github.com/FastLED/FastLED) \n                   library)\n - **VU meters**\n - **OLED displays**\n - **7-segment displays**\n\nA large portion of the **Mackie Control Universal** (MCU) protocol is \nimplemented.\n\n\u003csub\u003e→ [_MIDI Input Elements documentation_](https://tttapa.github.io/Control-Surface-doc/Doxygen/df/d8b/group__MIDIInputElements.html)\u003c/sub\u003e\n\n### Motorized faders\n\n- **Motorized faders** are supported through the [tttapa/Control-Surface-Motor-Fader](https://github.com/tttapa/Control-Surface-Motor-Fader) repository.\n\n\u003csub\u003e→ [_Control Surface Motor Fader documentation_](https://tttapa.github.io/Pages/Arduino/Control-Theory/Motor-Fader/)\u003c/sub\u003e\n\n### Bank support\n\nAll controls can be arranged in **banks**: for example, if you have only 4\nphysical faders, you can make them bankable, so they can be used to control\nthe volume of many more different tracks. Changing banks can be done using push\nbuttons, rotary encoders, etc.  \nApart from banks and bank selectors, you can also add **transposers** to change \nthe key of your notes, for example.\n\n### Extended input/output\n\nIn order to save some IO pins, the library natively supports **multiplexers** \n(e.g. 74HC4051 or 74HC4067) to read many switches or potentiometers, \n**Shift Registers** (e.g. 74HC595) to drive many LEDs, **MAX7219 LED drivers**,\netc.\n\n\u003csub\u003e→ [_Extended IO documentation_](https://tttapa.github.io/Control-Surface-doc/Doxygen/db/dd3/group__AH__ExtIO.html)\u003c/sub\u003e\n\n### Audio\n\nIf you are using a Teensy 3.x or 4.x, you can use it as a \n**USB audio interface**. Just add an I²S DAC (e.g. PCM5102) and 5 lines of code,\nand you can start playing audio through your Teensy, by combining Control \nSurface with the Teensy Audio library.  \nYou can also add volume controls and VU meters for these audio connections.\n\n\u003csub\u003e→ [_Teensy Audio documentation_](https://tttapa.github.io/Control-Surface-doc/Doxygen/d3/d5c/group__Audio.html)\u003c/sub\u003e\n\n### Modular and extensible\n\nThanks to the structure of the library, you can easily add your own MIDI or \ndisplay elements, using some minimal, high level code. All low level stuff is\ncompletely **reusable** (e.g. all MIDI operations, debouncing switches, \nfiltering analog inputs, and so on).\n\n## Installation\n\nDownload the repository as a ZIP archive by going to the [home page of the \nrepository](https://github.com/tttapa/Control-Surface) and clicking\nthe green \u003ckbd\u003eCode\u003c/kbd\u003e button in the top right, then choosing “Download ZIP”.  \nAlternatively, click the following direct download link:\n\u003chttps://github.com/tttapa/Control-Surface/archive/refs/heads/main.zip\u003e\n\nOpen the Arduino IDE, and go to the _Sketch \u0026gt; Include Library \u0026gt; Add .ZIP\nLibrary_ menu.  \nThen navigate to your downloads directory where you just downloaded the \nlibrary.  \nSelect it, and click _Ok_.\n\n## Supported boards\n\nFor each commit, the continuous integration tests compile the examples for the\nfollowing boards:\n\n- Arduino UNO\n- Arduino Mega\n- Arduino Leonardo\n- Teensy 3.2\n- Teensy 4.1\n- Arduino Due\n- Arduino Nano Every\n- Arduino Nano 33 IoT\n- Arduino Nano 33 BLE\n- Arduino Nano Every\n- Arduino UNO R4 Minima\n- Arduino UNO R4 WiFi\n- ESP8266\n- ESP32\n- ESP32-S3\n- Raspberry Pi Pico\n\nThis covers a very large part of the Arduino platform, and similar boards will\nalso work. For example, the Arduino Nano, Mega, Micro, Pro Micro, Teensy 2.0,\nTeensy LC, Teensy 3.x, Teensy 4.x are all known to work.\n\nIf you have a board that's not supported, please \n[open an issue](https://github.com/tttapa/Control-Surface/issues/new)\nand let me know!\n\nNote that MIDI over USB and MIDI over Bluetooth are not supported on all boards.\nSee the [**MIDI over USB**](https://tttapa.github.io/Control-Surface-doc/Doxygen/d8/d4a/md_pages_MIDI-over-USB.html)\ndocumentation page for a table with supported features per board.\n\n## Change log and updating\n\n### 2.x\n\n- ([7bd5268](https://github.com/tttapa/Control-Surface/commit/7bd5268fe8906ba4fbd01024fbddc8598ffd9eb3))  \n   The `pin_t` type is now a distinct type rather than an alias to an integer.\n   This improves type safety, because `pin_t` is no longer implicitly\n   convertible to an integer (although integers are still convertible to\n   `pin_t`), and it is no longer possible to accidentally use incorrect\n   constructs such as `mux.digitalRead(mux.pin(0))`. A new type, `pin_int_t`,\n   was added to represent sizes and offsets of pins (e.g. “the sixth pin of this\n   multiplexer)”, and the argument types of the member functions of the\n   ExtendedIOElement class have been modified accordingly. If you were using a\n   class that inherited from ExtendedIOElement, you should update the signatures\n   of any overridden methods.\n- ([b0f4d63](https://github.com/tttapa/Control-Surface/commit/b0f4d636838b12907bea6cf989d20760a8a998bf))  \n   Replace `MIDI_Notes::X(n)` by `MIDI_Notes::X[n]` to avoid issues with the Arduino `F(...)` macro.\n- ([7b0eee1](https://github.com/tttapa/Control-Surface/commit/7b0eee16f15d730f0d68f6e38e6a60c634d861ad))  \n   Speed up compilation by removing many source files that were only used for testing.\n- ([07b8729](https://github.com/tttapa/Control-Surface/commit/07b8729a29f290b95bc0e68af188a19e829db749))  \n   Improved Mbed OS USB MIDI implementation.\n- ([d7a4e69](https://github.com/tttapa/Control-Surface/commit/d7a4e69c4f7a098fcd932f33f01ffc7870497e64))  \n   Added support for `BluetoothMIDI_Interface` on the Raspberry Pi Pico W.\n- ([196b5fc](https://github.com/tttapa/Control-Surface/commit/196b5fce12b97eaa56c5ad0c45c1a940943f7941))  \n   Added `ArduinoBLE` backend for `BluetoothMIDI_Interface`.\n- ([d4d7435](https://github.com/tttapa/Control-Surface/commit/d4d7435181986e75fd0319a1df184a7f0c182e90))  \n   Completely refactored `BluetoothMIDI_Interface`, with support for the NimBLE and ArduinoBLE backends.\n- ([9c4cdd4](https://github.com/tttapa/Control-Surface/commit/9c4cdd452990c470ee429b3121bdeb178ba7f42e))  \n   More upper case constants and enumerators have been deprecated. For example,\n   `ControlChange` should be used instead of `CONTROL_CHANGE`. If you continue\n   using the old versions, you will get a compiler warning. These old versions\n   will be removed in a future version of Control Surface.\n- ([aaf6eea](https://github.com/tttapa/Control-Surface/commit/aaf6eea2206c6e3b6a2004e0520100342945983f))  \n   The upper case `CHANNEL_x` and `CABLE_x` constants have been deprecated in\n   favor of the title case versions `Channel_x` and `Cable_x`. This was done to\n   avoid conflicts with macros defined by the ArduinoCore-renesas.  \n   For the same reason, the `CS` namespace has been renamed to `cs`.\n- ([47b2d5e](https://github.com/tttapa/Control-Surface/commit/47b2d5e7530da4c940fc99e606cfad0c6a0638a2))  \n   The `Encoder` class has been replaced by [`AHEncoder`](https://tttapa.github.io/Control-Surface-doc/Doxygen/dd/da9/classAHEncoder.html).\n   The code has been cleaned up and support was added for newer boards like the\n   Raspberry Pi Pico.\n- ([c35f29c](https://github.com/tttapa/Control-Surface/commit/c35f29ced7f3e491467bd61c1c71013099c01091))  \n   The SoftwareSerial MIDI interfaces are now in separate header files that have\n   to be included explicitly if you want to use them. The headers in question \n   are [`SoftwareSerialMIDI_Interface.hpp`](https://tttapa.github.io/Control-Surface-doc/Doxygen/d3/df2/SoftwareSerialMIDI__Interface_8hpp.html)\n   and [`SoftwareSerialDebugMIDI_Interface.hpp`](https://tttapa.github.io/Control-Surface-doc/Doxygen/de/d83/SoftwareSerialDebugMIDI__Interface_8hpp.html).\n   This prevents redefinition errors of pin change interrupt vectors even if\n   SoftwareSerial is not used.\n- ([bf8fb66](https://github.com/tttapa/Control-Surface/commit/bf8fb661fa97fb6420584362bfcee7ce67939f59))  \n   The abbreviated MIDI send functions (such as `sendCC()`) have been deprecated\n   in favor of the full names (e.g. `sendControlChange()`). See the \n   [MIDI_Sender documentation](https://tttapa.github.io/Control-Surface-doc/Doxygen/d6/d72/classMIDI__Sender.html)\n   for a full overview.\n- ([cf32e7e](https://github.com/tttapa/Control-Surface/commit/cf32e7e72d81269e97f18ba51c42ba10715d1852))  \n   `Control_Surface.setMIDIInputCallbacks()` now takes four arguments instead of\n   three, because a System Common callback was added.\n- ([b727931](https://github.com/tttapa/Control-Surface/commit/b727931a44cb1e262ac32901f1e307583da90624))  \n   The MIDI note name for the note F has been changed from `F` to `F_` in order\n   to avoid conflicts with the `F()` macro and its functional equivalent \n   introduced [here](https://github.com/arduino/ArduinoCore-mbed/blob/7a8d3ee46262d943f7cc1158f8bce06f61c3ddb2/cores/arduino/Arduino.h#L35-L41).  \n   It is now recommended to use `MIDI_Notes::C(4)` instead of `note(C, 4)`.\n- ([a81bd19](https://github.com/tttapa/Control-Surface/commit/a81bd1927298decc2ea3852fd2f00e8028c14b81))  \n   Classes that make use of the SPI interface now require you to pass the `SPI`\n   object as a constructor argument. This allows you to use `SPI1` or `SPI2`\n   (if available for your hardware).\n- ([c6e35b9](https://github.com/tttapa/Control-Surface/commit/c6e35b960ac15bc1b5cf5c588139d437ccd9cb68))  \n   The `NoteBitmapDisplay` class has been renamed to `BitmapDisplay`.\n- ([37b6901](https://github.com/tttapa/Control-Surface/commit/37b6901cbe56babc47c297a132381d53deaa45e8))  \n   The `NoteValueLED` and `CCValueLED` classes (and similar) have been replaced\n   by `NoteLED` and `CCLED` respectively.  \n   The display elements `BitmapDisplay`, `VPotDisplay`, `VUDisplay` etc. are \n   now generic in the type of value that they display. In most cases, you should\n   be able to update your sketch by adding `\u003c\u003e` after the type names, e.g. \n   `BitmapDisplay\u003c\u003e`, `VPotDisplay\u003c\u003e`, etc.\n- ([1a21d13](https://github.com/tttapa/Control-Surface/commit/1a21d1344f57066fa1eda3819eaf89cbbc79c14e))  \n   The line numbers of `LCDDisplay` are now one-based: `1` is the first line and\n   `2` is the second line. This is more consistent with the track parameter and\n   the API of the rest of the library. (Before, the first line was `0` and the\n   second line was `1`.)\n- ([40e3d7a](https://github.com/tttapa/Control-Surface/commit/40e3d7a4377b281e58dd7725f1bb8c6198855ce6))  \n   Control Surface now comes with an Encoder library out of the box. You no \n   longer have to install or include `Encoder.h` in your sketches.\n\n### 1.x\n\n- ([8a3b1b3](https://github.com/tttapa/Control-Surface/commit/8a3b1b314cf5b4aedf3ad60cbbc492fbcbb25c73))  \n   Before, `Control_Surface.MIDI()` was used to get the MIDI interface used by\n   Control Surface. This method was removed, because you can now connect \n   multiple interfaces to Control Surface, using the \n   [MIDI Pipe routing system](https://tttapa.github.io/Control-Surface-doc/Doxygen/df/d72/classMIDI__Pipe.html#details).\n   To send MIDI using Control Surface, you can now use \n   `Control_Surface.sendCC(...)` and the other similar methods directly.\n- ([8a3b1b3](https://github.com/tttapa/Control-Surface/commit/8a3b1b314cf5b4aedf3ad60cbbc492fbcbb25c73))  \n   For the same reason as the bullet above, the `MultiMIDI_Interface` was\n   removed, and has been replaced by the\n   [MIDI Pipe routing system](https://tttapa.github.io/Control-Surface-doc/Doxygen/df/d72/classMIDI__Pipe.html#details).\n- ([bca6e11](https://github.com/tttapa/Control-Surface/commit/bca6e11b2b3e02df5f600f65c81676708a81155b))  \n   The color mapper for `NoteRangeFastLED` and the like now takes a second \n   parameter that represents the index of the LED within the LED strip.\n- ([3c01c7d](https://github.com/tttapa/Control-Surface/commit/3c01c7d5eb60e59720540d5a77095468e6984a58))  \n   The **maximum supported ADC resolution is now used by default** (e.g. 13 bits\n   on Teensy 3.x, 12 bits on ESP32).  \n   This increases the accuracy of analog inputs and controls for the Control \n   Surface library, but could cause problems if your code uses other libraries\n   that expect the resolution to be 10 bits.  \n   You can change the default resolution to 10 bits in \n   [`src/AH/Settings/Settings.hpp`](https://tttapa.github.io/Control-Surface-doc/Doxygen/dc/d69/namespaceAH.html#a4f2ec536d7413c6969f44d63ba14ce55)\n   if you have to.\n- ([31edaa6](https://github.com/tttapa/Control-Surface/commit/31edaa6b76477fdf152c19fd34f7e4e8506561e6))  \n   The **mapping function** is now applied before applying hysteresis.  \n   This means that the input and output values of the function should be \n   16 - `ANALOG_FILTER_SHIFT_FACTOR` bits wide instead of 7. By default this is\n   **14 bits**. You can get the maximum value in a portable way by using the\n   `FilteredAnalog\u003c\u003e::getMaxRawValue()` function.  \n   The signature of the mapping function is now `analog_t f(analog_t raw)`, \n   where the return value and raw are both numbers in [0, 16383] by default.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftttapa%2FControl-Surface","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftttapa%2FControl-Surface","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftttapa%2FControl-Surface/lists"}