Metrónomo en Línea (Tap Tempo)
Un metrónomo en línea gratuito con temporización de precisión de muestra, pulsos por compás ajustables, un pulso visual acentuado y un botón de tap-tempo para encontrar cualquier BPM de oído.
226 visitas
Toca al ritmo — se necesitan al menos 2 toques
Usa el planificador look-ahead de la Web Audio API (AudioContext.currentTime) para una sincronización precisa a nivel de muestra — no es un simple setInterval, por lo que no hay desfase incluso con la página muy cargada.
Por Qué la Mayoría de los Metrónomos de Navegador se Desincronizan
La forma obvia de construir un metrónomo en JavaScript es setInterval(playClick, 60000 / bpm). Funciona durante unos segundos — y luego deja de hacerlo. setInterval solo garantiza que una función de retorno se dispare no antes del retraso solicitado, nunca cuánto más tarde podría realmente ejecutarse. El hilo principal de JS se comparte con todo lo que hace la página — actualizaciones del DOM, cálculos de diseño, recolección de basura — y cualquiera de ellos puede retrasar un temporizador pendiente decenas de milisegundos. Para la mayoría del código de interfaz eso es invisible; para un metrónomo es fatal, ya que un clic con 40 ms de retraso en este pulso y 10 ms en el siguiente se percibe como una deriva audible en lugar de sonar simplemente «un poco desfasado», engañando activamente a un músico que practica con él.
Los músicos confían en un metrónomo precisamente porque la percepción humana del tiempo constante es poco fiable sin una referencia externa — todo el propósito del dispositivo desde que Johann Maelzel patentó la versión de cuerda en 1815. Un metrónomo de software que él mismo se desincroniza frustra ese propósito, y la solución no es un temporizador más ingenioso: todo temporizador de JS, incluido requestAnimationFrame, comparte el mismo cuello de botella del hilo principal. La verdadera solución es dejar de pedirle a JavaScript que produzca el sonido en el momento exacto.
Programación Anticipada (Look-Ahead Scheduling): Cómo Este Metrónomo se Mantiene Preciso
Esta herramienta utiliza el patrón popularizado por Chris Wilson, antiguo miembro del equipo de Web Audio de Google Chrome, en su artículo ampliamente citado «A Tale of Two Clocks»: separar por completo la lógica de programación del temporizado del sonido. El AudioContext de la Web Audio API se ejecuta en su propio hilo de audio con un reloj de precisión de muestra, expuesto a JavaScript como AudioContext.currentTime. Llamar a osc.start(t) con una marca de tiempo futura de ese reloj hace que el motor de audio lo reproduzca exactamente en t, sin importar qué esté haciendo el hilo principal en ese instante — nunca tuvo que «despertarse» justo en el pulso para que ocurriera.
El único trabajo del hilo principal es llevar la contabilidad: aproximadamente cada 25 ms, un planificador comprueba si hay pulsos dentro de los siguientes 100 ms y llama a osc.start() para cada uno con su exacto currentTime futuro. Como ese bucle solo necesita ser aproximadamente puntual, el jitter habitual no causa ningún problema audible — el sonido sigue programado con precisión de muestra. Cada clic es una ráfaga de oscilador de ~30 ms, más agudo en el primer pulso de cada compás para marcar un acento audible, sincronizado con un pulso visual correspondiente.
Tap Tempo resuelve un problema distinto: encontrar el BPM de una música sin ninguna partitura de la que leerlo. Da toques al ritmo del pulso; la herramienta mide el intervalo entre toques y lo convierte con 60000 / intervaloPromedioMs. Se requieren al menos dos toques, y promediar los toques recientes suaviza los pequeños errores de temporización. Una pausa de más de dos segundos reinicia la secuencia, ya que normalmente eso significa que se perdió el pulso en lugar de que este se haya ralentizado drásticamente.
Preguntas Frecuentes
¿Por qué un metrónomo simple con setInterval suena irregular con el tiempo?
setInterval solo promete que una función se disparará no antes del retraso solicitado — puede dispararse más tarde cada vez que el hilo principal esté ocupado con el diseño, la recolección de basura u otra actividad de la pestaña. Esos pequeños retrasos irregulares se acumulan pulso tras pulso, así que el clic se desincroniza audiblemente en lugar de mantenerse fijo al tempo. Esta herramienta evita eso delegando la temporización real del sonido al propio reloj del hilo de audio de la Web Audio API, en lugar de confiar en que el temporizador de JS se dispare en el instante exacto.
¿Qué es la «programación anticipada» (look-ahead scheduling) y por qué corrige la deriva?
Es un patrón en el que JavaScript nunca intenta reproducir un sonido justo en el instante en que corresponde. Un bucle comprueba cada ~25 ms si algún pulso cae dentro de los siguientes 100 ms y programa por adelantado un oscilador para cada uno usando AudioContext.currentTime más el desfase exacto, mediante osc.start(tiempoFuturoPreciso). El motor de audio dispara ese oscilador con precisión de muestra en su propio hilo, independiente del hilo principal — así el bucle de programación puede ser impreciso mientras el pulso real se mantiene exacto.
¿Cómo calcula el BPM la función Tap Tempo?
Cada clic en el botón Tap Tempo registra una marca de tiempo. A partir del segundo toque, la herramienta mide el intervalo desde el toque anterior, mantiene un breve historial reciente de intervalos y convierte su promedio en un tempo dividiendo 60000 entre el intervalo promedio en milisegundos. Se necesitan al menos dos toques, y una pausa de más de dos segundos reinicia la secuencia, ya que casi siempre significa que se dejó de tocar en lugar de continuar a un tempo extremadamente lento.
¿Por qué el primer pulso de cada compás tiene un tono distinto?
Es un acento, estándar tanto en metrónomos mecánicos como digitales: el primer tiempo (beat uno) suena en una frecuencia más alta que el resto, junto con un pulso visual de otro color. Eso permite identificar de un vistazo o de oído dónde cae el «uno» en un compás de 3/4 u 8/6, lo cual importa para contar los compases correctamente, especialmente en compases donde, de otro modo, cada pulso sonaría idéntico.
¿Qué rango de BPM cubre este metrónomo y qué significa BPM?
BPM significa pulsos por minuto (beats per minute) — cuántos pulsos ocurren en sesenta segundos. Esta herramienta admite de 30 a 300 BPM, cubriendo prácticamente todo el rango usado en la música escrita: una indicación Grave se sitúa alrededor de 25-45 BPM, el tempo de marcha Andante ronda los 76-108, y los pasajes Presto pueden superar los 200 BPM. 120 BPM es el valor predeterminado porque es un tempo de práctica común y cómodo, además de la clásica indicación Moderato.
Herramientas Similares
Reportar un Problema
Metrónomo en Línea (Tap Tempo)
Comentarios
Aún no hay comentarios — ¡sé el primero en escribir uno!