ReaScripts (скрипты для Reaper) - Учимся создавать!!!

А можно скриптами миди треки писать. Запустил скрипт, он фанеру написал и инструменты выбрал и всё - можно петь!
 
@Aleksandr Oleynik, нужно запомнить в ext state позицию окна скрипта и текущие настройки gfx_w; gfx_h;
Позицию окна - для этого коорд. окна скрипта в коорд. окна Рипера. Можно просто от нулей (x=0; y=0), чуть лучше - взять некие постоянные отр. значения по рамкам.
Но лучше всего правильно посчитать отступы, чтобы окно никогда не съезжало постоянно на +/-. Я где-то выкладывал принцип - был вопрос, как свернуть/развернуть окно скрипта.
 
  • Like
Реакции: Aleksandr Oleynik
Новое
А можно скриптами миди треки писать. Запустил скрипт, он фанеру написал и инструменты выбрал и всё - можно петь!
С опр. набором условий - можно. Уверен на 100%, что через какое-то время вопрос будет не смешным, а реальным.
лет 10 назад - BB midiout >> Reaper midi input >> какие-то древние библы из Контакт или вообще Hypersonic.





----------------------------
BB построен на паттернах. Воды много утекло, а они закопались в Аудио(наверное, зря).
 

Вложения

Подскажите, кто знает, как получить "ID" скрипта ?
 
Последнее редактирование:
Это я знаю, Скриптом как получить?
А по какому признаку вы хотите его получать и зачем?
Если вам известно имя скрипта, то запускайте его по имени.
А если вам не известно его имя, то как вы собрались по API узнавать его ID?
 
Имя то известно, а как запустить его по имени?
По "id" знаю как запустить, а по имени не знаю!
Не подскажете как?
 
Последнее редактирование:
вот так reaper.Main_OnCommand(reaper.NamedCommandLookup('_RSada20633a8d9576327cdedd9526f6dc9e195fd28'), 0) или так например с путем


local info = debug.getinfo(1,'S');
script_path = info.source:match[[^@?(.*[\/])[^\/]-$]]
dofile(script_path .. "/Nantho_PeakVsRMS/spk77_Get max peak val and pos from take_function.lua")
 
PHP:
function GetScriptNameByID(ID)
  local fp, cont = reaper.GetResourcePath()..'/reaper-kb.ini'
  local f = io.open(fp, 'a+')
  if not f then return else cont = f:read('a') f:close() end
  return cont:match(ID:match('[%a%d]+')..'%s"(.-)".-\n')
end

scriptname = GetScriptNameByID('_RS5a9b832ada3f7ee194cb55a9e2e504626cd6a546')
 
  • Like
Реакции: Archie's
PHP:
function GetIDByScriptName(scriptname)
  local fp, cont = reaper.GetResourcePath()..'/reaper-kb.ini'
  local f = io.open(fp, 'a+')
  if not f then return else cont = f:read('a') f:close() end
  scriptname = scriptname:gsub('Script:%s' ,''):gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", function(c) return "%" .. c end)
  for line in cont:gmatch('[^\r\n]+') do if line:match(scriptname) then return line:match('RS[%a%d]+') end end
end

ID = GetIDByScriptName('Script: Argitoth_Select items with color of selected items.eel')
 
Ребята, подскажите. Как выделить самый первый айтем трека без снятия выделения на таймлане и переходов? Вроде обсмотрел все, не могу найти похожего экшена...
--------------
Вопрос снят. нашел )
 
Подскажите кто знает как работать с gfx.blit(), то есть не как работать, а как осуществить вот такое и возможно ли это?
Нашел от Михаила описание
@Michael сказал(а): Blit примерно так работает:
PHP:
if update_gfx then -- cначала определяем триггер, по которому в какой-либо из буферов будет писаться графика
    gfx.dest = 1 -- номер буфера 1..32 (кажется)
    gfx.setimgdim(1, -1, -1) -- этим я сбрасываю графику внутри этого буфера, иначе она будет писаться поверх того, что уже есть
    gfx.setimgdim(1, w, h) -- определяем размеры записываемой графики
    gfx.a = 1
    gfx.rect(0,0, w,h) -- рисуем что требуется
end


gfx.dest = -1  -- -1 - это основной слой
gfx.a = 1 -- альфа для буферов
gfx.blit(1, 1, 0, -- этим вытаскиваем первый буфер и сразу его переворачиваем/обрезаем/сжимаем при необходимости
          0,0,w,h,
          0,0,w,h,0,0)
Вроде все понятно, но по этому описанию я могу сохранить графику только от 0, то есть "x, y" у нас всегда ноль gif 1 и картинка сохраняется всегда от левого верхнего угла.
Вопрос: А как сохранить кусок с права gif_2 или например кусок в центре gif_3. Как задать координаты иксу и игреку?
 

Вложения

  • gif_1.png
    gif_1.png
    2,7 KB · Просмотры: 218
  • gif_1.png
    gif_1.png
    2,7 KB · Просмотры: 278
  • gif_2.png
    gif_2.png
    5,7 KB · Просмотры: 262
  • gif_3.png
    gif_3.png
    3,8 KB · Просмотры: 276
Последнее редактирование:
Есть нечто интересное, может быть... Я хочу оставить пару вещей.
Об этом говорили на кокосовском форуме, мне трудно там ответить обстоятельно, так сказать.
Там вопрос про массивы был. Есть у нас менеджеры памяти, даже несколько вариантов.
А когда у нас в руках память - у нас есть и все остальное. По сути дела - дин. распределение памяти решает все вопросы.
И все это очень красиво сходится. Почему же это никто не выложил?
Потому что пц. Графика идет отдельно, и все может развалиться, отдельный поток...
 
  • Like
