Robot pianista · MIDI · ESP32 · WiFi / USB Serial · Impresión 3D
Servos controlados por ESP32 (por WiFi o USB Serial), piezas impresas en 3D, LEDs sincronizados con cada nota y un secuenciador MIDI web con análisis armónico e interpretación expresiva que lo orquesta todo desde el navegador.
ESP32-driven servos (over WiFi or USB Serial), 3D-printed parts, LEDs synced to every note and a web MIDI sequencer with harmonic analysis and expressive interpretation that orchestrates it all from the browser.
El robot
The robot
Por qué PianoRoll
Why PianoRoll
Envía comandos en tiempo real a servos y motores conectados a un ESP32 por dos canales a elegir: WebSocket sobre WiFi o USB Serial (Web Serial API). Sincronización beat-by-beat con corrección de drift y configuración de la red WiFi desde la propia app.
Sends real-time commands to servos and motors connected to an ESP32 over two selectable channels: WebSocket over WiFi or USB Serial (Web Serial API). Beat-by-beat sync with drift correction and WiFi setup straight from the app.
Grid con arrastrar y soltar, carril de velocidades, 128 instrumentos GM, importación y exportación de archivos .mid estándar compatibles con cualquier DAW.
Drag-and-drop grid, velocity lane, 128 GM instruments, standard .mid import and export compatible with any DAW.
Detección automática de tonalidad (Krumhansl-Kessler), acordes con Tonal.js, heat map 4D y análisis de cadencias mientras compones.
Automatic key detection (Krumhansl-Kessler), chords with Tonal.js, 4D heat map and cadence analysis as you compose.
Pinta cada nota por relevancia (azul relleno → rojo clave) y ajusta la firma expresiva: velocity y duración se reescriben en el grid. Reversible con Ctrl+Z.
Colours every note by relevance (blue fill → red key) and tunes the expressive signature: velocity and duration are rewritten into the grid. Undo with Ctrl+Z.
Asigna notas MIDI a servos con Vmín/Vmáx por motor, mute, tecla de teclado, golpe de prueba e import/export JSON del mapa.
Map MIDI notes to servos with per-motor Vmin/Vmax, mute, keyboard key, test hit and JSON import/export of the map.
Transpone ±1 / ±12 semitonos al vuelo, con opción de reproducir solo las notas que tienen motor asignado.
Transpose ±1 / ±12 semitones on the fly, with an option to play only notes that have a motor assigned.
Colapsa las notas a las octavas de los motores configurados en el Motor Map, resolviendo colisiones por atención del heat map.
Collapses notes onto the octaves of the motors set in the Motor Map, resolving collisions by heat-map attention.
Loop A→B marcando en la regla, y copiar / pegar / borrar fragmentos con recolocación por flechas.
A→B loop by marking on the ruler, plus copy / paste / delete fragments with arrow-key repositioning.
Puntos de BPM editables directamente en la regla: acelerandos y ritardandos por sección.
BPM points editable right on the ruler: accelerandos and ritardandos per section.
Tira WS2812B con color configurable y anticipación tipo Synthesia: el LED se enciende N ms antes del golpe.
WS2812B strip with configurable colour and Synthesia-style lookahead: the LED lights N ms before the hit.
Varios proyectos abiertos con deshacer independiente por pestaña y vista panorámica con scrub rápido.
Multiple projects open with per-tab undo, plus a full-project overview with quick scrub.
Pega notación MML directamente y aparece en el grid.
Paste MML notation directly and it populates the grid.
100 ms de lookahead para timing sample-accurate. Sin jitter por setInterval.
100 ms lookahead for sample-accurate timing. No setInterval jitter.
Genera archivos .mid estándar con mapa de tempo y transposición, compatibles con Ableton, Logic, MuseScore o Cubase.
Generates standard .mid files with tempo map and transposition, compatible with Ableton, Logic, MuseScore or Cubase.
Funciona en Chrome, Edge y Opera. Sin npm, sin Electron, sin plugins.
Works in Chrome, Edge and Opera. No npm, no Electron, no plugins.
Análisis + Interpretación
Analysis + Interpretation
Motor armónico en tiempo real fusionado con una capa de interpretación que vuelca expresión sobre la velocidad y la duración de cada nota antes de tocar.
A real-time harmonic engine fused with an interpretation layer that pours expression onto each note's velocity and duration before it plays.
Detección de tonalidad con el algoritmo Krumhansl-Kessler mientras compones.
Key detection via the Krumhansl-Kessler algorithm as you compose.
Identificación de acordes con Tonal.js y análisis de cadencias, con panel para reproducirlos y hacer loop.
Chord identification with Tonal.js and cadence analysis, with a panel to play and loop them.
Mapa de calor que pondera la atención de cada nota y guía la compresión a motores y la interpretación.
A heat map that weighs each note's attention and drives motor compression and interpretation.
La capa «escuchar antes de tocar» fusiona heat map, armonía y frases para reescribir velocity y duración. Reversible con Ctrl+Z.
The "listen before you play" layer fuses heat map, harmony and phrasing to rewrite velocity and duration. Undo with Ctrl+Z.
Conexión con el hardware
Hardware connection
Elige el canal en la barra de herramientas (grupo ESP32) y conecta. La red WiFi del robot se configura desde la propia app, por WiFi o por cable.
Pick the channel in the toolbar (ESP32 group) and connect. The robot's WiFi network is set up from the app itself, over WiFi or over the cable.
El ESP32 y tu ordenador comparten red. Escribes la IP del ESP32 (por defecto 192.168.4.1 en su modo AP) y conectas por WebSocket. Ideal para tocar sin cables.
The ESP32 and your computer share a network. You type the ESP32's IP (default 192.168.4.1 in AP mode) and connect over WebSocket. Great for cable-free playing.
Conexión directa por cable USB con la Web Serial API de Chrome/Edge. No necesitas red: útil para el primer arranque y para configurar la WiFi por cable.
Direct USB-cable connection via Chrome/Edge's Web Serial API. No network needed: handy for first boot and for setting up WiFi over the cable.
Abre Log en la barra de herramientas: dentro tienes los botones + WiFi y ⟳ Reset WiFi. Funcionan por los dos canales.
Open Log in the toolbar: inside you'll find the + WiFi and ⟳ Reset WiFi buttons. They work over both channels.
Sin red guardada, el ESP32 crea el punto de acceso abierto midiGrid-Setup en 192.168.4.1.
With no saved network, the ESP32 creates the open access point midiGrid-Setup at 192.168.4.1.
Pulsa + WiFi e introduce el nombre de la red (SSID) y la contraseña.
Click + WiFi and enter the network name (SSID) and password.
El ESP32 guarda las credenciales en memoria (NVS) y se reinicia para conectarse a tu red.
The ESP32 stores the credentials in memory (NVS) and reboots to join your network.
Si conecta, adopta una IP de tu red (mírala en el Log/monitor serie). Si falla, vuelve al AP.
On success it takes an IP from your network (check the Log/serial monitor). On failure it falls back to the AP.
Demo en vivo
Live demo
El robot tocando una secuencia compuesta en PianoRoll y enviada al ESP32 en tiempo real.
The robot playing a sequence composed in PianoRoll and sent to the ESP32 in real time.
Contacto
Contact
Escríbeme por WhatsApp — respondo en menos de 24 h. Puedo fabricar una unidad, resolver dudas técnicas o hablar de colaboraciones.
Message me on WhatsApp — I reply within 24 h. I can build a unit, answer technical questions or discuss collaborations.
Escríbeme por WhatsAppMessage me on WhatsApp