Помогите создать экшн / кастом экшн / скрипт

  • Автор темы Автор темы @Michael
  • Дата начала Дата начала
@arkaine, это не готовый скрипт, это просто функция.
[DOUBLEPOST=1504672688][/DOUBLEPOST]
@EUGEN27771, аа то есть Get Note это то что по факту звучит) Тогда немного путано получается - кмк логичнее было бы там где начало второй ноты - там делать нот-офф первой, а вторую проигрывать как она нарисована.

Но самое -то главное: как в таком случае узнать то что нарисовано?
Вообще - то, рисовать нужно то, что можно проиграть. Как вы с миди клавы запишите вот таких две одинаковые ноты налезшие одна на одну?
Галочка коррекции подобной (не возможной) ситуации должна всегда стоять.
 
  • Like
Реакции: arkaine
Был бы очень признателен, если кого не затруднит создать (надеюсь, простой [более простой, чем для рандомизации нот и уж тем более рандомизации Velocity нот]) скрипт, который бы рандомизировал MIDI-каналы нот.
 
@arkaine, Shuffle selected notes (preserving chords).lua
shuffle notes.gif
скрипт при запуске отключает опцию Options - Automatically correct overlapping notes. Иначе ноты при наложении друг на друга могут изменять длительность, либо вообще удаляться. Не совсем удобно, но пока так.
 
  • Like
Реакции: arkaine
@Aleksandr Oleynik, записаны ли ноты через миди-клаву или нет - не важно, их часто все равно приходится править в окне миди-редактора, . И дело в том, что со включенной опцией нужно постоянно следить, не съела ли эта опция часть случайно перемещенной ноты или всю ноту и если съела, то каждый раз делать undo. Но если отключена опция - то могут быть разные приколы со скриптами при работе с пересекающимися нотами. Вот что нашел сегодня (тут уже явно глючит функция DeleteNote):
test 2.gif
(скрипт просто удаляет вторую ноту. но в первом случае - когда ноты не пересекаются - все ок, а во втором меняется длина у первой ноты)
по идее не помешает опция "запрещать пересечение нот". То есть если перемещаемая нота пересекается с другой, то происходит отмена перемещения этой ноты.
 
@EUGEN27771, еще раз подумал и все-таки думаю, это был баг:
если GetNote дает фактические концы нот, то почему он возвращает 2 одинаковых числа?
upload_2017-9-7_3-15-34.png

и посмотри еще гиф чуть выше (в моем предыдущем посте) - там точно баг.
 
@lil-burn, cупер!!! То, что надо.

Ого, не ожидал (хотя и предполагал), насколько данный скрипт окажется юзабельным, если сможет адекватно себя вести с одноголосной мелодией: вариация (ракоход/инверсия) звена секвенции в одним экшне. :) Это может быть интересно.
 
@lil-burn, если мои соображения окажутся уместными и не слишком дилетантскими, то выскажусь на данную тему (о чём, впрочем, ранее упоминалось в данной теме): Насколько я знаю/помню, в миди (протоколе) ноты всегда так себя вели, что первая (накладывающаяся на вторую) нота "склеивается" со второй (ну либо вторая, накладывающаяся на первую, склеивается с первой).

Это уже секвенсоры корректно отображают ноты, а в самом же миди предыдущая нота либо замолкает, либо протягивается (склеивается); но чтобы ноты накладывались друг на друга и сохранялась исходная длина первой -- такого нет.

Хотя проверил сейчас эти overlapping notes -- в том же Сайленте первая нота замолкает (с щелчком), когда начинается вторая, а Зебра чудным образом адекватно реагирует на две разных накладывающихся друг на друга ноты и возникает (приходящееся на время наложения нот друг на друга) сложение двух звуков с вытекающими из этого увеличением уровня громкости и сложением фаз.

Но решение подскажет кто-то другой, явно не я.)
 
Последнее редактирование:
@EUGEN27771, еще раз подумал и все-таки думаю, это был баг:
если GetNote дает фактические концы нот, то почему он возвращает 2 одинаковых числа?
Посмотреть вложение 135900
и посмотри еще гиф чуть выше (в моем предыдущем посте) - там точно баг.
В общем понимании - баг, но решать его нужно на этапе исключения ситуации с пересечением нот одной высоты, так как этого в природе быть не может.....
По сути нужно чтоб Рипер на подобный "финт" со стороны пользователя реагировал одним из двух способов (собственно их описал @arkaine,) - либо пересекающиеся две одинаковые ноты склеивались в одну, либо в месте пересечения возникал их разрез для имитации повторного надатия на ту-де ноту.
Ни каких других вариантов в природе быть не может.

