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

  • Автор темы Автор темы @Michael
  • Дата начала Дата начала
@arkaine, что-то вы сильно отклонились от курса, да и зачем такие трудности? Есть экшн резки выделенных нот по сетке, можно и по курсору резать. В чём вообще смысл? :)
 
@vitalker, переместил сообщение в другую тему. Неловко получилось. Отвечу здесь.

В чём вообще смысл?
В том, чтобы вместить эти экшны на одной горячей клавише и минимизировать действия, необходимые для совершения сплита.

Если просто сплитить ноты (Split Notes), то обычно нужно: Навести мышь, поставить курсор, сплитнуть ноты.

А если сплитить ноту под под курсором мышки (Split Notes at Mouse Cursor), то совсем печально получается: сплитится только одна нота (т.е., не сплитятся все выделенные ноты) и хотя нота и сплитится по сетке, но курсор отклоняется от сетки.

А тут сразу: навёл мышь, сплитнул (либо одну ноту, либо несколько нот) и курсор остался привязанным к сетке. ;)
 
@vitalker, знаю об этом, но меня интересовала возможность банально обрезать интересующее меня множество нот строго по сетке. С этой функцией справляется резка по курсору, но, как я уже указал, для этого требуется дополнительное действие -- сначала поставить курсор.
В моём экшне достаточно навести мышь на те или иные линии сетки и нажать горячую клавишу -- как ноты там и обрежутся (ведь экшн вмещает в себе: помещение эдит курсора под курсор мышки с последующей резкой нот).
 

Вложения

  • vdsvadsvasdv.gif
    vdsvadsvasdv.gif
    174,4 KB · Просмотры: 73
@arkaine, есть экшн, который режет ноты по сетке. Выделили ноты, нажали экшн - ноты порезались по сетке. Курсор там вообще не используется.
 
@vitalker, Вы о том экшне, при котором нарезка ноты совершается на каждой линии сетки на протяжении всей ноты? Это уже другое. Мне бы порезать ноты только на той линии, на/возле которой курсор мыши.
 
Последнее редактирование:
@vitalker, именно это он и делает. И в отличие от топорного Move Edit Cursor to Mouse Cursor (который вроде бы вообще не привязывается к сетке) располагает эдит курсор в месте разрезки нот, которое приходится строго на сетку при включённой привязке к сетке, либо может быть свободно при отключённой привязке. КМК, может и не всеобъемлющий, но весьма гибкий вариант сплита.
 
Коллеги, наверняка уже было где-то тут.. Но как сделать кастом экшн, который бы рендерил выделенный участок активного трека на новую дорожку, с отключенными FX?
 
@indie_buter, посмотри есть такие команды в Actions :
Track: Render selected area of tracks to mono stem tracks (and mute originals)
Track: Render selected area of tracks to stereo stem tracks (and mute originals)
 
  • Like
Реакции: indie_buter
Ребята, тут я видел есть скрипт - аналог компрессора для отдельного объекта на дорожке - он рисует автоматизацию уровня волны. А есть такой же скрипт, который рисовал бы автоматизацию volume на самом треке?
 
Подскажите, пожалуйста (вопрос опытным скриптоделам).

Мне вот потребовался экшн/скрипт (именно экшн/скрипт), позволяющий изменить Input канал(а/ов) с дефолтного "Input: Stereo" на "Input: Midi".

Благо, нашёл созданный предусмотрительным Михаилом Пилявским скрипт:
Prepare MIDI input for last touched track.

Как гласит название и каково его содержание:
[HIDE] function MIDI_prepare(tr)
local tr = reaper.GetLastTouchedTrack()
if not tr then return end
local bits_set=tonumber('111111'..'00000',2)
reaper.SetMediaTrackInfo_Value( tr, 'I_RECINPUT', 4096+bits_set ) -- set input to all MIDI
reaper.SetMediaTrackInfo_Value( tr, 'I_RECMON', 1) -- monitor input
reaper.SetMediaTrackInfo_Value( tr, 'I_RECARM', 1) -- arm track
reaper.SetMediaTrackInfo_Value( tr, 'I_RECMODE',0) -- record MIDI out
end
MIDI_prepare() [/HIDE]

Этот скрипт работает только с последним "тронутым" треком.
Можно ли как-либо заставить скрипт воздействовать на все выделенные треки?
Пробовал вместо GetLastTouchedTrack ставить CountSelectedTracks -- приводит к ошибке.
 
