El BPM (beats por minuto) es el latido de una pista. Equivócate por un beat y un remix no encaja; equivócate por una octava y tu set DJ se cae a pedazos. Este detector usa autocorrelación de envolvente de onsets con corrección de error de octava para leer el tempo de cualquier archivo de audio en tu navegador. Suelta un archivo, recibe un número — típicamente con ±2 BPM de margen sobre la verdad de campo en material rítmico.
Qué mide realmente la detección de BPM
La detección de BPM busca la periodicidad en la envolvente energética de una señal. El enfoque clásico: calcular un RMS de ventana corta, tomar la derivada media-rectificada para obtener una señal de onsets y, a continuación, autocorrelacionar para encontrar el periodo de beat más probable. Los casos límite incluyen los tempos que no caen en límites enteros de fotograma (174 BPM es famoso por lo complicado), las canciones con un fuerte acento en la media compás que engañan al detector y le hacen reportar la mitad del tempo, y las canciones sin contenido rítmico claro. Mitigamos el caso común de error de octava comprobando si el tempo doblado también tiene un pico de autocorrelación marcado — si es así, preferimos la lectura más rápida, ya que el tempo percibido por el oyente suele estar en el rango de 100-180 BPM.
Cómo funciona este detector
El audio lo decodifica la Web Audio API y se mezcla a mono. Calculamos una envolvente RMS a 100 Hz de tasa de fotograma (salto de 10 ms, ventana de 20 ms) y, a continuación, media-rectificamos la primera diferencia para aislar los onsets. La autocorrelación recorre los retardos correspondientes a 60-200 BPM. Tras elegir el pico más fuerte, aplicamos una corrección de octava a posteriori: si el medio retardo (= tempo doblado) tiene un pico al menos al 45 % del elegido, cambiamos a la lectura más rápida. Una interpolación parabólica alrededor del pico elegido da precisión de BPM sub-fotograma. Todo corre en TypeScript de navegador sobre Float32Array — sin librerías externas, sin servidor.
Cuándo usar esta herramienta
- Beatmatching en sets DJ y actuaciones en directo
- Encajar remixes y stems al tempo de una pista de referencia
- Ajustar el tempo de proyecto de tu DAW antes de importar una toma grabada
- Auditar samples y loops de batería para asegurarte de que están etiquetados correctamente
- Comprobación rápida de ritmo en una canción a la que no puedes seguir el compás
Preguntas frecuentes
- ¿Qué precisión tiene la detección?
- Sobre material rítmicamente claro (la mayor parte del pop, dance, hip-hop, rock con batería), espera ±2 BPM. Sobre material con percusión débil o ausente (orquestal, ambient, baladas acústicas), el algoritmo tiene menos a lo que agarrarse y puede reportar la mitad o el doble del tempo. La confianza se reporta junto al BPM — una confianza baja significa que conviene tomarse el resultado con cautela.
- ¿Por qué a veces reporta la mitad del BPM esperado?
- La detección de BPM es un problema intrínsecamente ambiguo cuando hay periodicidad a varias tasas relacionadas armónicamente. Detectamos este caso y preferimos la lectura más rápida, pero en canciones muy lentas (60-80 BPM) con subdivisión fuerte, el detector puede seguir eligiendo el tempo doblado. Compáralo con tu propia lectura por tap-tempo si no te suena bien.
- ¿Soporta canciones con tempo variable?
- No demasiado bien. La lectura integrada refleja el tempo medio de toda la pista. Para canciones con cambios de tempo sección a sección, un algoritmo de beat-tracking con salida fotograma a fotograma es la herramienta adecuada — pero es mucho más pesada y poco apropiada para una utilidad gratuita en navegador.
- ¿Y si mi pista no tiene batería?
- El material acústico / ambient / no percusivo es el caso más difícil. La envolvente de onsets capta los ataques de notas tonales, pero son mucho más débiles que los golpes de batería. La confianza será baja y el resultado, poco fiable. En esos casos puede ser mejor introducir el BPM a mano según la intención del compositor.
Privacidad
Tu archivo se analiza íntegramente en esta pestaña del navegador — decodificado por la Web Audio API, procesado por TypeScript de navegador, nunca subido. Cerrar la pestaña borra todo el estado de trabajo.