PS: вариант подобного в общем то в жизни всё же может быть, но ТОЛЬКО, если подключены две миди клавиши и эти две пересекающиеся ноты приходят от разных клав.
Но даже в этом случаи поведение сиквенсора должно быть одним из описанных ранее, хотя я бы в общем оставил ОДНО поведение - разрез в месте прихода второй ноты.
А вот если ноты приходят по разным каналам........, и играют разными инструментами - тогда фиг знает как поступать, в случаи если это всё склеено в один айтем.
Кстати, а могут быть ноты в одном айтеме с разных каналов?
 
Кстати, а могут быть ноты в одном айтеме с разных каналов?
Без проблем, и тогда, вероятно, возвращать будет "правильно"
если GetNote дает фактические концы нот, то почему он возвращает 2 одинаковых числа?
Я не знаю, что дает эта ф-я, и не проверял. Она может давать что угодно, в том числе, она могла бы отдать и то, что нарисовано.
Но по миди-протоколу отправить - у секвенсера только два варианта, описанных выше. Если бы в Рипере выбрали первый, кто-то сказал бы, что правильный второй:)
По картинке с Del даже легко понять, как Рипер интерпретирует ситуацию - остаются три сообщения. note on, note on , note off(последний). Когда удаляется последняя нота, на самом деле удаляются два сообщения note on и note off. Остается ноте on первый, а note off уже нет - и нота тянется до конца
 
  • Like
Реакции: Aleksandr Oleynik
Кстати (может и не в тему) у некоторых миди клав note off вообще нет - вместно него note on c нулевой велосити.
 
Кстати, а могут быть ноты в одном айтеме с разных каналов?
Могут и приходить с разных каналов, и выходить как в разные, так и в один канал.

Ноты, принадлежащие разным MIDI-каналам:
MIDI 1.jpg
MIDI-плагин для изменения каналов нот/контролеров:
MIDI 2.jpg
Ну и на всяк про всяк, лично мне это никогда не было нужно, но, как понимаю, выбор каналов для исходящих нот и контролеров на разные MIDI-устойства.
MIDI 3.jpg

------------------------------
Кстати, хотелось бы поэкспериментировать в стиле электронного пуантилизма. :)
Поэтому моя просьба всё ещё в силе:
Был бы очень признателен, если кого не затруднит создать (надеюсь, простой [более простой, чем для рандомизации нот и уж тем более рандомизации Velocity нот]) скрипт, который бы рандомизировал MIDI-каналы нот.
Рандомно пораспределять ноты по каналам. Ноты из айтема/канала будут посылаться на множество инструментов, каждый из которых будет работать на приём только своего MIDI-канала. Конечно, современные электронщики проделывают оное в ручную, но мне кажется, что автоматизация и этого действия тоже способна привести к интересным результатам.
 
Последнее редактирование:
Ок, я просто с миди вообще почти не имею дело, только с живяком.
Но раз есть возможность принять одну и ту-же ноту с разных каналов, с разных миди инструментов в один айтем (на один трек) и они могут наложиться друг на друга, то Рипер просто обязан с ними как-то корректно работать.
Пока я вижу, что это не так.
[DOUBLEPOST=1504776415][/DOUBLEPOST]@EUGEN27771, всё что ты написал про миди протокол и его ограничения - верно. Но вот ситуация когда наложившиеся друг на друга ноты имеют разные каналы - абсолютно легальна и должна правильно обрабатываться и Рипером и его API для скриптов.
PS: И я проверил - таки правильно и обрабатывается!
См. ниже
 
Последнее редактирование:
@lil-burn,
Поймал баг в миди-редакторе. Суть бага - функция MIDI_GetNote() выдает неверное значение конца ноты, если ноты "накладываются" друг на друга.
Для тех, кто хочет проверить:
1) открываем миди редактор и рисуем две ноты
2) перемещаем 1 ноту так, чтобы она частично перекрывала вторую
(перед этим убеждаемся, что снята галка Options - Automatically correct overlapping notes)
3) запускаем скрипт из архива (test note.lua)
откроется окно консоли рипера с текстом типа
Note #1: 4560000.0 5520000.0
Note #2: 5280000.0 5520000.0
здесь 2 числа слева - это начальные координаты каждой ноты, 2 числа справа - координаты концов нот.
Так вот, если эти числа (в примере выше это число 5520000.0) совпадают, то это баг рипера, т.к. по факту концы нот находятся в разных точках - см. гиф. Если же одну из нот подвинуть выше или ниже (чтобы избежать перекрывания нот), а затем запустить скрипт, то концы нот выводятся корректно.
Баг довольно неприятный: если есть перекрывающиеся ноты, то многие скрипты, связанные с перемещением нот, могут работать некорректно (например, скрипт может обрезать такие ноты)
А теперь измените у перекрывающихся нот каналы - и вашим же test note.lua получите корректные данные об обоих нотах.
Вывод - в скриптах нужно для подобных нот в начале менять каналы, затем делать все действия нужные, а потом каналы возвращать.
Хотя повторюсь - одна и та-же нота, находящаяся на одном канале дважды помещённая с перекрытием - нонсенс с точки зрения МИДИ.
 
  • Like
