A continuacion realizaremos como puedes llevar acabo un controlador MIDI, con la ayuda de la tarjeta de desarrollo UNIT TouchDot, la cual tiene como MCU un ESP32 S3 y el modulo sensor capacitivo de 12 entradas touch; este ultimo nos podra ayudar a realizar un teclado o conseguir 12 variantes de GATE, para interfacez que utilicen conexion MIDI.
Introducción
¿Qué es MIDI?
Cuando se habla de interfaz, instrumento, dispositivo MIDI; en resumen se trata de explicar un protocolo estandar que permite a instrumentos musicales electronicos computadoras y controladores comunicarse entre si. La palabra MIDI , es el acronimo en ingles de Music Instrument Digital Interface (Interfaz Digital para Instrumentos Musicales).
Se puede lograr la conexión con nuestra laptop, PC o sistema via USB (Micro USB o Tipo C) o con cable tipo DIN. Cada canal es mono pero el sistema que recibe la informacion puede recibirla de forma simultanea.
Este sistema nos ayuda a mandar información de nota y duración, sincronizar controladores remotos. Algo muy importante es que por si solo los dispositivo no tienen audio / volumen perse. Solo envia datos ordenando al software o a otro sistema dotado de audio que hacer y en que momento efectuar sonido. Para saber que respuesta estamos obteniendo del controlador MIDI, nos tendremos que auxiliar de un DAW.
¿Que es un DAW?
Un DAW es el acronimo de Digital Audio Workstation (Estación de trabajo de audio digital), es decir, un software utilizado para la produccion musical, para nuestra finalidad nos ayudara a gestionar nuestro controlador MIDI.
Para esta practica nos apoyaremos de LMMS, que es una DAW de codigo abierto un para poder confirmar que nuestro circuito lo hemos configurado para que pueda ser detectado como controlador MIDI.
El link de descarga lo podras encontrar aqui: Instalación LMSS
Si ya usas otra estacion DAW , tambien sera de utilidad al tratar de sincronizarlo con el dispositivo MIDI que vamos a crear.
Materiales
- MPR121QR2 Sensor capacitivo 12 entradas touch
- Arnes Qwiic Hembra- Hembra
- Unit Touchdot
- Cables Dupont caimán
Diagrama de Conexión
Para realizar la conexión de manera mas practica usaremos el arnes Qwiic entre la placa de desarrollo TouchDot y el módulo MPR121QR2.
El MPR121QR cuenta con header macho que tendremos que soldar para posteriormente conectar los header hembra-caiman. Por caracteristicas del producto, solo ocuparemos 10 de los 12 pines touch, pero tú puedes agregar un par de header hembra -macho en los dos pines sobrantes.
El módulo MPR121QR cuenta con un dipswitch , en donde se puede seleccionar que dirección para I2C sera utilizada, en este caso lo tendremos con los valores en “0” en todos sus estados.

Requerimientos Previos
Realizaremos algunos acondicionamientos previos para poder usar nuestro dispositivo MIDI, los cuales son:
- Intalacion del DAW LMSS, si ya cuentas con algun otro salta al siguiente paso
- Instalación de librerias : Wire.h, USB.h y USBMIDI.h. Es importante mencionar que estamos ocupando la touchdot ya que cuenta con el MCU ESP32 S3, el cúal sera compatible con las estas librerias.
- Configuración en el IDE Arduino para programar la touchdot como dispositivo MIDI como se muestra en la siguiente imagen:

