Keyboardia

Crear, coeditar, analizar, publicar y exportar sesiones colaborativas de secuenciador por pasos a través de MCP.

Documentación

Keyboardia

Un secuenciador de pasos multijugador con patrones polirrítmicos, construido para la colaboración en tiempo real.

Características

  • Multijugador en tiempo real - Hasta 10 jugadores pueden tocar juntos en la misma sesión
  • Patrones polirrítmicos - Cada pista puede tener de 3 a 128 pasos (26 opciones, incluidos valores compatibles con tresillos)
  • 70 generadores de sonido - 32 sintetizadores Web Audio, 11 sintetizadores FM/AM de Tone.js, 27 instrumentos muestreados
  • 27 instrumentos muestreados - Piano de cola, kit 808, batería acústica, órgano Hammond, kalimba, tambores metálicos, cuerdas, guitarras, saxofón y más
  • Cadena de efectos - Reverberación, delay, chorus y distorsión con limitador (sincronización multijugador completa)
  • Bloqueos de parámetros - Automatización de tono, volumen y notas ligadas por paso
  • Cuadrícula cromática - Dos modos de vista: "Eventos" (intervalos de teclas + tonos usados) y "Todos" (49 tonos de -24 a +24)
  • Bloqueo de escala - Restringe la cuadrícula cromática a la escala musical seleccionada con advertencias de notas fuera de escala
  • Barra lateral de escala - Visualiza las notas de la escala con énfasis en la fundamental/quinta y resaltado de uso activo
  • Swing por pista - Ajustes de swing globales y por pista para controlar el groove
  • Compartir sesiones - Comparte enlaces, remezcla el trabajo de otros, publica sesiones inmutables
  • Compartir con código QR - Compartir sesiones compatible con dispositivos móviles
  • Edición rítmica con agente (Experimental) - Coedita, crea, remezcla, publica, exporta y analiza sesiones mediante MCP sin estado

Uso con un agente

Configura tu cliente MCP con:

https://keyboardia.dev/mcp

Para coeditar música que ya tienes, abre una sesión y dale al agente el UUID de su URL https://keyboardia.dev/s/{session_id}. Los agentes pueden leer el ritmo actual, añadir una pista, asignar pasos específicos y cambiar el tempo. Sus ediciones usan la misma sesión en vivo que los navegadores conectados, y las sesiones publicadas permanecen de solo lectura.

Los agentes también pueden empezar desde cero: crear una nueva sesión y devolver su enlace, remezclar una sesión publicada en una copia editable sin tocar la original, publicar el resultado actual como una instantánea inmutable cuando lo pidas, y exportar la sesión como archivo MIDI para un DAW.

También pueden explicar música: pregunta en qué tonalidad está una sesión, cómo se relacionan sus ritmos entre sí, o qué acorde forma un momento, y la respuesta proviene del mismo módulo de teoría musical que usa el Asistente de Tonalidad, con su incertidumbre declarada en lugar de oculta.

Consulta la especificación de segmentos rítmicos MCP sin estado para el contrato exacto de herramientas y las limitaciones actuales. Los mantenedores de directorios pueden usar el registro canónico de listados MCP, y el manejo de datos alojados se describe en el aviso de privacidad de MCP.

Pila tecnológica

  • Frontend: React 19, TypeScript, Vite
  • Audio: Web Audio API, Tone.js
  • Backend: Cloudflare Workers, Durable Objects, Almacenamiento KV
  • Tiempo real: WebSockets con Hibernation API

Primeros pasos

cd app

# Install dependencies
npm install

# Start development server
npm run dev

# Run tests
npm run test:all

# Build for production
npm run build

Desarrollo

Modo de depuración

Añade ?debug=1 a la URL para habilitar funciones de depuración:

  • Trazado de eventos
  • Depuración del estado de audio
  • Almacenamiento persistente de registros
  • Detección de patrones de errores

Consulta docs/DEVELOPMENT-TOOLS.md para documentación completa de depuración.

Estructura del proyecto

app/
├── src/
│   ├── audio/           # Audio engine, synths, effects, scheduling
│   ├── components/      # React UI components
│   ├── hooks/           # React hooks (useSession, useMultiplayer, etc.)
│   ├── state/           # State management (grid reducer)
│   ├── sync/            # Multiplayer synchronization
│   ├── worker/          # Cloudflare Worker (Durable Objects, API routes)
│   ├── utils/           # Logging, debugging, utilities
│   └── debug/           # Debug overlay and context
├── e2e/                 # End-to-end tests (Playwright)
├── test/                # Integration tests
└── scripts/             # Development and debugging scripts

Archivos clave

ArchivoDescripción
app/src/audio/engine.tsMotor de audio principal: coordina todos los subsistemas de audio
app/src/audio/scheduler.tsProgramación de anticipación sin deriva (temporizador de 25 ms, anticipación de 100 ms)
app/src/audio/synth.tsSintetizador polifónico de 16 voces con robo de voces
app/src/audio/toneSynths.tsGestor de sintetizadores Tone.js (FM, AM, Membrane, etc.)
app/src/audio/toneEffects.tsCadena de efectos (reverberación, delay, chorus, distorsión)
app/src/sync/multiplayer.tsCliente WebSocket para sincronización en tiempo real
app/src/worker/live-session.tsDurable Object para el estado de la sesión

Pruebas

cd app
npm run test:unit          # Unit tests (vitest, fast product lane)
npm run test:audio-render  # Offline audio renders (native Web Audio)
npm run test:verification-tooling  # Tests of the verification tooling itself
npm run test:integration   # Integration tests (Cloudflare Workers)
npm run test:all           # All of the above
npm run analyze:bugs       # Static bug pattern analysis

Arquitectura

Cadena de señal de audio

Source (Oscillator/Sample)
    → Track Gain (per-track volume)
    → Master Gain
    → Effects Chain (Tone.js: reverb → delay → chorus → distortion)
    → Limiter
    → Compressor
    → Destination

Motores de sintetizador

  1. SynthEngine (synth.ts) - Osciladores Web Audio nativos, más de 40 preajustes
  2. ToneSynthManager (toneSynths.ts) - Sintetizadores FM/AM/Membrane de Tone.js
  3. AdvancedSynthEngine (advancedSynth.ts) - Doble oscilador con envolvente de filtro y LFO
  4. SampledInstrument (sampled-instrument.ts) - Reproducción basada en muestras (piano)

Arquitectura multijugador

Client A ←→ Durable Object ←→ Client B
              ↓
        DO Storage (immediate)
              ↓
        KV Storage (on disconnect)
  • Cada sesión es una única instancia de Durable Object
  • Las conexiones WebSocket usan Hibernation API para eficiencia de costos
  • Los cambios de estado se transmiten a todos los clientes conectados
  • Persistencia híbrida: Las mutaciones se guardan inmediatamente en el almacenamiento de DO, KV se actualiza al desconectarse

Documentación

Licencia

MIT

Las muestras de instrumentos incluidas son contenido de terceros con sus propias licencias (CC0, dominio público y términos de uso libre similares), documentadas en app/public/instruments/LICENSE.md.