Квантование и очеловечивание
Квантование
Квантование — это процесс переноса начальных позиций всех нот в заданную периодическую сетку. Эта «сетка» не обязательно должна быть равномерно распределенной, однако должна быть периодической для каждой четвертной ноты.
#
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.