"Arquitectura para el caos lírico. No es un editor de texto. Es un motor de construcción de canciones."
Chanteos destruye el paradigma del documento lineal. Las canciones no son texto — son estructuras temporales con arquitectura rítmica. Este sistema implementa:
- Block-Based Lyric Engine: Cada línea es una entidad atómica con timestamp, sílabas, y tipo.
- Audio-First Workflow: Sincronización precisa entre playback y escritura.
- AI-Powered Rhymes: Sugerencias contextuales vía Google Gemini.
- Zero-Server Architecture: Todo vive localmente (IndexedDB + LocalStorage).
El núcleo del sistema. Cada línea de letra es un objeto estructurado:
interface LyricLine {
id: string;
type: 'lyric' | 'prompt'; // Letra vs Instrucción estructural
timestamp: string; // "1:23" - Sync con audio
text: string;
syllableCount: number; // Cálculo automático en español
}Características:
- ⏱️ Smart Timestamping:
#añade timestamp a línea actual o crea nueva - 🔢 Syllable Counter: Algoritmo de silabeo español en tiempo real
- 📝 Dual Line Types:
lyric: Letras normales con timestamp y sílabasprompt: Instrucciones estructurales ([Verse],[Chorus]) sin timestamp
- ↩️ Undo/Redo: Historia completa con debouncing inteligente (500ms)
- 🎯 Active Line Sync: Highlighting automático basado en playback
Reproductor de audio con controles de precisión quirúrgica:
Controles:
- ⏯️ Play/Pause: Centro de comando
- ⏪⏩ Skip ±3s: Navegación rápida
- 🔁 Loop A-B: Marca punto A, marca punto B, loop infinito entre ambos
- ⚡ Playback Speed: 0.5x → 0.75x → 1x → 1.25x → 1.5x
- 📍 Timeline Scrubbing: Seek preciso con preview de tiempo
Persistencia:
- 💾 IndexedDB Storage: Audio guardado como Blob (evita límite 5MB de localStorage)
- 🔗 Blob URL Caching: Sesión activa mantiene URLs en memoria
- 🔄 Auto-Restore: Carga audio al reabrir proyecto
Integración con Google Gemini para sugerencias lingüísticas:
Activación:
- Doble-click en palabra → Selección automática
- Panel slide-up con sugerencias
- Click en palabra → Nueva búsqueda recursiva
Respuesta:
{
"rhymes": ["cielo", "vuelo", "hielo", "suelo"], // Rimas consonantes
"related": ["aire", "libertad", "altura", "alas"] // Palabras contextuales
}Configuración requerida:
- API Key de Google Gemini en Settings
- Guardada localmente (localStorage:
gemini_api_key) - Modelo:
gemini-2.0-flash
Biblioteca de fragmentos estructurales reutilizables:
Uso:
- Crear plantillas en Settings (ej: estructuras Suno AI)
- Insertar desde player (botón 🎵)
- Se añaden como líneas tipo
prompt
Ejemplo plantilla:
[Verse]
[Chorus]
[Verse]
[Chorus]
[Bridge]
[Chorus]
Formato propietario basado en ZIP:
Estructura .CHNT:
proyecto.chnt/
├── project.json # Metadata + letras + timestamps
└── audio.mp3 # Archivo de audio original
Exportaciones disponibles:
.CHNT→ Proyecto completo (importable).TXT→ Solo letras formateadas (para uso externo)
- Runtime: Vite 5 (HMR ultra-rápido)
- Framework: React 18 (Concurrent Mode)
- Language: TypeScript (Strict Mode)
- Styling: Tailwind CSS + Shadcn/UI Components
- React Query: Cache de datos async
- Custom Hooks: Estado local optimizado
- Refs: Estabilidad de callbacks
- IndexedDB: Audio files (ilimitado)
- LocalStorage: Metadata + Settings + Lyrics
- Blob URLs: Audio runtime cache
- Web Audio API: Playback control
- Visual Viewport API: Keyboard height detection (mobile)
- Google Gemini API: Rhyme generation
Node.js 18+
npm / pnpm / bun# Clonar
git clone <repo>
cd chanteos
# Instalar dependencias
npm install
# Desarrollo
npm run dev
# Build
npm run build- Obtener API Key: https://makersuite.google.com/app/apikey
- Settings → API Configuration
- Pegar key → Guardar
- Seleccionar palabras para ver rimas
- Keyboard Detection: Visual Viewport API detecta altura de teclado
- Player Reposition: Audio player se mueve sobre teclado (no queda oculto)
- Safe Areas: Respeta notch y gestos del sistema
- Touch Optimized: Controles grandes (44px+ tap targets)
- Keyboard Shortcuts: (Próximamente)
- Drag & Drop: Audio import
- Multi-window: (Roadmap)
src/
├── components/
│ ├── AudioPlayer.tsx # Player con loop A-B y controles
│ ├── LyricLine.tsx # Línea individual editable
│ ├── PromptLine.tsx # Línea estructural (no editable timestamp)
│ ├── RhymePanel.tsx # Panel de sugerencias AI
│ ├── SongEditor.tsx # Editor principal
│ ├── SongList.tsx # Lista de proyectos
│ ├── SettingsDialog.tsx # Configuración global
│ └── ui/ # Shadcn components
├── hooks/
│ ├── useAudioPlayer.ts # Lógica de playback
│ ├── useLyricsHistory.ts # Undo/Redo con debouncing
│ ├── useRhymeSuggestions.ts # Integración Gemini
│ ├── useSongs.ts # CRUD de proyectos
│ └── useKeyboardHeight.ts # Detección teclado móvil
├── lib/
│ ├── audioStorage.ts # IndexedDB wrapper
│ ├── gemini.ts # Google AI client
│ ├── projectFile.ts # Import/Export .CHNT
│ ├── syllables.ts # Contador de sílabas español
│ └── utils.ts # Helpers
└── types/
└── song.ts # TypeScript interfaces
- Zero Cloud: Todo es local. No hay servidores Chanteos.
- API Keys: Gemini key guardada en tu navegador (no se envía a ningún lado excepto Google).
- Audio Files: IndexedDB (mismo origen, no compartido entre sitios).
- Export Portability:
.CHNTfiles son portables entre dispositivos.
- Waveform visualization
- Multi-track support
- Keyboard shortcuts
- Collaborative editing (WebRTC)
- Melody suggestions
- Chord progression generator
- Sentiment analysis
- Translation engine
- Desktop app (Tauri)
- Cloud sync (opcional)
- Plugin system
- VST integration
| Issue | Status | Workaround |
|---|---|---|
| Mobile layout shifts en screens <375px | 🟡 Tracked | Use landscape |
| Audio no persiste en refresh (session cache) | 🟢 Fixed | Usa IndexedDB |
| Gemini rate limiting en rapid queries | 🟡 Known | Debounce implementado |
- Read
AGENTS.md- Protocolo de desarrollo - Check
CONTEXT.md- Estado actual del sistema - Branch naming:
feature/,fix/,refactor/ - Commits: Descriptivos, no fluff
- TypeScript Strict Mode - No
any - Functional Components - No classes
- Hooks over HOCs - Composición moderna
- Tailwind only - No CSS custom (excepto index.css)
MIT - Build whatever you want with this.
Built with:
- React Team - Concurrent rendering
- Vercel - Vite tooling
- Radix UI - Accessible primitives
- Google - Gemini AI
- Shadcn - Component patterns
"Order from Chaos. Music from Noise."
Chanteos v0.1.1 - Lean Prototype