4 / 4
| Señal | GPIO del ESP32 |
|---|---|
| PCA9685 n.º 1 — SDA / SCL | 21 / 22 |
| PCA9685 n.º 2 — SDA / SCL (opcional) | 16 / 17 |
| Tira LED WS2812B — datos (opcional) | 5 |
0x40 (sin soldar puentes): 16 servos por placa, hasta 32 con dos.| Atajo | Acción |
|---|---|
| EDICIÓN | |
| Ctrl + Z | Deshacer (50 pasos por tab, historial independiente) |
| Ctrl + Y / Ctrl+Shift+Z | Rehacer |
| Ctrl + C | Copiar las notas seleccionadas al portapapeles (compartido entre tabs) |
| Ctrl + V | Pegar en el cursor de reproducción · las notas pegadas quedan seleccionadas, listas para recolocarlas |
| Supr / Retroceso | Borrar las notas seleccionadas (deshacible) |
| ← / → | Mover la selección ±1 paso |
| ↑ / ↓ | Mover la selección ±1 semitono (↑ = más agudo) · con Shift, ±1 octava |
| Escape | Deseleccionar · segunda pulsación cierra esta ayuda |
| HERRAMIENTAS | |
| B | Modo dibujo (✏): arrastrar en vacío crea notas largas |
| L | Encender / apagar el bucle (🔁) |
| Ctrl + L | Bucle sobre las notas seleccionadas |
| F1 | Abrir esta ayuda (también en el menú → ❓ Ayuda) |
| Letras con el panel Servos abierto | Tocan los motores con tecla asignada · por eso B y L no actúan mientras el panel Servos está abierto |
| Clic | Añadir nota (1 cuadro, velocity 40) / quitarla · con selección activa, solo deselecciona |
| Arrastrar en vacío | Selección por rectángulo (borde azul en las notas) |
| Shift + arrastrar | Añadir las notas del rectángulo a la selección actual |
| Shift + clic en nota | Añadir / quitar esa nota de la selección |
| Arrastrar una nota | Moverla (pasos y semitonos); si forma parte de la selección, se mueve toda · previsualización en vivo · el grid se amplía a la derecha si hace falta · las colisiones se sobrescriben |
| Borde de la nota ↔ | Arrastrar para cambiar su duración (etiqueta con el nº de cuadros) · si la nota está seleccionada junto a otras, cambian todas en los mismos cuadros y la etiqueta muestra el cambio (+2, −1…) · ninguna baja de 1 cuadro ni pisa a su vecina |
| ✏ Dibujar (B) + arrastrar | Crea una nota larga en un hueco vacío, con previsualización y nº de cuadros |
| Ctrl + clic | Editar la velocity de la nota (escala 1–100 del ESP32) · Enter aplica, Esc cancela · se limita al Vmáx de su motor |
| Alt + clic | Silenciar / reactivar el motor de esa nota (la nota se ve gris con raya roja) |
| Franjas de la regla | De arriba abajo: marcadores de sección · bucle (franja estrecha) · compases |
| Clic / arrastrar en compases | Mueve el cursor de reproducción a ese punto (al soltar) · si está sonando, sigue desde ahí |
| Arrastrar en la franja de bucle | En vacío: crea la región · sobre la región: la mueve · en sus bordes (↔): la alarga o acorta · se ajusta a tiempos (con Alt, a pasos) |
| Clic / doble clic en la región | Clic: enciende o apaga el bucle (verde = activo, gris = apagado) · doble clic: quita la región |
| 🔁 Bucle / L | Interruptor junto a Play/Stop: repite la región hasta Stop, también en el piano · la región se conserva al apagarlo · sin región, crea 1 compás desde el cursor |
| Ctrl + L | Región del bucle sobre las notas seleccionadas (redondeada a tiempos) y la activa |
| Shift + clic en la regla | Añadir (o renombrar) un marcador de sección: Intro, Verso, Estribillo… · clic derecho sobre él lo borra |
| ♩ Tempo | Modo de edición del tempo: clic en la regla añade o edita un punto de BPM · arrastrar lo mueve · clic derecho lo borra |
| 📄 Nuevo | Grid vacío con las 6 octavas (C1–B6) · eliges nº de compases (1–16) y BPM inicial |
| 🎵 Abrir (.mid) | Añadir uno o varios .mid / .midi a la biblioteca · también arrastrándolos a la ventana · no abre ningún canal: elígelos en el panel |
| 🎼 Cargar MML | Importar partitura en Music Macro Language (texto) · se añade a la biblioteca con una pista por canal |
| ⬇ Export .mid | Exportar a MIDI estándar (Tipo 1, compatible con Ableton, Logic, MuseScore, Cubase…) · incluye mapa de tempo y transposición activa · pide nombre (sufijo _motores en tabs 🤖, si no _export) |
| 💾 Guardar (.json) | Proyecto completo: notas, análisis armónico, tempo, marcadores y región del bucle · pide nombre (Enter confirma, Esc cancela) |
| 📂 Cargar (.json) | Abrir un proyecto guardado (los antiguos se adaptan solos: agudos arriba, sin bucle) |
| 🕐 Proyectos recientes | Los últimos 10 proyectos .json, con el tiempo desde la última vez (los MIDI se guardan en la biblioteca) |
| ☀️ / 🌙 Tema | Alternar tema claro / oscuro — se guarda entre sesiones; todos los paneles lo siguen |
| 🎼 Biblioteca | Panel lateral con los MIDI cargados (se guardan en el navegador) y sus canales con notas · ocupa toda la altura bajo la barra, empuja el grid y puede quedarse abierto (en el móvil se cierra solo al abrir una pista) · al recargar, los archivos aparecen plegados (▸) |
| Canciones de ejemplo | Si la biblioteca está vacía (primera visita, ventana de incógnito o tras borrarlo todo), al cargar la página se añaden las canciones de elper.es/midi/ · necesita conexión a internet |
| + Añadir MIDI | Añade uno o varios .mid · también arrastrándolos a la ventana · un archivo repetido no se duplica |
| Clic en el nombre del archivo | Cambiar el nombre con el que aparece · Enter guarda, Esc o clic fuera cancela · el archivo del disco no se toca |
| Miniatura | Bajo cada canal: sus notas con el color de octava y la fuerza que tendrán en el grid · agudos arriba, graves abajo · mismo tiempo para todos los canales del archivo (se alinean) |
| Clic en un canal | Abre el canal en un tab nuevo, sin silencios (como suena con ▶: se quita el silencio inicial y los de más de 2 s se dejan en 0,5 s), con las 6 octavas (C1–B6) y el zoom mínimo · el tab solo guarda ese canal, no el archivo entero · si ya tiene tab abierto, vuelve a él |
| Shift + clic en un canal | Lo abre con sus silencios originales, tal como está en el archivo · también con varias pistas marcadas y con Abrir combinados · se guarda en un tab distinto del de sin silencios |
| ▶ (en un canal) | Escuchar el canal por el altavoz sin abrirlo · no envía nada al ESP32 · salta el silencio inicial y acorta los de más de 2 s a 0,5 s · se para con ⏹, al escuchar otro o al dar Play |
| Línea roja de avance | Mientras se escucha, avanza sobre la miniatura · arrástrala (cursor ↔) para saltar a otro punto: al soltar sigue desde ahí |
| ☑ + ▶ | Si el canal está marcado junto con otros, suenan todas las pistas marcadas a la vez · los silencios solo se saltan cuando no suena ninguna |
| ☑ + Abrir combinados | Marca varios canales, incluso de archivos distintos, y ábrelos juntos en un solo tab, sin silencios (compás del primero marcado · si los tempos difieren, usa el más lento y avisa) |
| ☑ + clic en el nombre | Abre las pistas marcadas juntas y sin silencios, como suenan con ▶: se quita el silencio inicial y los de más de 2 s se dejan en 0,5 s · con Shift, con silencios |
| 🗑 (en un archivo) | Quita el archivo de la biblioteca · los tabs ya abiertos no se cierran |
| + (barra de tabs) | Tab nuevo: cada uno es independiente, con su grid, historial de deshacer, bucle y análisis armónico |
| Clic en un tab | Cambiar de tab — su estado se guarda solo · si estaba sonando, sigue sonando el tab nuevo (si tiene notas) |
| ✕ (en un tab) | Cerrar el tab (pide confirmación si tiene cambios sin guardar) · el último tab no se puede cerrar |
| ● (en un tab) | Cambios sin guardar |
| Ratón sobre un tab | Muestra de qué archivo y canal de la biblioteca viene |
| ℹ Info | Cada tab tiene su propio Info: archivo y canal (en un combinado, todos los que lo forman), silencios quitados, PPQN, compás y análisis armónico |
| Portapapeles | Lo copiado se comparte entre tabs: permite llevar fragmentos de un tab a otro |
| Filas | Las 6 octavas del piano (C1–B6), agudos arriba y graves abajo · solo se amplía si una pista tiene notas fuera de ese rango |
| Colores | Cada octava con su color (C1 rojo · C2 naranja · C3 amarillo · C4 verde · C5 azul · C6 violeta) · más oscuro = nota más suave |
| Columna de notas | Nombre de cada fila y su motor (m:N) · clic y mantener: suena la nota y golpea su motor, respetando Mute y Vmín–Vmáx · arrastrar ↑↓ para deslizarse entre notas |
| − Zoom + | Acerca / aleja el grid (ancho de 8 a 80 px por paso y alto de fila) · las pistas de la biblioteca se abren con el zoom mínimo · en canciones muy largas el máximo se limita para que el grid se dibuje entero |
| Minimapa | Vista general de toda la canción encima de la regla · clic para desplazarte |
| Nota silenciada | Gris con raya roja: su motor está en Mute (no suena ni golpea) |
| ▶ Play | Reproduce desde el cursor · con el bucle activo, desde el inicio de la región · con un ESP32 conectado, el audio espera a que confirme para arrancar a la vez |
| ⏹ Stop | Detiene, vuelve al inicio y envía STOP al ESP32 (motores a su posición de reposo) |
| 🔁 Bucle | Ver "Regla de tiempo y bucle" |
| BPM | Tempo de reproducción · con ♩ Tempo se pueden poner cambios de tempo a lo largo de la canción |
| Menú → Compases − [n] + | Quitar / añadir N compases al final del grid |
| Copiar / Pegar / Borrar | Sobre las notas seleccionadas o, si no hay, sobre la región del bucle · Borrar con región desplaza el resto hacia la izquierda |
| Notas | Panel flotante con las notas del grid agrupadas por octava · nº de motor editable · clic en una ficha: suena y golpea su motor, respetando Mute y Vmín–Vmáx |
| Acordes | Panel de acordes del grid (ver "Análisis armónico") |
| Vel. | Muestra / oculta el carril de velocidades bajo el grid · arrastrar sobre una columna cambia la fuerza de sus notas · Shift + arrastrar escala todas manteniendo sus diferencias · con un acorde seleccionado solo afecta a sus notas · nunca supera el Vmáx de cada motor |
| Interpretar | Colorea las notas por relevancia (azul = relleno → rojo = clave) y ajusta la expresión · los cambios se aplican desde su panel |
| 🤖 Comprimir | Comprime la partitura del tab activo (con tus ediciones) a las teclas físicas del Motor Map y abre el resultado en un tab nuevo 🤖 — el original no se toca · exporta con sufijo _motores.mid |
| Servos | Panel Motor Map + Escala · tabla nota → motor con posición de reposo (HomePWM), Vmín / Vmáx (rango de fuerza de cada motor), Mute y tecla asignada · mini teclado (clic en una tecla = golpe de prueba) · con la escala desplazada, la tabla y el mini teclado muestran y hacen sonar la nota que toca cada servo (la de fábrica en pequeño: ‹A1›) · las teclas suenan por su propio canal, sin cortar la reproducción · todos los golpes de prueba respetan Mute y Vmín–Vmáx · exportar / importar JSON |
| Escala (transposición) | Desplaza ±24 semitonos qué motor toca cada nota · compartido entre tabs · los LEDs del ESP32 se actualizan al momento y los motores en el siguiente Play · botones −12 / −1 / +1 / +12 y ↺ · "Solo motores": el altavoz solo toca las notas que tienen motor |
| Menú → Avance LED | El LED de la tecla se enciende N ms antes del golpe (efecto Synthesia) · los LEDs usan el color de cada nota en el grid |
| Tonalidad | Detectada automáticamente (correlación Krumhansl-Kessler, 24 tonalidades) al abrir una pista y tras editar |
| Vista (bajo ℹ Info) | pasos: un bloque por cada cambio de notas · acordes: fusionados por negra · frases: por cadencias (V→I, IV→I, ii→V→I…) · respira: zonas de baja energía |
| Clic en un bloque | Marca sus notas en el grid, lleva el cursor ahí y abre el panel de acordes en ese acorde |
| Panel: « / » | Retrocede / avanza un segmento (acorde, frase… según el selector de vista) y lo toca · si algo suena, lo corta y toca el nuevo |
| Panel: ▶ Tocar | Toca el segmento actual (altavoz y piano) |
| Panel: Repetir | Marcado: «, ▶ Tocar y » repiten el segmento en bucle hasta Stop · sin marcar: lo tocan una vez · se recuerda al recargar |
| Panel: ▶▶ Auto | Avance automático por lotes de acordes, sin parar · el ESP32 recibe cada lote al terminar el anterior |
| ESP32 (botón) | Configurar la conexión · ● verde = conectado · rojo = desconectado · naranja = conectando |
| WiFi (WebSocket) | ws://IP:81 · reconexión automática · el ESP32 debe estar en la misma red local |
| Serie (USB) | Web Serial a 115200 baudios · solo Chrome / Edge · no necesita WiFi |
| Play + ESP32 | La secuencia se envía en bloques ≤ 8 KB; el audio espera la confirmación del ESP32 para arrancar a la vez |
| Bucle + ESP32 | La región se envía una sola vez terminada en r;: el firmware la repite de forma nativa, sin huecos ni reenvíos, hasta STOP · cambiar la región mientras suena la reenvía (breve corte solo en ese momento) |
| Sincronía | El firmware envía un pulso por paso y el cursor se corrige con él · fuera del bucle, marcadores por compás corrigen el desfase de los motores |
| Protocolo | m N motor · o PWM reposo · t MS espera · v VEL fuerza · p; tocar una vez · r; repetir · golpe 80 ms + retracción 150 ms |
| 📋 Log | En la ventana ESP32: abre otra ventana con los mensajes del ESP32 en tiempo real y un campo para enviarle comandos |
| Programación con anticipación | Las notas se programan 100 ms por delante con el reloj de audio — ritmo preciso incluso a tempos altos |
| Sonido | Piano (soundfont General MIDI de MIDI.js) |
| Tempo variable | Los cambios de tempo (♩ Tempo) se aplican sobre la marcha |
| MML@ … | Prefijo opcional · las pistas se separan con coma (,) — cada pista va a su propio canal |
| t120 | Tempo en BPM |
| v100 | Velocity (0–127) |
| o4 | Octava (0–9) |
| l4 | Duración por defecto: 1 redonda · 2 blanca · 4 negra · 8 corchea · 16 semicorchea |
| c d e f g a b | Notas · + o # sostenido · - bemol · número = duración · . puntillo |
| < > | Bajar / subir una octava |
| r | Silencio |
| & | Ligadura: alarga la nota anterior |
| MIDI | Nota | Motor | HomePWM | Vmín | Vmáx | PCA/ch | Mute | Key |
|---|