Как изменение ударов в минуту влияет на синхронизацию нот?

У меня есть формат заметки с битами, представленными в виде дробей, которые я хочу преобразовать в фактическое время (секунды).

Итак, учитывая эти данные:

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

Я вывел формулу для вычисления:

# 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)

Даю мне:

@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

Итак, мой вопрос: как должны быть затронуты тайминги последующих нот, если после ноты 2 произойдет изменение BPM? Если темп увеличился до 200, каким должен быть тайминг следующих 6 нот?

В этом формате самое начало произведения равно 1 или 0? И когда вы говорите «если бы BPM изменился после ноты 2», вы имеете в виду сразу после ноты 2 или непосредственно перед нотой 3? или где-то посередине?
В чем бы вы ни пытались разобраться, музыка в 99,9% случаев не прерывается и не меняет свой bpm. Это один из привлекательных факторов — поймайте ритм/темп и наслаждайтесь им. Конечно, вы можете написать программу, включающую это, но для меня это сломанный карандаш - бессмысленно...
@ Тим, ты никогда не слышал фрагменты, которые замедляются или ускоряются в конце? Они были довольно распространены, когда я занимался фортепиано.
@Dekkadeci - как ни странно, да. Но они никогда не замечали изменения ударов в минуту! Это называлось/называется rubato/accelerando/deccelerando, и мы просто с этим справились...
Если это новая музыка, мне придется вернуться в школу.
@Tim Я создаю ритм-игру и требую изменения темпа в середине песни.
@topomorto пьеса начинается с такта 0, но до такта 1 не будет нот. Изменение ударов в минуту может произойти в любое время между нотой 2 или нотой 3.

Ответы (1)

Если вы думаете с точки зрения алгебры, BPM подобен наклону линии в y = mx + b. Здесь y = mt + bгде yтакт, а tгде дискретное (квантованное) время. Для первого BPM b = 0, потому что наклон начинается при t = 0. Когда вы переходите на новый BPM, вам нужен ненулевой y-перехват! Этот y-перехват должен остаться там навсегда.

Один из способов сделать это — включить ссылку на последнюю ноту перед изменением ударов в минуту при 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) )

Обратите внимание, как меняется сетка ударов, начиная с позиции 0 такта 0 для нового удара в минуту. Это похоже на сброс оси времени в алгебре t = 2.5 -> t = 0.0.

Есть способ указать точку пересечения по оси Y без изменения сетки ударов , но нам все равно нужно обратиться к последней ноте перед изменением BPM. Предположим, у нас есть два наклона BPM a = 1.8461и b = 1.2, относящиеся к 130 BPM и 200 BPM соответственно. Обратите внимание на то at = bt + (a-b)t_fixed, что , где t_fixedконстанта, которая представляет, когда был изменен удар в минуту. Эта формула позволяет нам выразить новую синхронизацию нот, используя ту же сетку ударов:

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) )

Вы должны заметить, что в вашей системе значения в скобках представляют атаки или начала нот. Ноты не имеют сустейна, так что это похоже на программирование драм-машины. Итак, в вашей системе «после конца второй ноты» означает «после начала третьей ноты». В MIDI вам также нужно кодировать, когда нота заканчивается (с событиями «Note Off»).