Последнее редактирование:
@arkaine, пиля, второй раз за день вопрос, на который я бы полгода назад с закрытыми глаами ответил. А сейчас, только пальцем в нужную сторону ткнуть могу:
Вот все тело функции надо впихнуть в while луп, и поменять на кошерную команду get***Track из API. Он должен возвращать всегда только один id трека.
 
  • Like
Реакции: arkaine
Цикл экшн в одну строчку:
CONSOLE i0m
Мегаполезно, спасибо!!!

@arkaine, пиля, второй раз за день вопрос, на который я бы полгода назад с закрытыми глаами ответил. А сейчас, только пальцем в нужную сторону ткнуть могу:
Вот все тело функции надо впихнуть в while луп, и поменять на кошерную команду get***Track из API. Он должен возвращать всегда только один id трека.

Ошибочно счёл Cycle Action'ы куцыми и сконцентрировал внимание на экшнах и скриптах, а тут такой очень к месту пришедшийся Cycle Action. :)

Что сказать... И в мануале и в видюшках на Ютубе есть описание метода создания множества треков, присоединяемых (по MIDI) к одному треку, но меня интересовала возможность заставить звучать (минимумом телодвижений) множество треков, создаваемых по закидывании MIDI-файла в проект.

Итого создал экшн, который делает звучащими треки, созданные при импортировании миди в проект. Состоит он из:
Set Automatic Record-Arm when track Selected
Set Track Record Monitor to On
И вот этот Cycle Action с CONSOLE i0m.

Остаётся только правым кликом кликнуть по кнопке Route и выбрать направление треков либо на какой-либо другой трек с инструментом, либо на GM Synth -- и будет счастье.)
 
Подскажите, пожалуйста (вопрос опытным скриптоделам).

Мне вот потребовался экшн/скрипт (именно экшн/скрипт), позволяющий изменить Input канал(а/ов) с дефолтного "Input: Stereo" на "Input: Midi".

Благо, нашёл созданный предусмотрительным Михаилом Пилявским скрипт:
Prepare MIDI input for last touched track.

Как гласит название и каково его содержание:
[HIDE] function MIDI_prepare(tr)
local tr = reaper.GetLastTouchedTrack()
if not tr then return end
local bits_set=tonumber('111111'..'00000',2)
reaper.SetMediaTrackInfo_Value( tr, 'I_RECINPUT', 4096+bits_set ) -- set input to all MIDI
reaper.SetMediaTrackInfo_Value( tr, 'I_RECMON', 1) -- monitor input
reaper.SetMediaTrackInfo_Value( tr, 'I_RECARM', 1) -- arm track
reaper.SetMediaTrackInfo_Value( tr, 'I_RECMODE',0) -- record MIDI out
end
MIDI_prepare() [/HIDE]

Этот скрипт работает только с последним "тронутым" треком.
Можно ли как-либо заставить скрипт воздействовать на все выделенные треки?
Пробовал вместо GetLastTouchedTrack ставить CountSelectedTracks -- приводит к ошибке.

Писал когда то себе toggle-вариант, переключает выделенные треки между Input Stereo и Input Midi

r = reaper
c = r.CountSelectedTracks(0)
if c > 0 then
t = r.GetSelectedTrack(0, 0)
m = r.GetMediaTrackInfo_Value(t, "I_RECINPUT")

r.Undo_BeginBlock()


if m == 6112 then
for i = 0, c-1 do
tr = r.GetSelectedTrack(0, i)
r.SetMediaTrackInfo_Value(tr, "I_RECINPUT", 0)
end
else
for i = 0, c-1 do
tr = r.GetSelectedTrack(0, i)
r.SetMediaTrackInfo_Value(tr, "I_RECINPUT", 6112)
end
end

r.Undo_EndBlock("Toggle track inputs", 1)

end
 
  • Like
Реакции: arkaine
Есть замечательные экшны (точнее: экшн и скрипт) Reverse Order и Shuffle Order of Selected Items.
Первый из них располагает айтемы (напр., семплы) в окне проекта (в части его аранжировки) в обратном, а второй -- в случайном порядке (с сохранением позиции их начала).

Также есть скрипт с рандомизацией нот в открытом Item'е (или вот Take'е, по терминологии автора этого скрипта) -- Selected Notes in Opened MIDI Take Randomly.

Подскажите пожалуйста, есть ли экшн/скрипт "Shuffle Selected Notes" -- т.е., который бы рандомно изменял порядок располагающихся в айтеме нот? :)
 
Последнее редактирование:
есть ли экшн/скрипт "Shuffle Selected Notes" -- т.е., который бы рандомно изменял порядок располагающихся в айтеме нот? :)
Есть!
Называется - играйте шо хотите.lua :)
Прошу прощения, не удержался.... :)
 
  • Like
