У меня есть формат заметки с битами, представленными в виде дробей, которые я хочу преобразовать в фактическое время (секунды).
Итак, учитывая эти данные:
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 нот?
Если вы думаете с точки зрения алгебры, 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»).
Нет войны
Тим
Деккадечи
Тим
тощий павлин
Брент Эндрю Дж. Мирас
Брент Эндрю Дж. Мирас