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

  • Автор темы Автор темы @Michael
  • Дата начала Дата начала
Не видно, не фокусируется.
@@Michael, и видно, и фокусируется, буквально с первых секунд всё это можно наблюдать в мультике. Плюс я активно юзаю данный скрипт - после "просчёта" точек volume envelope автоматически оказывается в фокусе...
Впрочем, не важно, нет - так нет. На нет и суда нет.
 
Oliver_Cray,
EEL: int MB("msg", "title", int type)
Lua: integer reaper.MB(string msg, string title, integer type)
type 0=OK,1=OKCANCEL,2=ABORTRETRYIGNORE,3=YESNOCANCEL,4=YESNO,5=RETRYCANCEL
ret 1=OK,2=CANCEL,3=ABORT,4=RETRY,5=IGNORE,6=YES,7=NO

Например, для Lua:
reaper.MB('текст', 'заголовок', 0)

Aleksandr Oleynik, зачем?
 
  • Like
Реакции: lil-burn и Oliver_Cray
@diggidon, конкретно там может и не фокусируется,но на самом деле это просто.
1.gif
Вот простой пример.
PHP:
//==Get Act Take from 1-st Item==//
Item_ID=GetSelectedMediaItem(0,0);
Take_ID=GetActiveTake(Item_ID);
//==Get Basic Envelopes by Name==//
Env_Vol_ID=GetTakeEnvelopeByName(Take_ID, "Volume");SetCursorContext(2, Env_Vol_ID);
//Env_Pan_ID=GetTakeEnvelopeByName(Take_ID, "Pan");SetCursorContext(2, Env_Pan_ID);
//Env_Mute_ID=GetTakeEnvelopeByName(Take_ID, "Mute");SetCursorContext(2, Env_Mute_ID);
UpdateArrange();
Там можно выбрать нужную Env,перед остальными поставить "//"
 
