Квантование и очеловечивание
Квантование
Квантование — это процесс переноса начальных позиций всех нот в заданную периодическую сетку. Эта «сетка» не обязательно должна быть равномерно распределенной, однако должна быть периодической для каждой четвертной ноты.
#
MusicManipulations.quantize
— Function
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
работает в два шага. На первом шаге каждая нота «классифицируется» в соответствии с тем, какая точка сетки ближе всего к ней (по модулю четвертной ноты).
#
MusicManipulations.classify
— Function
classify(notes::Notes, grid)
classify(note::AbstractNote, grid, tpq::Integer)
Классифицирует заданные ноты в соответствии с заданной сеткой.
Возвращает целое число (или вектор целых чисел), которое соответствует индексу точки сетки, ближайшей к позиции ноты по модулю четвертной ноты. 1
означает начало сетки, а length(grid)
— конец сетки (то есть следующую четвертную ноту).
После классификации нот этот вектор классификации используется для перемещения всех нот в ближайшую точку сетки (по модулю четвертной ноты).
Очеловечивание
#
MusicManipulations.humanize!
— Function
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
.