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

Квантование и очеловечивание

Квантование

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

quantize(notes::Notes, grid, duration = true)
quantize(note::AbstractNote, grid, tpq::Integer)

Возвращает квантованную копию заданных нот в указанной сетке grid, которая может быть любым сортируемым итерируемым объектом, начинающимся с 0 и заканчивающимся на 1.

Каждая нота квантуется (перемещается) в ближайшую к ней точку grid, которая предварительно определяется с помощью функции classify. Предполагается, что сетка одинакова для всех четвертных нот дорожки.

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

Эта функция учитывает абсолютное положение нот и выполняет квантование по абсолютному, а не относительному положению.


Вот ряд примеров.

using MusicManipulations
midi = readMIDIFile(testmidi())
notes = getnotes(midi, 4)

sixteens = 0:1//4:1

notes16 = quantize(notes, sixteens)

swung_8s = [0, 2//3, 1]

swung_notes = quantize(notes, swung_8s)
533 Notes with tpq=960
 Note F4  | vel = 69  | pos = 7360, dur = 320
 Note A♯4 | vel = 85  | pos = 7680, dur = 640
 Note D5  | vel = 91  | pos = 8320, dur = 320
 Note D4  | vel = 88  | pos = 8320, dur = 320
 Note G♯3 | vel = 88  | pos = 8320, dur = 320
 Note A♯4 | vel = 76  | pos = 8640, dur = 640
 Note G4  | vel = 66  | pos = 9280, dur = 320
  ⋮
 Note D5  | vel = 91  | pos = 189760, dur = 320
 Note D5  | vel = 106 | pos = 190720, dur = 320
 Note A4  | vel = 99  | pos = 190720, dur = 320
 Note D♯4 | vel = 101 | pos = 190720, dur = 960
 Note A3  | vel = 106 | pos = 190720, dur = 960
 Note D4  | vel = 106 | pos = 190720, dur = 960
 Note G4  | vel = 109 | pos = 190720, dur = 320

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

Классификация

quantize работает в два шага. На первом шаге каждая нота «классифицируется» в соответствии с тем, какая точка сетки ближе всего к ней (по модулю четвертной ноты).

classify(notes::Notes, grid)
classify(note::AbstractNote, grid, tpq::Integer)

Классифицирует заданные ноты в соответствии с заданной сеткой.

Возвращает целое число (или вектор целых чисел), которое соответствует индексу точки сетки, ближайшей к позиции ноты по модулю четвертной ноты. 1 означает начало сетки, а length(grid) — конец сетки (то есть следующую четвертную ноту).

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

Очеловечивание

humanize!(notes, property, σ, noise = :ARFIMA; kwargs...)

Humanize given notes by adding noise of standard deviation σ to their property, typically either :position or :velocity. Research[1] suggests that σ should be around 40 (for :position) but that depends on the BPM, and around 10 for :velocity.

"Очеловечивает" заданные ноты notes путем добавления шума стандартного отклонения σ к их property, обычно либо к :position, либо к :velocity. Исследование[1] предполагает, что σ должно быть около 40 (для :position), но это зависит от BPM, и около 10 для :velocity.

Аргумент noise определяет тип шума:

  • :ARFIMA использует ARFIMA.jl и пытается сгенерировать степенной коррелированный (розовый) шум. Именованные аргументы d = 0.25, φ = SVector(-0.5, -1.5) передаются в функцию arfima.

  • :white — обычный белый шум.

Неизменяющий вариант — humanize.