Реакции: lil-burn
@Aleksandr Oleynik, за инфу по каналам спасибо, может пригодиться для получения отображаемого конца нот, но согласитесь - гораздо удобнее иметь специальную функцию для этого. Этот вопрос решал в последнем скрипте (который выше - Shuffle notes) немного по-другому, но тоже обходными путями - с помощью API функции DeleteNote(): прибегаем по каждой ноте от 1 до последней и для каждой из них сначала запоминаем все ее параметры (типа Save note) - добавляем в таблицу, а потом удаляем эту ноту. После того как проделали это для всех нот мы их добавляем из таблицы через функцию InsertNote(), поскольку мы их все удалили на предыдущем этапе, то есть делаем Restore notes. Но именно это удаление обеспечило получение именно отображаемых концов каждой ноты. Замечу, что такое имеет смысл проделывать только если отключена та самая галка с автокоррекцией
 
@EUGEN27771, @Aleksandr Oleynik,
а это видимо баг функции SetNote()
смотрите, даже без явного перекрывания (просто ноты идет друг за другом), причем неважно включена ли автокоррекция:
Скрипт на гиф устанавливает рандомные каналы для нот тейка.
1) Сначала рисуем ноту (неважно какой длины).
2) Затем делаем сплит по сетке с помощью экшена Split notes on grid
3) Запускаем скрипт (иногда нужно несколько раз).
PHP:
local r = reaper

local take = r.MIDIEditor_GetTake(r.MIDIEditor_GetActive())
if not take then return end

local _, notes = r.MIDI_CountEvts(take)
if notes == 0 then return end

r.Undo_BeginBlock(); r.PreventUIRefresh(1)

for i = 0, notes - 1 do
  r.MIDI_SetNote(take, i, nil, nil,nil,nil,math.random(1,16),nil,nil,1)
end
r.MIDI_Sort(take)

r.PreventUIRefresh(-1); r.Undo_EndBlock('Set notes to random channels (bug)', -1)
В результате видим, что меняется длина некоторых нот
test bug 3.gif

Теперь запускаем скрипт, который работает не через SetNote(), а использует мой метод, через функцию InsertNote()
PHP:
local r = reaper

function GetAndDelNotes(take)

  local t = {}

  for i = 0, 1000 do
    local ret, sel, mute, start_note, end_note, chan, pitch, vel = r.MIDI_GetNote(take, 0)
    if not ret then  break end
    t[#t+1] = {sel, mute, start_note, end_note, chan, pitch, vel}
    r.MIDI_DeleteNote(take, 0)
  end
  return t
end

local take = r.MIDIEditor_GetTake(r.MIDIEditor_GetActive())
if not take then return end

local _, notes = r.MIDI_CountEvts(take)
if notes == 0 then return end

r.Undo_BeginBlock(); r.PreventUIRefresh(1)

local t_all = GetAndDelNotes(take)

for i = 1,#t_all do
  local sel, mute, start_note, end_note, chan, pitch, vel = table.unpack(t_all[i])
  r.MIDI_InsertNote(take, sel, mute, start_note, end_note, math.random(1,16), pitch, vel, 0)
end

r.PreventUIRefresh(-1); r.Undo_EndBlock('Set notes to random channels', -1)
и видим, что так работает.
test bug 3 (working).gif
 
Люди добрые помогите, пожалуйста. Чего-то я у меня возникли пара-тройка вопросов. Не знаю куда адресовать-напишу сюда.
1) Очень много работаю в миди с барабанами последнее время, естественно возникает необходимость их хуманизировать. Но вот встроенный риперовский хуманайзер мне не совсем нравится, как то сильно разброс большой него и по временному смещению и по велосити. Можно ли как то создать свой хуманайзер например, или может он уже есть в природе?
2) Опять вопрос из разряда "о барабанах" - если ли какой то экшн или что-либо в этом духе чтобы можно было выделить из цепочки нот (скажем хета) каждую вторую ноту? Хочется автоматизировать этой процесс.
 
@EUGEN27771, на базе скрипта можно сделать ВИЗУАЛИЗАЦИЮ работы всех настроек компрессора для Новичков (и не только для Новичков, некоторые моменты становятся яснее и опытным).
Одно слово - КРУТО!
Я, кстати, твой симпл компрессор уже во всю использую и его отдельные блоки кода....
Точно получился ReaComp только с включённым по умолчанию Make-Up

ОБЩИЙ ВЫВОД -
Женя, а ведь на самом деле Очень крутой способ написания скриптов и плагинов на базе внешних модулей (функций)!
Тот кто с ним разобрался очень легко напишет любой новый функциональный плагин на базе отработанных и проверенных базовых функций.