Código
El siguiente programa tiene como objetivo convertir los pulsos que se den en las entradas touch a canal MIDI, siendo de salida la nota Mi (E).
#include <Wire.h>
#include <USB.h>
#include <USBMIDI.h>
// ─── Pines I2C de Touchdot via Qwicc
static const uint8_t SDA_PIN = 5;
static const uint8_t SCL_PIN = 6;
static const uint8_t NUM_ELECTRODES = 12;
// ─── Instancia USB MIDI
USBMIDI usbMidi;
// ─── Direcciones I2C de los dos módulos MPR121, esta dirección es respecto al dipswich que tiene el módulo (0,0,0)
static const uint8_t MPR[2] = { 0x5A, 0x5B };
bool mprPresent[2] = { false, false };
uint16_t lastTouchBits[2] = { 0, 0 };
// ─── Mapeo de notas MIDI por módulo y electrodo
// Módulo 0 (0x5A): electrodos 0-11 → notas 60-71 (Do4 a Si4)
// Módulo 1 (0x5B): electrodos 0-11 → notas 72-83 (Do5 a Si5)
static const uint8_t MIDI_CHANNEL = 1; // Canal MIDI 1 (0x00 interno)
static const uint8_t BASE_NOTE[2] = { 60, 72 };
static const uint8_t VELOCITY = 100;
// ─── Escritura de registro
void writeReg(uint8_t addr, uint8_t reg, uint8_t value) {
Wire.beginTransmission(addr);
Wire.write(reg);
Wire.write(value);
Wire.endTransmission();
delayMicroseconds(100);
}
// ─── Lectura de estado táctil
uint16_t readTouchStatus(uint8_t addr) {
Wire.beginTransmission(addr);
Wire.write(0x00);
Wire.endTransmission(false);
Wire.requestFrom(addr, (uint8_t)2);
if (Wire.available() < 2) return 0;
uint8_t lsb = Wire.read();
uint8_t msb = Wire.read();
return (uint16_t)lsb | ((uint16_t)msb << 8);
}
// ─── Envío de eventos MIDI + Serial debug
void handleTouchEdges(uint8_t moduleIdx, uint16_t touchBits) {
for (uint8_t i = 0; i < NUM_ELECTRODES; ++i) {
uint16_t bit = (uint16_t)(1u << i);
bool prev = (lastTouchBits[moduleIdx] & bit) != 0;
bool curr = (touchBits & bit) != 0;
uint8_t note = BASE_NOTE[moduleIdx] + i;
if (!prev && curr) {
// ── Nota ON ──────────────────────────────────────────────────
usbMidi.noteOn(note, VELOCITY, MIDI_CHANNEL);
Serial.printf("NOTA ON M%d E%d → MIDI %dn", moduleIdx, i, note);
}
if (prev && !curr) {
// ── Nota OFF ─────────────────────────────────────────────────
usbMidi.noteOff(note, 0, MIDI_CHANNEL);
Serial.printf("NOTA OFF M%d E%d → MIDI %dn", moduleIdx, i, note);
}
}
lastTouchBits[moduleIdx] = touchBits;
}
// ─── Inicialización del MPR121
void initTouchOnly(uint8_t addr) {
writeReg(addr, 0x5E, 0x00); // STOP mode
// Filtros de baseline
writeReg(addr, 0x2B, 0x01);
writeReg(addr, 0x2C, 0x01);
writeReg(addr, 0x2D, 0x00);
writeReg(addr, 0x2E, 0x00);
writeReg(addr, 0x2F, 0x01);
writeReg(addr, 0x30, 0x01);
writeReg(addr, 0x31, 0xFF);
writeReg(addr, 0x32, 0x02);
// Umbrales de toque/liberación
for (int i = 0; i < 12; i++) {
writeReg(addr, 0x41 + i * 2, 12);
writeReg(addr, 0x42 + i * 2, 6);
}
writeReg(addr, 0x5D, 0x04); // AFE config
writeReg(addr, 0x5E, 0x8F); // RUN mode, 12 electrodos
delay(6);
}
// ─── Setup ────────────────────────────────────────────────────────
void setup() {
Serial.begin(115200);
delay(200);
// Inicializar USB MIDI ANTES que USB.begin()
usbMidi.begin();
USB.productName("ESP32-S3 MIDI Controller");
USB.manufacturerName("TuNombre");
USB.begin();
Wire.begin(SDA_PIN, SCL_PIN);
for (int i = 0; i < 2; i++) {
Wire.beginTransmission(MPR[i]);
if (Wire.endTransmission() == 0) {
mprPresent[i] = true;
initTouchOnly(MPR[i]);
Serial.printf("MPR121 en 0x%02X liston", MPR[i]);
}
}
Serial.println("Sistema MIDI USB listo");
}
// ─── Loop ─────────────────────────────────────────────────────────
void loop() {
// Procesar mensajes MIDI entrantes (si los hubiera, ej. sync)
for (int i = 0; i < 2; i++) {
if (!mprPresent[i]) continue;
uint16_t status = readTouchStatus(MPR[i]);
uint16_t touchBits = status & 0x0FFF;
handleTouchEdges(i, touchBits);
}
delay(10);
}
Una vez cargado el programa podremos ver lo siguiente en el monitor serial y dentro del DAW LMSS, podremos ubicar al dispositivo MIDI como: TinyUSB MIDI

Nota: Si por alguna razón se desconecta o no reconoce tu puerto USB al la tarjeta TouchDot, favor de desconectar la tarjeta touchdot, presionar reset + boot , conectar la tarjeta, soltar reset y posteriormente boot, este método se llama Modo Boot y en ESP32 de la seria S3 es usual que pase esta situación 🙁 .
Conclusiones
A lo largo de distintas prácticas con la tarjeta UNIT TouchDot, hemos explorado la versatilidad que ofrecen sus pads táctiles integrados. En esta ocasión decidimos ir un paso más allá: en lugar de limitarnos a los pines touch nativos de la placa, expandimos sus capacidades conectando el módulo MPR121QR2 a través del puerto Qwiic, sumando 12 entradas capacitivas adicionales de forma sencilla y sin soldadura.
El resultado es una interfaz MIDI completamente funcional, capaz de generar señales Gate para disparar instrumentos virtuales o hardware desde cualquier DAW. Para la demostración utilizamos un DAW de código abierto y uso gratuito que, aunque puede presentar algunos detalles menores, fue más que suficiente para validar que la tarjeta TouchDot puede integrarse sin problema en un flujo de trabajo de producción musical.
Uno de los aspectos más interesantes de esta práctica es su potencial creativo: al conectar objetos conductores a los caimanes —como plantas, frutas, placas de cobre o aluminio— es posible construir teclados e interfaces táctiles completamente personalizadas, abriendo la puerta a instalaciones interactivas y proyectos experimentales de audio.
Como siguiente paso, planeamos llevar este controlador a una versión Bluetooth, eliminando la dependencia del cable USB y aprovechando al máximo las capacidades inalámbricas del ESP32-S3. Esto permitirá mayor libertad de movimiento y abrirá nuevas posibilidades de integración con dispositivos móviles y software compatible con MIDI BLE.