Реакции: Buyan и arkaine
@Aleksandr Oleynik,
Знаю-знаю о таком методе.)
Но рандомайз (особенно с возможностью задавания параметров) интересен по-своему.
И Рипер, как обладающий гибкой возможностью реализации данной функции, отчасти привлёк именно этим.

И ещё вопросик.
Есть такой скрипт MIDI Randomization Tool. Как ясно из названия (Tool), он открывает окно, в котором можно выбирать параметры рандомизации и из которого можно совершать данное действие. А возможно ли как-нибудь привязать к горячей клавише непосредственно выполнение данного действия?
 
@arkaine, опишите чего и для чего (каков результат) вы хотите добиться?
Часто вопросы пользователей, основанные на их понимании функционала, далеки от оптимальных в поиске тех или иных решений.
 
@Aleksandr Oleynik, хотел провести такой (возможно, единичный) эксперимент с (рас)положением аккордов:

Скажем, разместить на белых клавишах (или в рамках любого другого звукоряда) все строимые от них (и, конечно же, вписывающиеся в звукоряд) аккорды (например, длительностью в 1/4 ноты), а затем рандомно их пораспалагать (изменить порядок их следования). Притом каждый из аккордов: был бы в нескольких мелодических положениях / обращениях / расположениях голосов. Осознаю, что не все из подобных последований аккордов будут логически связны и благозвучны, но их потом можно привести к оному (лоничному и благозвучному) виду.

Знаю-знаю, что это может выйти нечто каверзное с точки зрения функциональности, а также, что это можно и в ручную проделать, но всё же интересовала возможность проделать это посредством программы (как, например, мелодию можно провести [сейчас озвучу страшное, но знакомое Вам слово] ракоходом при помощи простой функции Reverse :) ), ибо это было бы быстрее.
 
@Aleksandr Oleynik, я частенько проделываю подобное (поэтому, собственно, и теплилась надежда, что кем-то уже был написан скрипт), реверся между собою отдельные аккорды. Притом необязательно следующие непосредственно друг за другом, но и находящиеся на расстоянии друг от друга с промежуточными между ними. В разряженных модальных гармониях приводит к благозвучным последовательностям.

chord reverse.gif

Либо такой вариант с шафлом слайснутых до нот айтемов:
Items Shuffle.jpg



Если креативно подойти, то и не определишь, что создавалось именно подобным образом (имхо).
 

Вложения

Последнее редактирование:
@lil-burn, спасибо. Вижу, у Вас много скриптов, посвящённых редактированию миди. Это Ваше любимое/основное направление скриптописания?
 
Поймал баг в миди-редакторе. Суть бага - функция MIDI_GetNote() выдает неверное значение конца ноты, если ноты "накладываются" друг на друга.
midi bug.gif
Для тех, кто хочет проверить:
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) совпадают, то это баг рипера, т.к. по факту концы нот находятся в разных точках - см. гиф. Если же одну из нот подвинуть выше или ниже (чтобы избежать перекрывания нот), а затем запустить скрипт, то концы нот выводятся корректно.
Баг довольно неприятный: если есть перекрывающиеся ноты, то многие скрипты, связанные с перемещением нот, могут работать некорректно (например, скрипт может обрезать такие ноты)

@arkaine, просто пишу скрипты, которые кмк, могут быть полезны)
Shuffle задержится немного - надо решить вопрос с багом выше, иначе с этим скриптом и не только с этим могут быть глюки
 

Вложения

@EUGEN27771, аа то есть Get Note это то что по факту звучит) Тогда немного путано получается - кмк логичнее было бы там где начало второй ноты - там делать нот-офф первой, а вторую проигрывать как она нарисована.

Но самое -то главное: как в таком случае узнать то что нарисовано? типа GetDısplayedNoteEnd()
сейчас написал такую функцию
PHP:
function GetNotes(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] = {i, sel, mute, start_note, end_note, chan, pitch, vel}
    r.MIDI_DeleteNote(take, 0)
  end

  for i = 1, #t do
    local _, sel, mute, start_note, end_note, chan, pitch, vel = table.unpack(t[i])
    r.MIDI_InsertNote(take, sel, mute, start_note, end_note, chan, pitch, vel, 0)
  end
 
  return t
end
решение так себе, хотя работает
 
Ещё опасался того, что может возникнуть проблема с накладывающимися и просто располагающимися друг над другом нотами.

решение так себе, хотя работает
Это уже готовый для использования в скриптах Рипера код?)
А то скопировал и в eel, и в lua -- ничего.
 

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