¿Cómo afecta el cambio de bpm a la sincronización de las notas?

Tengo un formato de nota con latidos representados como fracciones de medida que quiero convertir a tiempo real (segundos).

Así que dados estos datos:

number, title, measure, position

1 NOTE 2 0.0
2 NOTE 2 0.25
3 NOTE 2 0.5
4 NOTE 2 0.75

5 NOTE 3 0.0
6 NOTE 3 0.25
7 NOTE 3 0.5
8 NOTE 3 0.75

Derivé la fórmula para calcular:

# This assumes 4/4 time signature, 4 beats per measure so...
1.) measure duration = (60/bpm) * 4;

2.) note timing (seconds) = measure duration * ( measure + position)

Dando me:

@130 bpm:

measure duration = (60/130) * 4 = 1.8461...

note timing = 1.8461 * ( measure + position)

number, title, measure, position, (seconds)

1 NOTE 2 0.0  ( 1.8461 * (2 + 0.0 ) )
2 NOTE 2 0.25 ( 1.8461 * (2 + 0.25) )
3 NOTE 2 0.5  ( 1.8461 * (2 + 0.5 ) )
4 NOTE 2 0.75 ( 1.8461 * (2 + 0.75) )

5 NOTE 3 0.0  (and so on...)
6 NOTE 3 0.25
7 NOTE 3 0.5
8 NOTE 3 0.75

Así que mi pregunta es, ¿cómo deberían verse afectados los tiempos de las notas siguientes si hubiera un cambio de BPM después de la nota 2? Si los bpm aumentaron a 200, ¿cuáles deberían ser los tiempos de las próximas 6 notas?

En este formato, ¿el inicio de la pieza es la medida 1 o la medida 0? Y cuando dices "si hubiera un cambio de BPM después de la nota 2", ¿quieres decir inmediatamente después de la nota 2 o justo antes de la nota 3? o en algún punto intermedio?
Independientemente de lo que esté tratando de resolver, la música en el 99,9% de los casos no corta ni cambia sus bpm. Ese es uno de los factores entrañables: aferrarse a un ritmo/tempo y disfrutarlo. Por supuesto que puedes escribir un programa que abarque esto, pero para mí es un lápiz roto, sin sentido...
@Tim, ¿nunca has escuchado piezas que se ralentizan o aceleran al final? Eran bastante comunes cuando estaba practicando piano.
@Dekkadeci: curiosamente, sí. ¡Pero nunca notaron un cambio de bpm! Se llamaba/se llama rubato/accelerando/ deccelerando y nos pusimos manos a la obra...
Si esta es la nueva música, voy a tener que volver a la escuela.
@Tim Me gusta crear un juego de ritmo y requiere cambios de bpm en el medio de la canción.
@topomorto la pieza comienza en el compás 0 pero no habría notas antes del compás 1. El cambio de bpm puede ocurrir en cualquier momento entre la nota 2 o la nota 3.

Respuestas (1)

Si piensas en términos de álgebra, el BPM es como la pendiente de una línea en y = mx + b. Aquí y = mt + bdonde yes un latido y tes tiempo discreto (cuantificado). Para el primer BPM, b = 0 porque la pendiente comienza en t = 0. Cuando cambias a un nuevo BPM, ¡necesitas una intersección y distinta de cero! Ese intercepto en y tendrá que permanecer allí para siempre.

Una forma de hacerlo es incluir una referencia a la última nota antes del cambio de bpm en t = 2,5.

BPM#1 measure duration = (60/130) * 4 = 1.8461
BPM#2 measure duration = (60/200) * 4 = 1.2

number, title, measure, position, (seconds)

1 NOTE 2 0.0  ( 1.8461 * (2 + 0.0 ) )
2 NOTE 2 0.25 ( 1.8461 * (2 + 0.25) )
3 NOTE 2 0.5  (    1.2 * (0 + 0.0 ) + 1.8461 * (2 + 0.5 ) )
4 NOTE 2 0.75 (    1.2 * (0 + 0.25) + 1.8461 * (2 + 0.5) )

5 NOTE 3 0.0  (    1.2 * (0 + 0.50) + 1.8461 * (2 + 0.5) )
6 NOTE 3 0.25 (    1.2 * (0 + 0.75) + 1.8461 * (2 + 0.5) )
7 NOTE 3 0.5  (    1.2 * (1 + 0.0 ) + 1.8461 * (2 + 0.5) )
8 NOTE 3 0.75 (    1.2 * (1 + 0.25) + 1.8461 * (2 + 0.5) )

Observe cómo cambia la cuadrícula de tiempos, comenzando en la posición 0 del compás 0 para los nuevos bpm. Esto es como restablecer el eje del tiempo en álgebra t = 2.5 -> t = 0.0.

Para especificar la intersección y sin cambiar la cuadrícula de pulsos , hay una manera, pero aún necesitamos referirnos a la última nota antes de que cambien los BPM. Supongamos que tenemos dos pendientes de BPM, a = 1.8461y b = 1.2, que se refieren a 130 BPM y 200 BPM, respectivamente. Observe que at = bt + (a-b)t_fixed, donde t_fixedes una constante que representa cuándo se cambiaron los bpm. Esta fórmula nos permite expresar la nueva temporización de las notas utilizando la misma cuadrícula de tiempos:

BPM#1 measure duration = (60/130) * 4 = 1.8461
BPM#2 measure duration = (60/200) * 4 = 1.2

number, title, measure, position, (seconds)

1 NOTE 2 0.0  ( 1.8461 * (2 + 0.0 ) )
2 NOTE 2 0.25 ( 1.8461 * (2 + 0.25) )
3 NOTE 2 0.5  (    1.2 * (2 + 0.50) + (1.8461 - 1.2) * (2 + 0.5 ))
4 NOTE 2 0.75 (    1.2 * (2 + 0.75) + (1.8461 - 1.2) * (2 + 0.5) )

5 NOTE 3 0.0  (    1.2 * (3 + 0.0 ) + (1.8461 - 1.2) * (2 + 0.5) )
6 NOTE 3 0.25 (    1.2 * (3 + 0.25) + (1.8461 - 1.2) * (2 + 0.5) )
7 NOTE 3 0.5  (    1.2 * (3 + 0.50) + (1.8461 - 1.2) * (2 + 0.5) )
8 NOTE 3 0.75 (    1.2 * (3 + 0.75) + (1.8461 - 1.2) * (2 + 0.5) )

Debe notar que en su sistema, los valores entre paréntesis representan ataques o inicios de las notas. Las notas no tienen sustain, así que esto es como programar una caja de ritmos. Entonces, en su sistema, 'después del final de la segunda nota' significa 'después del comienzo de la tercera nota'. En MIDI, también debe codificar cuando finaliza la nota (con eventos de "Nota desactivada").