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

Гэддизмы из тридцать вторых нот

Введение

Стив Гэдд (Steve Gadd) известен тем, что был одним из первых, кто популяризировал исполнение быстрых тридцать вторых нот между хай-хэтом, малым барабаном и большим барабаном, обычно используя комбинацию рудиментов, таких как обратные двойки и парадидлы. Некоторые называют их «пульсирующие ходы» (flutter lick), но я буду использовать здесь термин «гэддизм».

Первоначально я познакомился с этим приемом из видео на YouTube от Jungleritter, но к нему обращались и многие другие преподаватели игры на ударных, например Остин Берчем (Austin Burcham). Чтобы получить представление, можно посмотреть следующие выступления Стива Гэдда:

0
0

Самый простой вариант гэддизмов, безусловно, выглядит так.

standard 1

В этом уроке я расскажу о том, как разрабатывал упражнения для освоения этих гэддизмов так, что мне не приходилось записывать каждую комбинацию одну за другой и я мог легко добавлять их в партитуру или удалять их из нее.

Окончательный результат этого урока выглядит примерно так:

random1 1

И так:

gaddmatrix 1234x123

После того как я отрепетирую все это как следует, я смогу играть вживую в составе моей группы следующее:

Создание гэддизмов с помощью кода Julia

Перед чтением этого материала обязательно ознакомьтесь с разделом Барабанная нотация, чтобы понимать, почему именно так я записываю ноты для ударных инструментов в MuseScore.

Сначала давайте загрузим ряд базовых пакетов и определим некоторые значения:

using MusicManipulations # инструменты для работы с MIDI-данными
using MusicVisualizations # доступ к MuseScore

kick = "Low Floor Tom"
snare = "Acoustic Snare"
stick = "Side Stick"
hihat = "Closed Hi-Hat"

tpq = 960          # Длительность четвертной ноты в импульсах
subdiv = tpq÷8     # длительность доли (тридцать второй ноты)
patlen = 8*subdiv  # длина ритма
960

Далее определим типы нот, которые будут составлять создаваемый ритм из тридцать вторых нот:

A = DrumNote(snare, 0, subdiv; velocity = 100)
R = DrumNote(hihat, 0, subdiv; velocity = 70)
L = DrumNote(stick, 0, subdiv; velocity = 70)
K = DrumNote(kick,  0, subdiv; velocity = 80)
Note F2  | vel = 80  | pos = 0, dur = 120 | channel 9

Я сделал ноту «бочки» K нотой напольного тома просто потому, что в MuseScore ноты большого барабана записываются не тем голосом, что остальные ноты, из-за чего итоговую партитуру трудно читать. Вместо этого вы можете использовать «настоящую» ноту большого барабана с помощью mdk["Acoustic Bass Drum"].

Так или иначе, цель состоит в том, чтобы объединить эти четыре ноты в гэддизмы согласно следующим простым правилам (которые позволят максимально сохранить оригинальный стиль Стива Гэдда).

  1. Каждый гэддизм состоит из шестнадцати тридцать вторых нот (две четвертные ноты).

  2. Первая половина начинается с «бочки» K и не может заканчиваться ударом правой рукой.

  3. Вторая половина начинается с удара правой рукой A.

  4. R, L, K можно повторять до двух раз подряд.

Например, наиболее «стандартный» ритм — KLLRRLLK ALLRRLLK: standard 1

После определения нот A, ... K самый простой способ создать ритм из них программным путем — объединить их в вектор, например:

[K, L, L, R, R, L, L, K]
8-element Vector{Note}:
 Note F2  | vel = 80  | pos = 0, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 0, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 0, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 0, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 0, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 0, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 0, dur = 120 | channel 9
 Note F2  | vel = 80  | pos = 0, dur = 120 | channel 9

К сожалению, есть проблема: все эти ноты начинаются в один и тот же момент, поэтому, если бы мы добавили их в партитуру, у нас было бы восемь тридцать вторых нот в первой тридцать второй доле такта…​

Чтобы преобразовать этот вектор нот в ноты, играемые последовательно, определим следующую функцию:

"""

Combine the given notes into a notes that start sequentially.
"""

function make_pattern(v::Vector{<:AbstractNote})
    n = Notes([v[1]], 960)
    for i in 2:length(v)
        push!(n, translate(v[i], (i-1)*subdiv))
    end
    return n
