Двойки Гарибальди «нога + рука»
Рассмотрим следующий простой рудимент с дробью двойками:
Этот ритм может играться либо дробью одиночными ударами, например Пп Л П Л с повтором, либо как стандартный дрэгадидл: Пп Л П П Лл П Л Л.
Дэвид Гарибальди (David Garibaldi) использует и преподает интересный прием, в котором дробь двойками заменяется комбинацией ударов ногой и рукой. При этом схема может быть любой из указанных выше, но двойной удар состоит из удара ногой и удара «бочки». Выглядит это так:
Я хотел изучить этот прием основательно и создал код, который позволил разработать нужные для этого упражнения. Помимо прочего, в нем используется относительно новая функция random_notes_sequence
, которая присваивает веса вероятности различным схемам, чтобы они появлялись чаще или реже.
Упражнения
Прежде чем углубляться в случайные последовательности этого нового типа ритма, создадим несколько простых упражнений, в которых этот ритм используется в разных местах такта. В качестве схемы игры принимаются одиночные удары, чтобы были варианты упражнений с двумя ударами ногой и рукой друг за другом.
Сначала давайте определим основные переменные, необходимые для данного кода. Перед чтением этого материала обязательно ознакомьтесь с разделом Барабанная нотация, чтобы понимать, почему именно так я записываю ноты для ударных инструментов в MuseScore.
using MusicVisualizations # повторно экспортируем MusicManipulations
bass = "Acoustic Bass Drum"
snare = "Acoustic Snare"
tom = "Low-Mid Tom"
tpq = 960 # длительность четвертной ноты в импульсах
sixt = 960 ÷ 4 # длительность шестнадцатой ноты в импульсах
240
Обратите внимание, что для создания ритмов необходимы всего два разных «мотива»: один с двойным ударом «нога + рука» и еще один с одиночным ударом. Затем с помощью изящного кода можно построить все возможные комбинации.
motif0 = [DrumNote(snare, 0, sixt)]
motif1 = [DrumNote(bass, 0, sixt÷2), DrumNote(tom, sixt÷2, sixt÷2)]
2-element Vector{Note}:
Note B1 | vel = 100 | pos = 0, dur = 120 | channel 9
Note B2 | vel = 100 | pos = 120, dur = 120 | channel 9
Сначала нужно создать ряд базовых упражнений, в которых этот двойной удар ногой и рукой будет встречаться в различных позициях в пределах четвертной ноты. Всего таких вариантов четыре. Далее мы сохраним их в одном контейнере exercises
, причем каждое упражнение будет иметь длину bars
тактов.
bars = 2
exercises = Note[]
for j in 1:4 # создаем 4 возможных варианта
# Создаем одну четвертную ноту для вариантов
exercise = [translate(motif0, k*sixt) for k in 0:3]
exercise[j] = translate(motif1, (j-1)*sixt)
exercise = vcat(exercise...)
ex0 = copy(exercise)
# Повторяем, чтобы заполнить один такт вариантами. 1 четвертная нота = 4 шестнадцатых
for k in 1:3; append!(exercise, translate(ex0, 4k*sixt)); end
ex0 = copy(exercise)
# Повторяем столько тактов, сколько необходимо. 1 такт = 16 шестнадцатых
for b in 0:bars-1; append!(exercise, translate(ex0, 16b*sixt)); end
# Добавим результат в упражнения (с преобразованием с учетом тактов)
append!(exercises, translate(exercise, (j-1)*bars*16*sixt))
end
Затем мы создаем второй тип упражнения, в котором одна четвертная нота будет содержать две двойки «нога + рука». Сделать это можно двумя способами (предполагается, что двойки не должны находиться рядом друг с другом).
for j in 5:6
exercise = [translate(motif0, k*sixt) for k in 0:7] # повторяем 8 раз
for m in (j, j+2)
exercise[m] = translate(motif1, (m-1)*sixt)
end
exercise = vcat(exercise...)
ex0 = copy(exercise)
# Повторяем, чтобы заполнить один такт вариантами. 1 четвертная нота = 4 шестнадцатых
# Обратите внимание, что это ритм не из 2 четвертных
for k in 1:1; append!(exercise, translate(ex0, 8k*sixt)); end
ex0 = copy(exercise)
# Повторяем столько тактов, сколько необходимо. 1 такт = 16 шестнадцатых
for b in 0:bars-1; append!(exercise, translate(ex0, 16b*sixt)); end
# Добавим результат в упражнения (с преобразованием с учетом тактов)
append!(exercises, translate(exercise, (j-1)*bars*16*sixt))
end
Наконец, последнее упражнение заключается в повторении двоек «нога + рука» каждые три шестнадцатые ноты.
motif001 = [
DrumNote(bass, 0, sixt÷2),
DrumNote(tom, sixt÷2, sixt÷2),
DrumNote(snare, sixt, sixt),
DrumNote(snare,2sixt, sixt),
]
j = 7
exercise = [translate(motif001, 3k*sixt) for k in 0:7] # повторяем 10 раз
exercise = vcat(exercise...)
append!(exercises, translate(exercise, (j-1)*bars*16*sixt))
exercises
392-element Vector{Note}:
Note B1 | vel = 100 | pos = 0, dur = 120 | channel 9
Note B2 | vel = 100 | pos = 120, dur = 120 | channel 9
Note D2 | vel = 100 | pos = 240, dur = 240 | channel 9
Note D2 | vel = 100 | pos = 480, dur = 240 | channel 9
Note D2 | vel = 100 | pos = 720, dur = 240 | channel 9
Note B1 | vel = 100 | pos = 960, dur = 120 | channel 9
Note B2 | vel = 100 | pos = 1080, dur = 120 | channel 9
Note D2 | vel = 100 | pos = 1200, dur = 240 | channel 9
Note D2 | vel = 100 | pos = 1440, dur = 240 | channel 9
Note D2 | vel = 100 | pos = 1680, dur = 240 | channel 9
⋮
Note D2 | vel = 100 | pos = 50160, dur = 240 | channel 9
Note B1 | vel = 100 | pos = 50400, dur = 120 | channel 9
Note B2 | vel = 100 | pos = 50520, dur = 120 | channel 9
Note D2 | vel = 100 | pos = 50640, dur = 240 | channel 9
Note D2 | vel = 100 | pos = 50880, dur = 240 | channel 9
Note B1 | vel = 100 | pos = 51120, dur = 120 | channel 9
Note B2 | vel = 100 | pos = 51240, dur = 120 | channel 9
Note D2 | vel = 100 | pos = 51360, dur = 240 | channel 9
Note D2 | vel = 100 | pos = 51600, dur = 240 | channel 9
Теперь используем musescore
, чтобы создать лист упражнений:
musescore("garibaldi_draga_exercise.png", Notes(exercises, tpq))