PS: возвращайся к Rack FX. :)
[DOUBLEPOST=1504944733][/DOUBLEPOST]
в очередной раз понял, что я дурак, а все вокруг умны
Я уже давно этот слоган себе прям на монитор повесил :)
 
Последнее редактирование:
  • Like
Реакции: Ivan_k26
2) Опять вопрос из разряда "о барабанах" - если ли какой то экшн или что-либо в этом духе чтобы можно было выделить из цепочки нот (скажем хета) каждую вторую ноту? Хочется автоматизировать этой процесс.
В Reapack'е есть созданные lil-burn'ом (me2beats) скрипты:
Select Only Even Notes и Select Only Odd Notes.

Ещё в лоджик эдиторе Куба создавал подобную команду и периодически задействовал её как раз при составлении барабанных партий, так что был рад случайно натолкнуться и в Рипере на такое. :)
 
  • Like
Реакции: naash_g
1) Очень много работаю в миди с барабанами последнее время, естественно возникает необходимость их хуманизировать. Но вот встроенный риперовский хуманайзер мне не совсем нравится, как то сильно разброс большой него и по временному смещению и по велосити. Можно ли как то создать свой хуманайзер например, или может он уже есть в природе?
Ну в стандартном хуманайзере вроде есть возможность задавать диапазон рандомизации велосити и сщемения в процентах.) А так -- я тоже не в восторге от него и предпочёл бы открывающий окно экшн с рандомизацией различных параметров, и не в процентах, а с возможностью выбора минимальных и максимальных параметров для рандомизации и ещё кое-какими другими параметрами... Но понимаю, что ох и геморно реализовать данный скрипт.

Но если озвучить соображения об идеальном рандомайзере:

Мне кажется весьма интересной возможность рандомизации позиций нот, скажем, на указанное количество (хотя бы в пределах 2--3) грид юнитов и не выходящих за пределы позиций первой и последней нот.

Также, чисто с практической стороны, знаю, сколь чудодейственен бывает рандомайз высоты нот с возможностью указать диапазон рандомайза; это не хрень, располагающая ноты во всех 8-ми (или сколько их там) октавах, а хрень (фактурный пласт) с ярко выраженной теситурой, применив к которому, например, "Key Snap", можно добиться очень даже интересных результатов.

Из данного пункта вытекает то, что неплохо бы в рандомайзере иметь и функцию Key Snap.

Ну и вот если говорить о рандомизации звучания нот (того, будут звучать или не звучать ноты) посредством Velocity и Mute, то тоже нет толковых скриптов с возможностью указания диапазона рандомизации. :(
 
Последнее редактирование:
  • Like
Реакции: naash_g
Ну в стандартном хуманайзере вроде есть возможность задавать диапазон рандомизации велосити и сщемения в процентах.)
ну смещение нот после 3-4 процентов уже звучат как кривой барабанщик. Хочется конечно иметь какие то границы, и по велосити тоже, скажем задать планку чтобы хуманизировалось в промежутке между 107-127 велосити.
 
Ну, он как бы так и действует.
что действует? мне нужно рамки выставлять самому), а не методом тыка, перебирать "рисунки" хуманизации, чтоб не дай бог какая нить нота ниже 107 например не ускакала.
 
@naash_g, а, Вы всё же именно о возможности указать диапазон для рандомизации.) Ну тогда не так действует.

Просто после этой части сообщения:
ну смещение нот после 3-4 процентов уже звучат как кривой барабанщик.
Мне подумалось, что Вас интересует именно возможность быстро переключаться между рандомизированными рисунками велосити.
 
И в JS, всегда с этим проблемы, очень ограничено все, так кажется после Lua.
Саму обработку, как писал, запихал за пять минут.
Но гулять - так гулять, было три дня свободны, и я уже подсел на идею, а это дорого стоит.
Начал переписывать все с нуля почти, причем учитывать, что и в JS это должно работать.
Начальную стадию - завершил - все прекрасно подключается и работает.
По самому скрипту получилось вот что, по-моему - круто.
Посмотреть вложение 135975

Евгений, куда донаты присылать?
 
  • Like
Реакции: Ivan_k26
2) Опять вопрос из разряда "о барабанах" - если ли какой то экшн или что-либо в этом духе чтобы можно было выделить из цепочки нот (скажем хета) каждую вторую ноту?
Посмотрите в репаке уважаемого @lil-burn. Там есть скрипты:
- Select only even notes.lua
- Select only odd notes.lua
 
  • Like
Реакции: naash_g
@EUGEN27771, я так понимаю вы переделали свой скрипт gen_Envelope-based Compressor ???
Вы его в рапак не кидали ещё??
 

Сейчас просматривают