4 / 4
VEL
▲
Motor Map / Escala — MIDI note → ESP32 motor
| Atajo | Acción |
|---|---|
| EDICIÓN | |
| Ctrl + Z | Deshacer (50 pasos por tab, historial independiente) |
| Ctrl + Y / Ctrl+Shift+Z | Rehacer |
| Ctrl + C | Copiar selección rectangular al portapapeles compartido entre tabs |
| Ctrl + V | Pegar en posición del playhead con el offset de octava activo |
| Ctrl + Shift + V | Pegar una octava más arriba que el offset actual |
| Ctrl + Alt + V | Pegar una octava más abajo que el offset actual |
| Delete / Backspace | Borrar notas seleccionadas (deshacible) |
| Escape | Deseleccionar · segunda pulsación cierra este modal |
| RATÓN EN EL GRID | |
| Click | Añadir / quitar nota |
| Click + arrastrar → | Ajustar duración de la nota |
| Ctrl + Click | Editar velocity — abre tooltip inline sobre la nota (Enter confirma, Escape cancela) |
| Alt + Click | Mutear / desmutear motor de esa nota (aparece en gris con raya roja) |
| Shift + arrastrar | Selección rectangular: notas marcadas con borde azul |
| CARRIL DE VELOCIDADES (siempre visible) | |
| Arrastrar | Editar velocity de todas las notas en ese paso arrastrando la barra |
| Shift + arrastrar | Aplicar esa velocity a todas las notas del grid a la vez (etiqueta ALL) |
| TABS Y ARCHIVO | |
| Ctrl + Shift + A | Abrir todos los canales del MIDI en tabs separados |
| 📄 Nuevo | Crear grid vacío — elige nº de compases (1–16) y BPM inicial |
| 🎵 Abrir MIDI | Importar archivo .mid / .midi · también arrastrar directamente a la ventana (abre en nuevo tab si hay contenido) |
| 🎼 MML | Importar partitura en formato Music Macro Language (texto compacto) |
| ⬇ .mid | Exportar a MIDI estándar — genera archivo .mid Tipo 1 compatible con Ableton, Logic, MuseScore, Cubase y cualquier DAW. Incluye mapa de tempo y transposición activa |
| 💾 Guardar | Exportar proyecto completo como JSON (incluye análisis armónico, mapa de tempo y marcadores) |
| 📂 Cargar | Importar proyecto JSON guardado previamente |
| Archivos recientes | Los últimos 10 proyectos JSON se recuerdan en el menú · muestra tiempo transcurrido desde la última vez |
| ☀️ / 🌙 Tema | Alternar tema claro / oscuro — se guarda entre sesiones |
| + Nuevo tab | Cada tab es un proyecto independiente con su propio grid, historial de undo y análisis armónico |
| Click en tab | Cambiar de tab — el estado se guarda automáticamente; si había reproducción activa se detiene |
| ✕ (en tab) | Cerrar tab; si es el último, se vacía en lugar de cerrarse |
| ● (en tab) | Indicador de cambios sin guardar |
| Canal → Mostrar | Seleccionar canal MIDI y pulsar Mostrar — si el tab activo tiene contenido, abre el canal en un tab nuevo |
| Todos / Ctrl+Shift+A | Abre cada canal con notas en un tab independiente |
| Portapapeles | El fragmento copiado se comparte entre todos los tabs; permite trasladar secciones y pegar en otra octava |
| Click | Añadir / quitar nota · velocity inicial = 40 |
| Click + arrastrar → | Dibujar nota con duración personalizada (en semicorcheas) |
| Ctrl + Click | Editar velocity con tooltip inline — campo numérico sobre la nota, Enter aplica, Esc cancela, click fuera también aplica |
| Alt + Click | Mutear / desmutear el motor físico asignado a esa nota |
| Shift + arrastrar | Selección rectangular — las notas seleccionadas muestran borde azul |
| −8va / ⎗ / +8va | Ajustan el offset de pegado ±1 octava; ⎗ muestra el valor activo |
| − Zoom + | Zoom horizontal del grid (1–32 px por paso) |
| Teclado lateral | Click + mantener → escucha la nota y mueve el servo · Arrastrar ↑↓ para deslizarse entre notas |
| Minimap | Vista panorámica del grid completo — arrastrar el rectángulo para desplazarse |
| Visible por defecto | El carril aparece siempre al cargar un grid; se puede ocultar con el botón Vel. de la toolbar |
| Arrastrar barra | Edita la velocity de todas las notas en ese paso · el color sigue la octava de la nota |
| Shift + arrastrar | Aplica esa velocity a todas las notas del grid a la vez (línea guía amarilla + etiqueta ALL) |
| Ctrl + Click (grid) | Tooltip inline sobre la nota seleccionada — edición precisa sin abandonar el grid |
| Rango | 0 (silencio) – 127 (máximo) · las barras se colorean según octava con brillo proporcional a la velocity |
| ▶ Play | Inicia reproducción desde el playhead — el audio usa AudioContext scheduler (sin jitter) y el ESP32 recibe PLAY en paralelo |
| ⏸ Pause | Pausa conservando la posición |
| ⏹ Stop | Detiene y vuelve al inicio; envía STOP al ESP32 |
| Click en regla | Seek a ese compás — si estaba reproduciendo, rearranea desde el nuevo punto |
| ⇄ A-B | Loop de rango: 1er clic en regla → punto A, 2º clic → punto B · arrastrar A o B para moverlos · el ESP32 reenvía APPEND en hardware |
| ♩ Tempo | Modo de edición del mapa de BPM: clic en la regla añade / mueve puntos de tempo · la reproducción interpola entre puntos |
| − [n] + | Quitar / añadir N compases al final del grid |
| ⎘ / ⎗ / ✕ | Copiar / pegar / eliminar el fragmento del rango A-B · ✕ desplaza el resto hacia la izquierda |
| Notas | Panel flotante con todas las notas únicas presentes en el grid |
| Vel. | Muestra / oculta el carril de velocidades (visible por defecto) |
| Calor | Colorea el piano roll por importancia estructural mediante el Motor de Atención (softmax 4D): rojo = nota dominante · azul = subordinada |
| Motor | Abre el panel unificado Motor Map + Escala de transposición |
| Motor Map | Tabla nota MIDI → motor físico · mute por fila silencia audio y ESP32 · permite test, export e import JSON |
| Escala (transposición) | Offset global ±24 st aplicado a todos los lookups de motor · compartido entre tabs · hot-apply al ESP32 vía APPEND · botones −12/−1/+1/+12 y ↺ |
| Avance LED | Slider en el menú: el LED de anticipo se enciende N ms antes del golpe (efecto Synthesia para LEDs WS2812B) |
| Color LED | Modos: rainbow · octava · calor · blanco — afecta solo a los LEDs del ESP32, no al canvas |
| Tonalidad | Detectada automáticamente por correlación Krumhansl-Kessler (24 claves mayor/menor) al cargar o cambiar de canal |
| pasos | Vista de micro-segmentos: uno por cada cambio de notas activas |
| acordes | Vista fusionada por negra (acorde dominante cada 4 pasos) — nivel musical estándar |
| frases | Frases detectadas por cadencias (V→I auténtica, IV→I plagal, ii→V→I, vi→IV deceptiva…) |
| respira | Segmentos de baja energía — zonas óptimas para resetear el buffer I2C del ESP32 sin cortar la música |
| Click en bloque | Abre popup con nombre del acorde, función tonal (I, V, ii…), notas y duración |
| ← → en popup | Navegar al segmento anterior / siguiente sin cerrar el popup |
| ▶ Loop | Reproducir en bucle el segmento seleccionado (audio + ESP32) |
| ▶▶ Auto | Auto-avance segmento a segmento sin parar — espera confirmación beat del ESP32 antes de enviar el siguiente APPEND |
| Click nota (popup) | Escuchar nota individual · Shift+Click escucha el acorde completo |
| Marcadores | Clic derecho en la regla para añadir marcadores de sección (Intro, Verso, Estribillo…) con color personalizado |
| WiFi (WebSocket) | Protocolo ws://IP:81 · auto-reconexión cada 5s · el ESP32 debe estar en la misma red local |
| Serie (USB-CDC) | Web Serial API a 115200 baud · solo Chrome / Edge 89+ · no requiere red WiFi |
| ● estado | Verde = conectado · Rojo = desconectado · Naranja = conectando |
| ▶ Play + ESP32 | Al pulsar Play se envía secuencia PLAY al firmware con bloques ≤8KB; lotes adicionales llegan por APPEND en streaming |
| ⇄ A-B + ESP32 | Al acercarse al punto B se reenvía APPEND desde A para loop continuo en hardware sin parar los motores |
| Beat sync | El firmware emite {state:"beat",step:N} cada paso — corrige la deriva visual entre setInterval del browser y millis() del ESP32 |
| Protocolo motor | m N selecciona motor · o PWM posición neutra · t MS espera · v VEL velocidad · p; ejecuta · HIT=80ms · RETRACT=150ms |
| Log | Ventana con el log del ESP32 en tiempo real (mensajes WebSocket / Serie) |
| AudioContext scheduler | Las notas se agendan con 100ms de lookahead usando AudioContext.currentTime — timing sample-accurate sin jitter, incluso a 200 BPM |
| Playhead visual | Actualizado cada paso por setInterval — tolerancia ±30ms (invisible al ojo); independiente del scheduler de audio |
| Soundfont | MIDI.js carga soundfonts GM (128 instrumentos) · se puede cambiar de instrumento en caliente durante la reproducción |
| Motor Only | Checkbox que silencia el audio interno y reproduce solo los motores físicos del ESP32 |
| Tempo variable | El scheduler lee MS_PER_STEP(step) en cada llamada — los cambios de BPM del mapa de tempo son automáticos sin reiniciar el scheduler |
| t120 | Tempo en BPM |
| v100 | Velocity (0–127) |
| o4 | Octava base (0–8) |
| l4 | Duración por defecto: 1=redonda · 2=blanca · 4=negra · 8=corchea · 16=semicorchea |
| c d e f g a b | Notas · añadir + / # para sostenido · - para bemol · . para valor con puntillo |
| < > | Bajar / subir octava una posición |
| r | Silencio de la duración actual |
| Pistas múltiples | Separar pistas con | — cada pista va a un canal MIDI independiente |
| MIDI | Nota | Motor | HomePWM | PCA/ch | Mute | Key |
|---|