Реакции: PianoIst
Друзья помогите пожалуйста запутался в трех соснах. Хотел сделать горизонтальный drag zoom для мидиредактора. Сообразил как взять начальную точку когда сделан щелчок и потом вычслить разницу при горизонтальном оттяге мыши, но как правильно встроить сам зум не соображу и что бы когда мышка остановилась то остановить зум. И если опять начала движение не отпуская конопки то возбновить зум.
Код:
function msg(m)
  reaper.ShowConsoleMsg(tostring(m) .. "\n")
end

on=0
move=0

function main()

state =  reaper.JS_Mouse_GetState(1) 
if state > 0 then

if on==0 then x = reaper.GetMousePosition() end
x1 = reaper.GetMousePosition()
on=1
diff = (x1-x)*0.01

msg(diff)

--reaper.Main_OnCommand(1012, 0)

else
on=0
end

reaper.defer(main)
end


main()
 
и что бы когда мышка остановилась то остановить зум. И если опять начала движение не отпуская конопки то возбновить зум.
Код:
function msg(m)
  reaper.ShowConsoleMsg(tostring(m) .. "\n")
end

on=0
move=0


function main()
if not bla then bla = 0 end 
if not diff then diff = 0 end
state =  reaper.JS_Mouse_GetState(1) 
if state > 0 then

if on==0 then x = reaper.GetMousePosition() end
x1 = reaper.GetMousePosition()
on=1
diff = (x1-x)*0.01

msg(diff)
if diff ~= bla then
   
    midieditor = reaper.MIDIEditor_GetActive()
    if diff < bla then
        --reaper.Main_OnCommand(1011, 0)
        reaper.MIDIEditor_OnCommand( midieditor,1011)
    else
        --reaper.Main_OnCommand(1012, 0)
        reaper.MIDIEditor_OnCommand( midieditor,1012)
    end   
bla = diff
end

else
on=0
diff=0
bla=0
end

reaper.defer(main)
end


main()
 
Последнее редактирование:
  • Like
Реакции: incubator
@Archchie, Спасибо Артем все просто было оказываеться, а всякую математику сложноую стал разводить и циклы - безрезультатно)) У тебя явный талант к програмированию.Думаю если ты начнешь изучать с++ то будешь творить невероятные вещи!)
 
  • Like
Реакции: Archie's
Есть такая идея - создать инструмет, который бы позволял работать над одним проектом группе людей.
Применений может быть много, но меня интересует работа над созданием композиции группой музыкантов удалённо.
Когда кто-то выкладывает основную тему и все остальные дописывают, доаранжировывают её самостоятельно и удалённо.

Понятно, что проект и айтемы нужно заливать куда то в облако. Также нужно, открыв проект и запустив скрипт видеть, что по отношению к текущемму проекту в облаке произошли изменения и кто эти изменения из группы внёс.

Я не совладаю с такой задачей, а был бы очень не плохой инструмент.

Материал, для экономии места в облаке, можно было бы коныертить в mp3 при отправке--синхронизации.
 
Последнее редактирование:
@Aleksandr Oleynik, мне кажется в базе решения должна быть некая система контроля версий, типа git.
Это не столько задача для ReaScript, сколько более глобальная задача контроля версий для проектов с объемными данными. На самом деле, я уже полгода иногда думаю, как бы она могла выглядеть, но ничего конкретного пока не приходит в голову...
 
  • Like
Реакции: Archie's
@PianoIst, я это вижу на много проще.
При начале работы с локальным проектом, скрипт сравнивает его версию по времени и по автору с тем, что в облаке.
Паралельно пишется база небольшая синхронизаций, где есть всего лишь время и автор.
Скрипт и проект свежий тянет из облака и базу показывает - кто и когда проект обновлял.
А обновляется он перед закрытием локального проекта.
Ещё можно сделать так, что по сути у каждого музыканта будет свой проект, как саб проект общего. Тогда можно сделать так, что по сути править проекты будет каждый свои, но сможет слышать итоговый просчитанный проект коллеги в общем миксе.
Тогда можно будет СВОЙ проект, с многими айтемами и обработками и прочим, хранить только локально, а в облако заливать только отрендерённый саб проект, как одну дорожку.
 
Последнее редактирование:
  • Like
Реакции: PianoIst
@Aleksandr Oleynik, Тогда, в принципе, можно думать про что-то вроде diff-view для мастер-проекта, который будет хранить ревизии саб-проектов (причем, учитывая, что саб-проектов вряд ли будет больше 10, можно их хранить не в mp3 а сразу в wavpack).
Давай мы эту мысль обмозгуем числа после 8-го фервраля? нарисуем и заведем на гитхабе досточку?
Кстати, https://ru.stackoverflow.com/questions/519283/Как-использовать-git-для-контроля-версий-в-unity3d
 
  • Like
Реакции: Aleksandr Oleynik
ОК. Я бы и сам справился с таким скриптом, но совершенно не знаю как подступиться к действиям, которые нужно из Рипера делать скриптом вне Рипера.
есть какие-то приметивные API-шки стандартных команд в операционке с файлами, но их похоже будет не достаточно, или прийдётся ставить какую-то доп программу внешнюю, которая будет следить за проектом Рипера и делать с ним уже всё прочее, что связанно с облаком, версиями и прочим - ну и формировать какой-то текстовый файл, который будет читать скрипт в Рипере.
 
  • Like
Реакции: PianoIst
Доброго времени суток всем! Подскажите, где можно набраться азов в gfx рипера? Может какое-то более подробное описание функций есть. Или может не на рипере. Интересует только создание кнопок, галок и строка для ввода.
 

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