Я делаю Скрипт, который с текущего проекта снимает необходимые для работы ОСНОВНОГО Скрипта данные и создаёт вспомогательный скрипт (его текст), который потом Основным скриптом при начале работы импортируется в код (через функцию - @Import).
Просто автоматизирую весь процесс настройки Основного Скрипта под конкретный проект с минимальным участием Пользователя.
Делаю это не при старте Основного скрипта по причине того, в частности, что процесс этот длительный (если проект большой) и по сути делать то его нужно ОДИН раз, когда проект готов и используется. Ну и по причине того, что массив создать при старте скрипта не могу в EEL путём считывания данных - таблиц нет в EEL -е. Но честно говоря и по идеологии работы с проектом правильнее считать данные с него Один раз, а потом их каждый раз подгружать при работе в Основной скрипт.
Прошу прощения за длинную прелюдию к пояснению - Зачем?
Так вот, кроме всех прочих данных, мне нужно считать и записать в этот вспомогательный скрипт ID Кастом Экшинов и скриптов - просто чтоб не заниматься этим Пользователю в ручную, залазя в Экшин лист и ковыряя код.
Названия нужных Экшинов, в том числе и Скриптов - мне известны за ранее, а вот какие Command ID в 5-ке присвоит Рипер при Load - я не знаю. Кстати, было-бы хорошор и Load того или иного скрипта в Рипер Экшин делать Скриптом, а не интерфейсом Рипера. И в общем я даже знаю куда это пишется и как (reaper-kb.ini), но не писать же мне самостоятельную программу для записи этих данных в reaper-kb.ini.....
[DOUBLEPOST=1449494208,1449493788][/DOUBLEPOST]
@@Michael, а как вывести окошко с текущим значением переменной? Что написать вместо 'текст' - 'print"переменная"'?
Так (#string - вычисляемая ранее в коде переменная) -
PHP:
sprintf(#Log, "Data: %s", #string); // если переменная не строка, а параметр, то вместо %s писать %d или %i или %f в зависимости от того, что за параметр
ShowConsoleMsg(#Log);
ShowConsoleMsg("\n"); // чтоб меняющееся значение #string писалось каждый раз с новой строки
 
Последнее редактирование:
  • Like
Реакции: lil-burn
вникаю потихоньку в скрипты
позицию конца выделенного айтема покороче можно записать?
Код:
sel_item = GetSelectedMediaItem(0, 0);
sel_item_end = GetMediaItemInfo_Value(sel_item, "D_POSITION") + GetMediaItemInfo_Value(sel_item, "D_LENGTH");
[DOUBLEPOST=1449508378,1449503331][/DOUBLEPOST]как в eel сделать while?
то есть, например, пока a < b делать c
 
А как там поживает фишка с созданией линии автоматизации относительно звуковой волны? @Michael делал, по-моему.

Почему другой юзер прикрепляется по ссылке - не понятно.

Я про @Michael (поменял цифры юзера руками.)
 
Мой первый простенький скрипт - дублировать выделенный айтем до курсора) Есть ли какие-то пожелания по тому как написан скрипт? Может, можно проще
Код:
if reaper.CountSelectedMediaItems(0) > 0 then
  cur = reaper.GetCursorPosition()
  sel_item = reaper.GetSelectedMediaItem(0, 0)
  sel_item_start = reaper.GetMediaItemInfo_Value(sel_item, "D_POSITION")
  sel_item_len = reaper.GetMediaItemInfo_Value(sel_item, "D_LENGTH")
  dup_item_end = sel_item_start + sel_item_len
  edit_pos = reaper.GetCursorPosition()
  while edit_pos - sel_item_len > dup_item_end do
    reaper.Main_OnCommand(41295, 0)
    dup_item_end = dup_item_end + sel_item_len
  end
  reaper.SetEditCurPos(cur, false, false)
end
my first one.gif
 
название скрипта заставляет ожидать одну копию У курсора, а не кучу до курсора. Назовите тогда untill cursor, что ли.
 
почему не фурычит скрипт?
Код:
count_sel_items = reaper.CountSelectedMediaItems(0) -- посчитали айтемы
if count_sel_items > 0 then -- если выделен хотя бы 1 айтем
  for n = 0, count_sel_items do
    get_sel_item = reaper.GetSelectedMediaItem(0, 2*n+1) -- снимаем выделение с четных айтемов
    reaper.SetMediaItemSelected(get_sel_item, 0)
  end
end

...cripts\Test\select only odd items from selected ones.lua:5: bad argument #1 to 'SetMediaItemSelected' (MediaItem expected)
Идея была - пробежаться по всем выделенным айтемам и снять выделение с четных, тем самым выделение останется на нечетных
 
EUGEN27771, молодец, походу фокус - это что-то внутреннее, в чанке ничего не меняется
Смарт Элло, http://forum.cockos.com/showpost.php?p=1539924&postcount=504
lil-burn, в lua надо проверять объекты на их наличие, например,
PHP:
count_sel_items = reaper.CountSelectedMediaItems(0)
if count_sel_items ~= nil  then
  items_to_select = {}
  for n = 1, count_sel_items do
    item = reaper.GetSelectedMediaItem(0, n-1)
    if item ~= nil then
      guid = reaper.BR_GetMediaItemGUID(item)
      table.insert(items_to_select, {guid, (n-1) % 2})
    end
  end
  for i = 1, #items_to_select do
    item = reaper.BR_GetMediaItemByGUID(0, items_to_select[i][1])
    if items_to_select[i][2] == 1 then selected = true else selected = false end
    if item ~= nil then reaper.SetMediaItemSelected(item, not selected) end
  end
  reaper.UpdateArrange()
end
Aleksandr Oleynik, я бы согнал kb.ini в таблицу и посмотрел совпадения имени, из той же ячейки взял id
 
Последнее редактирование:
  • Like
Реакции: lil-burn
Aleksandr Oleynik, я бы согнал kb.ini в таблицу и посмотрел совпадения имени, из той же ячейки взял id
Я пока этого делать не умею, и в EEL таблиц нет :(.
А Load скрипта в Рипер сделать скриптом нельзя?
Михаил, а не можете написать такой скрипт на lua - чтоб он по имени скрипта (экшина) его ID писал в отдельный файл текстовый в директории скриптов?
 
Вообще можно дописать в kb.ini что-то типа
SCR 260 0 RSaa0b95d32702e4280da1ed3c64dd12063f680ee4 "Custom: test.lua" test.lua
Но я не знаю как сгенерировать эту base64, для чего-то же она нужна)
А так можно выводить из kb.ini всё, что там есть, в любой вид
 
Михаил, нам чайникам бы пару работающих примеров.... И без исключительных возможностей lua, чтоб на eel потом перевести.
Честно - не знаю как дописать, а особенно вписать что либо в существующий файл.
Ну и ни разу не считывал ни чего, кроме как код с другого скрипта через @Import
 
Последнее редактирование:
Aleksandr Oleynik, сформулируй ещё раз конкретно что нужно. Если что-то с экшнами связано, то имей ввиду, что названия родных лежат в самом рипере и их из API не достать
 
Но я не знаю как сгенерировать эту base64, для чего-то же она нужна)
Скорее всего для гарантирования многократной генерации уникального ID, но лучше бы это спросить на оф форуме, как и то, можно ли в kb.ini строки писать без соблюдения порядка груп (там экшины, на которые назначенны внешние MIDI/OSC команды пишутся Рипером всегда в конце).
Не могли бы вы это узнать, чтоб не переживать в дальнейшем, что что-то сломается в работе.
Так то я проверил - вроде работает и ID от балды (даже кол-во знаков не имеет значение) и до запись в конце тоже работает (но всё-так с мелкими проблемками, лучше вписывать в самое начала ini файла).
[DOUBLEPOST=1449573387,1449573091][/DOUBLEPOST]
Aleksandr Oleynik, сформулируй ещё раз конкретно что нужно. Если что-то с экшнами связано, то имей ввиду, что названия родных лежат в самом рипере и их из API не достать
1. Дозаписать скриптом в файл reaper-kb.ini вот такую строку -
PHP:
SCR 260 0 RS000a1e205ab7b41d2995b816f55e77f6c1bd5280 "Custom: !_VolTest001.eel" !_VolTest001.eel
И честно говоря (есть проблемки если в конец дописывать), лучше вписать в конец своей группы, перед первой строкой с "маркером в начале" - KEY, вот так (строка 81) -
Screenshot%202015-12-08%2013.23.46.png
А ещё на много ЛУЧШЕ!!!! - вписывать каждый раз в первую строку, сдвигая всё прочее на одну ниже - проверил, это работает без проблем!

2. Считать скриптом из файла reaper-kb.ini - ID кастома по его имени - !_VolTest001.eel
И запустить его на выполнение, этот скрипт.
 
Последнее редактирование:
Дозаписать скриптом в файл reaper-kb.ini

PHP:
    kb_table = {}
    filename = reaper.GetResourcePath()..'/'..'reaper-kb.ini'
    file = io.open(filename, "r")
    content = file:read("*all")
    for line in io.lines(filename) do table.insert(kb_table, line) end
    file:close()

    table.insert(kb_table, 1, 'SCR 4 0 _mpl_test2 "Custom: mpl_test2.lua" mpl_test2.lua')

    file = io.open(filename, "w")
    file:write(table.concat(kb_table, '\n'))
    file:close()

Считать скриптом из файла reaper-kb.ini - ID кастома по его имени - !_VolTest001.eel
PHP:
    function Get_ID_By_Name(name)
      kb_table = {}
      filename = reaper.GetResourcePath()..'/'..'reaper-kb.ini'
      file = io.open(filename, "r")
      content = file:read("*all")
      for line in io.lines(filename) do table.insert(kb_table, line) end
      file:close()
    
      for i = 1, #kb_table do
        if string.find(kb_table[i], name) ~= nil then
          temp_t = {}
          for word in string.gmatch(kb_table[i], '.-[%s]') do table.insert(temp_t, word) end
          return '_'..string.sub(temp_t[4],0,-2)
        end
      end
    end
  
    command_name = Get_ID_By_Name('!_VolTest001.eel')
    reaper.ShowConsoleMsg(command_name)
    reaper.Main_OnCommand(reaper.NamedCommandLookup(command_name), 1)
 
Последнее редактирование:

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