Случайные упражнения
Теперь мы хотим добавлять случайные последовательности с двойными ударами «нога + рука» в случайных местах. Это можно легко сделать с помощью random_notes_sequence
. Однако мы должны быть уверены, что за двойным ударом никогда не последует еще один двойной удар. Для этого определим следующий объект:
motif2 = [
DrumNote(bass, 0, sixt÷2),
DrumNote(tom, sixt÷2, sixt÷2),
DrumNote(snare, sixt, sixt),
]
3-element Vector{Note}:
Note B1 | vel = 100 | pos = 0, dur = 120 | channel 9
Note B2 | vel = 100 | pos = 120, dur = 120 | channel 9
Note D2 | vel = 100 | pos = 240, dur = 240 | channel 9
Напомним, что motif0
— это обычный одиночный удар. Поэтому нужно случайным образом комбинировать motif0
и motif2
:
motifs = Notes.([motif0, motif2], tpq)
2-element Vector{Notes{Note}}:
Notes{Note} with 1 notes
Notes{Note} with 3 notes
Чтобы упражнение было не слишком трудным, нужно, чтобы двойной удар встречался не слишком часто. Для этого достаточно скорректировать значение именованного аргумента weight
:
rseq, = random_notes_sequence(motifs, 16sixt*16; weights = [4, 1])
rseq
301 Notes with tpq=960
Note D2 | vel = 100 | pos = 0, dur = 240 | channel 9
Note B1 | vel = 100 | pos = 240, dur = 120 | channel 9
Note B2 | vel = 100 | pos = 360, dur = 120 | channel 9
Note D2 | vel = 100 | pos = 480, dur = 240 | channel 9
Note D2 | vel = 100 | pos = 720, dur = 240 | channel 9
Note D2 | vel = 100 | pos = 960, dur = 240 | channel 9
Note D2 | vel = 100 | pos = 1200, dur = 240 | channel 9
⋮
Note D2 | vel = 100 | pos = 60000, dur = 240 | channel 9
Note B1 | vel = 100 | pos = 60240, dur = 120 | channel 9
Note B2 | vel = 100 | pos = 60360, dur = 120 | channel 9
Note D2 | vel = 100 | pos = 60480, dur = 240 | channel 9
Note D2 | vel = 100 | pos = 60720, dur = 240 | channel 9
Note D2 | vel = 100 | pos = 60960, dur = 240 | channel 9
Note D2 | vel = 100 | pos = 61200, dur = 240 | channel 9
И снова экспортируем результат в партитуру:
musescore("garibaldi_draga_sequence_easy.png", Notes(exercises, tpq))

Наконец, создадим еще одно упражнение, в котором двойка «нога + рука» встречается немного чаще.
rseq, = random_notes_sequence(motifs, 16sixt*16; weights = [2, 1])
(Notes{Note} with 321 notes, [1, 1, 2, 2, 1, 2, 2, 1, 1, 1 … 1, 1, 2, 1, 2, 1, 1, 2, 2, 1])
musescore("garibaldi_draga_sequence_hard.png", Notes(exercises, tpq))
