Документация Engee

Двойки Гарибальди «нога + рука»

Рассмотрим следующий простой рудимент с дробью двойками:

dragadiddle

Этот ритм может играться либо дробью одиночными ударами, например Пп Л П Л с повтором, либо как стандартный дрэгадидл: Пп Л П П Лл П Л Л.

Дэвид Гарибальди (David Garibaldi) использует и преподает интересный прием, в котором дробь двойками заменяется комбинацией ударов ногой и рукой. При этом схема может быть любой из указанных выше, но двойной удар состоит из удара ногой и удара «бочки». Выглядит это так:

dragadiddle_garibalid

Я хотел изучить этот прием основательно и создал код, который позволил разработать нужные для этого упражнения. Помимо прочего, в нем используется относительно новая функция 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))
упражнения