end

p1 = make_pattern([K, L, L, R, R, L, L, K])
p2 = make_pattern([A, L, L, R, R, L, L, K])
8 Notes with tpq=960
 Note D2  | vel = 100 | pos = 0, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 120, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 240, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 360, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 480, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 600, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 720, dur = 120 | channel 9
 Note F2  | vel = 80  | pos = 840, dur = 120 | channel 9

Теперь можно легко объединить их, передать в MuseScore и увидеть результат:

x = combine([p1, translate(p2, patlen)])
16 Notes with tpq=960
 Note F2  | vel = 80  | pos = 0, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 120, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 240, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 360, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 480, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 600, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 720, dur = 120 | channel 9
  ⋮
 Note C♯2 | vel = 70  | pos = 1080, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 1200, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 1320, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 1440, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 1560, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 1680, dur = 120 | channel 9
 Note F2  | vel = 80  | pos = 1800, dur = 120 | channel 9
musescore("standard.png", x)
standard 1

Обратите внимание на использование функции translate, которая гарантирует, что вторая часть p2 начинается не одновременно с p1.

Итак, теперь осталось записать все гэддизмы, которые мы хотим репетировать:

first_half = make_pattern.([
    [K, L, L, R, R, L, L, K],
    [K, L, L, K, R, L, L, K],
    [K, R, L, K, R, L, L, K],
    [K, R, L, K, R, L, K, L],
    [K, L, R, R, L, L, R, L],
    [K, L, R, R, L, R, R, L],
    [K, L, L, R, R, L, K, K],
    [K, R, L, R, R, L, L, K],
    [K, L, L, R, K, L, K, L],
    [K, L, R, R, L, R, L, L],
    [K, L, L, K, A, L, L, K],
])

second_half = make_pattern.([
    [A, L, L, R, R, L, L, K],
    [A, L, L, K, R, L, L, K],
    [A, L, K, L, R, L, L, K],
    [A, L, L, R, K, R, L, L],
    [A, L, R, R, L, R, L, L],
    [A, L, R, R, L, R, R, L],
    [A, L, L, R, R, K, L, L],
    [A, L, K, R, L, K, R, L],
    [A, L, R, L, L, R, L, L],
    [A, L, R, L, L, R, L, K],
    [A, K, R, L, K, R, L, K],
    [A, K, R, L, L, R, R, K],
    [A, L, A, L, L, R, L, K],
])

second_half[3]
8 Notes with tpq=960
 Note D2  | vel = 100 | pos = 0, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 120, dur = 120 | channel 9
 Note F2  | vel = 80  | pos = 240, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 360, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 480, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 600, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 720, dur = 120 | channel 9
 Note F2  | vel = 80  | pos = 840, dur = 120 | channel 9

Объединение гэддизмов в последовательность

На данный момент все необходимые компоненты готовы, и мы можем использовать любые гэддизмы для создания последовательности, например:

x = combine([first_half[5], translate(second_half[8], patlen)])
16 Notes with tpq=960
 Note F2  | vel = 80  | pos = 0, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 120, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 240, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 360, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 480, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 600, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 720, dur = 120 | channel 9
  ⋮
 Note C♯2 | vel = 70  | pos = 1080, dur = 120 | channel 9
 Note F2  | vel = 80  | pos = 1200, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 1320, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 1440, dur = 120 | channel 9
 Note F2  | vel = 80  | pos = 1560, dur = 120 | channel 9
 Note F♯2 | vel = 70  | pos = 1680, dur = 120 | channel 9
 Note C♯2 | vel = 70  | pos = 1800, dur = 120 | channel 9
musescore("another.png", x)
another 1

Схема достаточно проста, поэтому мы определяем функцию, которая создает последовательность из произвольного числа гэддизмов:

function random_gaddisms(n = 1)
    @assert n ≤ min(length(first_half), length(second_half))
    r1, r2 = randperm(length(first_half)), randperm(length(second_half))
    final = Vector{Notes}()
    c = 0
    for i in 1:n
        push!(final, translate(first_half[r1[i]],  c*patlen))
        push!(final, translate(second_half[r2[i]], (c+1)*patlen))
        c += 8 # добавляем пустой такт, чтобы ноты было удобнее читать
    end
    return combine(final)
end
random_gaddisms (generic function with 2 methods)
musescore("random1.png", random_gaddisms(4))
random1 1
musescore("random2.png", random_gaddisms(8))
random2 1

Эту команду можно выполнять сколько угодно раз для создания любого количества случайных комбинаций, например [musescore("randgadd_$i.pdf", random_gaddisms(8)) for i in 1:4].

Матрица гэддизмов

Если вы распечатаете и попробуете освоить некоторые из этих комбинаций, например показанные в последнем разделе на данной странице, то быстро поймете, что должен быть более эффективный способ представления этой информации. Правильный ответ — матрица. Матрица выглядит примерно так:

gaddmatrix 1234x123

Как создать такую матрицу? С помощью следующей функции:

using PyPlot

function gaddism_matrix(first, second; dx = 2.6, dy = 1.2) # дюймов на ритм
    patternimg(path) = matplotlib.image.imread(path)[:, 640:2880, :]
    Lf, Ls = length.((first, second))
    fig, axs = subplots(Lf+1, Ls+1, figsize = ((Ls+1)*dx, (Lf+1)*dy))

    for (fi, f) in enumerate(first)
        musescore("f$(f).png", first_half[f], display = false)
        fimg = patternimg("f$(f)-1.png")
        axs[fi+1, 1].imshow(fimg)
        rm("f$(f)-1.png")
        for y in ((1 - fi/(Lf+1)), (1 - (fi+1)/(Lf+1)))
            line = matplotlib.lines.Line2D([0, 1], [y, y], color="k", transform=fig.transFigure)
            fig.add_artist(line)
        end
    end
    for (si, s) in enumerate(second)
        musescore("s$(s).png", second_half[s], display = false)
        simg = patternimg("s$(s)-1.png")
        axs[1, si+1].imshow(simg)
        rm("s$(s)-1.png")
        for x in (si/(Ls+1), (si+1)/(Ls+1))
            line = matplotlib.lines.Line2D([x, x], [0, 1], color="k", transform=fig.transFigure)
            fig.add_artist(line)
        end
    end
    axs[1,1].text(0.5,0.5, "Gaddism Matrix\n(flutter licks)\n"*
                  "by George Datseris\nusing JuliaMusic", va="center", ha="center", size=12)
    for ax in axs; ax.axis("off"); end
    fig.tight_layout()
    fig.savefig("gaddmatrix_$(join(first))x$(join(second)).png", dpi = 1200)
end
gaddism_matrix (generic function with 1 method)

В эту функцию передаются два вектора целочисленных индексов, каждый из которых обозначает, какие ритмы из первой и второй половины следует включить в матрицу:

gaddism_matrix([1, 2, 4, 5, 7], [1, 8, 5])
gaddmatrix 12457x185

Например, стандартный ритм, представленный во введении, был создан с помощью следующего кода:

gaddism_matrix(1:4, 1:3)

Я не буду слишком углубляться в подробности, касающиеся gaddism_matrix, так как большая часть кода связана с построением графика. По сути, функция сохраняет каждый ритм отдельно посредством MuseScore, а затем загружает изображение в виде числовых данных (см. patternimg) и строит график на основе этого изображения с помощью PyPlot. Остальной код предназначен для форматирования и добавления линий.

Это замечательная функция, так как ее можно масштабировать до произвольного количества ритмов. Пример:

gaddism_matrix([6, 8], 1:6)
gaddmatrix 68x123456

Для своих репетиций я создавал матрицы 3x3 и сосредоточивался на отработке отдельных ритмов до такой степени, чтобы их можно было свободно комбинировать.

Сохранение всех возможных комбинаций гэддизмов в PDF-файле

Сохранить все возможные комбинации гэддизмов в PDF-файле очень легко с помощью следующей функции:

function allgaddisms(first_half, second_half)
    final = Vector{Notes}()
    c = 0
    for i in 1:length(first_half)
        for j in 1:length(second_half)
            push!(final, translate(first_half[i], c*patlen))
            push!(final, translate(second_half[j], (c+1)*patlen))
            c += 8
        end
    end
    return combine(final)
end
allgaddisms (generic function with 1 method)
musescore("all.pdf", allgaddisms(first_half, second_half));

Имейте в виду, что получается огромный PDF-файл. Конечно, можно сделать следующее:

musescore("all_from_1.pdf", allgaddisms([first_half[1]], second_half));

чтобы сочетать только первую комбинацию со всеми остальными.