ReaScripts (скрипты для Reaper) - делимся (1 онлайн

Alex Longard

Well-Known Member
10 Май 2015
1.966
1.182
113
@M16, какой имено пульт?
Если внешний железный - прийдется для CSI писать зону.
 

Alex Longard

Well-Known Member
10 Май 2015
1.966
1.182
113
@M16, всякое бывает, так как скриптами можно рулить внешним железом - бывает и тут спрашивают.
Поковыряйте настройки темы.
 

Resha

New Member
26 Янв 2022
1
0
1
23
Подскажите пожалуйста в чем может быть проблема. Не работают скрипты. Шапка скрипта появляется, но после нажатия activate ничего не происходит
 

Вложения

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.602
1.242
113
54
Киев
@maxmusic,
Код:
[email protected] MaxMusicMax; Midi Editor; Item; Mute all items in track
[email protected] 0
[email protected] MaxMusicMax
-----------------------------------------------------
-- Function Button
local function SetToggleButtonOnOff(numb);
        local _,_,sec,cmd,_,_,_ = reaper.get_action_context();
        reaper.SetToggleCommandState(sec,cmd,numb or 0);
        reaper.RefreshToolbar2(sec,cmd);
     end;

function print_rs (param)
    reaper.ShowConsoleMsg (tostring (param) .. "\n")
end
-- #######################################
-- #######################################
reaper.PreventUIRefresh(1);
-- #######################################
-- #######################################
local ME = reaper.MIDIEditor_GetActive()
local take = reaper.MIDIEditor_GetTake(ME)
local take_track = reaper.GetMediaItemTake_Track(take)
local is_solo = reaper.GetMediaTrackInfo_Value(take_track, 'I_SOLO')

-- Состояние первого айтема
local  state_item = reaper.GetMediaItemInfo_Value ( reaper.GetTrackMediaItem ( take_track, 0 ), 'B_MUTE' )

if  state_item == 0 then
    -- Состояние unmute
    for i=1, reaper.CountTrackMediaItems(take_track)  do
        local item = reaper.GetTrackMediaItem ( take_track, i-1 )
        reaper.SetMediaItemInfo_Value( item, 'B_MUTE', 1 )
        SetToggleButtonOnOff(1)--Button of
    end
else
    -- Состояние mute
    for i=1, reaper.CountTrackMediaItems(take_track)  do
        local item = reaper.GetTrackMediaItem ( take_track, i-1 )
        reaper.SetMediaItemInfo_Value( item, 'B_MUTE', 0 )
        SetToggleButtonOnOff(0)-- Button on
    end
end
-- #######################################
-- #######################################
reaper.PreventUIRefresh(-1);
reaper.TrackList_AdjustWindows(0);  -- Updates the window view
reaper.UpdateArrange();  -- Updates the window view
Так вроде работает. В самом начале добавил саму функцию кнопки, после событий мьют и анмьют действия состояния кнопки.
(Не умею правильно изъясняться, просто этот код мне когда-то Арчи подсказал)))))))
 

maxmusic

New Member
10 Дек 2008
11
10
3
@maxmusic,
Код:
[email protected] MaxMusicMax; Midi Editor; Item; Mute all items in track
[email protected] 0
[email protected] MaxMusicMax
-----------------------------------------------------
-- Function Button
local function SetToggleButtonOnOff(numb);
        local _,_,sec,cmd,_,_,_ = reaper.get_action_context();
        reaper.SetToggleCommandState(sec,cmd,numb or 0);
        reaper.RefreshToolbar2(sec,cmd);
     end;

function print_rs (param)
    reaper.ShowConsoleMsg (tostring (param) .. "\n")
end
-- #######################################
-- #######################################
reaper.PreventUIRefresh(1);
-- #######################################
-- #######################################
local ME = reaper.MIDIEditor_GetActive()
local take = reaper.MIDIEditor_GetTake(ME)
local take_track = reaper.GetMediaItemTake_Track(take)
local is_solo = reaper.GetMediaTrackInfo_Value(take_track, 'I_SOLO')

-- Состояние первого айтема
local  state_item = reaper.GetMediaItemInfo_Value ( reaper.GetTrackMediaItem ( take_track, 0 ), 'B_MUTE' )

if  state_item == 0 then
    -- Состояние unmute
    for i=1, reaper.CountTrackMediaItems(take_track)  do
        local item = reaper.GetTrackMediaItem ( take_track, i-1 )
        reaper.SetMediaItemInfo_Value( item, 'B_MUTE', 1 )
        SetToggleButtonOnOff(1)--Button of
    end
else
    -- Состояние mute
    for i=1, reaper.CountTrackMediaItems(take_track)  do
        local item = reaper.GetTrackMediaItem ( take_track, i-1 )
        reaper.SetMediaItemInfo_Value( item, 'B_MUTE', 0 )
        SetToggleButtonOnOff(0)-- Button on
    end
end
-- #######################################
-- #######################################
reaper.PreventUIRefresh(-1);
reaper.TrackList_AdjustWindows(0);  -- Updates the window view
reaper.UpdateArrange();  -- Updates the window view
Так вроде работает. В самом начале добавил саму функцию кнопки, после событий мьют и анмьют действия состояния кнопки.
(Не умею правильно изъясняться, просто этот код мне когда-то Арчи подсказал)))))))
оо, круто, спасиб
 
  • Like
Реакции: YuriOl и Mr_Tsonts

YuriOl

Well-Known Member
6 Май 2005
1.026
544
113
53
Луганск
www.youtube.com
@Mr_Tsonts,
У меня есть скрипт, похожий, но работает на выделенный айтем из окна миди редактора.
Именно мьют на выделенный айтем, для меня корректней работает. Вариант который у @maxmusic, на длинных нотах если мьютировать на ходу, то звук зависает, т.е звучит пока не переключишь туда-сюда или не остановишь воспроизведение. Это если использовать SWS: Toggle mute of items on selected track(s).
А если - Item properties: Toggle mute ID 40175,то всегда нормально глушит.)

Тоже Арчи кагда-то подсказал как делать, но вот не хватает статуса кнопки.
Подскажи пожалуйста, как в этом случае сделать. Или может есть уже другой какой способ?

Код:
-- NEW INSTANCE !!!


    local ID = 40175


    -------------------------------------------------
    local MIDIEditor = reaper.MIDIEditor_GetActive();
    if MIDIEditor then;

       if type(ID) ~= 'number' then;
          ID = reaper.NamedCommandLookup(ID or '');
       end;

       if tonumber(ID)then;
          reaper.Main_OnCommand(ID,0);
       end;
    end;
    -------------------------------------------------



    local ActiveDoubleScr,stopDoubleScr;
    local _,extnameProj,sec,cmd,_,_,_ = reaper.get_action_context();

    local function loop();
       ----- stop Double Script -------
       if not ActiveDoubleScr then;
          stopDoubleScr = (tonumber(reaper.GetExtState(extnameProj,"stopDoubleScr"))or 0)+1;
          reaper.SetExtState(extnameProj,"stopDoubleScr",stopDoubleScr,false);
          ActiveDoubleScr = true;
       end;

       local stopDoubleScr2 = tonumber(reaper.GetExtState(extnameProj,"stopDoubleScr"));
       if stopDoubleScr2 > stopDoubleScr then  return  end;
       --------------------------------

       local tog = reaper.GetToggleCommandStateEx(0,ID);

       if tog == 1 then;
          if not ActiveOff then;
             reaper.SetToggleCommandState(sec,cmd,1);
             reaper.RefreshToolbar2(sec, cmd);
             ActiveOn = nil;
             ActiveOff = true;
          end;
       else;
          if not ActiveOn then;
             reaper.SetToggleCommandState(sec,cmd,0);
             reaper.RefreshToolbar2(sec, cmd);
             ActiveOff = nil;
             ActiveOn = true;
          end;
       end;
       --------------------------------
       reaper.defer(loop);
    end;

    reaper.defer(loop);
 
Последнее редактирование:

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.602
1.242
113
54
Киев
@YuriOl, а тут я не знаю пока... Дело в том, что я вижу, что он эту функцию вписал, но почему она не работает, хз. Там не просто сделать мьют и анмьют, там он ссылается на штатный тоггле.
Сама суть в том, чтобы замьютировать айтем, который открыт в миди эдиторе? Типа тоггле нужно?
 

YuriOl

Well-Known Member
6 Май 2005
1.026
544
113
53
Луганск
www.youtube.com
@YuriOl, а тут я не знаю пока... Дело в том, что я вижу, что он эту функцию вписал, но почему она не работает, хз. Там не просто сделать мьют и анмьют, там он ссылается на штатный тоггле.
Сама суть в том, чтобы замьютировать айтем, который открыт в миди эдиторе? Типа тоггле нужно?
Да!
А код этот Арчи сделал как универсальный помошник,) для штатных скриптов, которые из окна аранжировки можно перенести в миди едитор вписав туда (в самом верху) только ID комманду.
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.602
1.242
113
54
Киев
@YuriOl, я догадался, только состояние кнопки не работает. Я не знаю как его доработать. Его, по-моему, нужно полностью для этого переделать. Может, кто-то ещё поможет.
 

borisuperful

Well-Known Member
31 Янв 2013
2.004
1.123
113
@YuriOl, я догадался, только состояние кнопки не работает. Я не знаю как его доработать. Его, по-моему, нужно полностью для этого переделать. Может, кто-то ещё поможет.
Это из-за того, что видимо из миди редактора не хочет брать toggle state у экшна под ID 40175 из секции Main, надо по другому реализовать. Либо toggle state самого же скрипта, либо через ProjectExtState. Посмотрю
 
  • Like
Реакции: YuriOl и Mr_Tsonts

borisuperful

Well-Known Member
31 Янв 2013
2.004
1.123
113
Друзья! Просто хотел сказать, периодически захожу на форумы, могу помогать по скриптам, все мы надеемся, что с Archie все хорошо! Но он пропал, придется его подхватить, к тому же я повышаю свой уровень знаний ReaScript, ввиду того, что еще параллельно прохожу обучение на курсах (тестирование, программирование), если будет нужна своевременная помощь, я оставил ссылку в подписи на пожертвования! Я буду стараться реагировать своевременно и делать все, что в моих силах. Наверное для русских пользователей оставлю еще юмани, чуть позже.
Спасибо всем!
 

borisuperful

Well-Known Member
31 Янв 2013
2.004
1.123
113
@Mr_Tsonts, @YuriOl, вот более упрощенный вариант, Archie пытался фоновый скрипт сделать, но в миди редакторе это не работает

Код:
function bla() end
function nothing() reaper.defer(bla) end

local MIDIEditor = reaper.MIDIEditor_GetActive()
if MIDIEditor then
  take = reaper.MIDIEditor_GetTake(MIDIEditor)
  if take then
    item = reaper.GetMediaItemTake_Item(take)
    mute_state = reaper.GetMediaItemInfo_Value( item, "B_MUTE")
 
    local is_new_value,filename,sectionID,cmdID,mode,resolution,val = reaper.get_action_context()

    local tog = reaper.GetToggleCommandState(cmdID)
    
    if tog == 1 then
      reaper.SetMediaItemInfo_Value( item, "B_MUTE", 0)
      reaper.SetToggleCommandState(sectionID,cmdID,0)
    else
      reaper.SetMediaItemInfo_Value( item, "B_MUTE", 1)
      reaper.SetToggleCommandState(sectionID,cmdID,1)
    end
    reaper.RefreshToolbar2(sectionID, cmdID)
    reaper.UpdateArrange()
  end
end

nothing()
 
  • Like
Реакции: YuriOl и Mr_Tsonts

dsg

Member
7 Июн 2020
16
34
13
30
vk.com
Настраиваемый фейдер для регулировки громкости выхода (не мастера).

Удобно чтоб не трогать аудиокарту и если посыл на мастере труднодоступен.
Легко настроить под свою тему.
Запоминает позицию и сам запускается при старте если задочен.





Reapack репозиторий
Для прямого скачивания
 

truemanofan

Member
2 Июн 2019
28
38
13
@dsg, довольно удобно =)
Только мне почему-то так аккуратно, чтоб было все компактно и с ресайзом, задочить фейдер в верхний правый угол не удалось =) Подскажите где нажать? =)
dock.gif
 

dsg

Member
7 Июн 2020
16
34
13
30
vk.com
@dsg, довольно удобно =)
Только мне почему-то так аккуратно, чтоб было все компактно и с ресайзом, задочить фейдер в верхний правый угол не удалось =) Подскажите где нажать? =)
Посмотреть вложение 215937
А вон тому тулбару с кнопкой надо другую позицию поставить.

215940
 
  • Like
Реакции: truemanofan
25 Июл 2017
102
23
18
39
@M16, какой имено пульт?
Если внешний железный - прийдется для CSI писать зону.
Привет! А мне как раз нужно посылать команды на железный пульт. Это пульт 91 года, там автоматизация была. Команды можно посылать по COM через USB на определённый порт. Нужна информация, как такое написать в Рипере. Спасибо!
 
25 Июл 2017
102
23
18
39
@Дима Горелик, нужно писать расширение на C++, у Reaper нет функций для работы с com-портом.
Привет! Спасибо! Вот прикольно - ждал ответа какое-то время и вы с Леандро ответили одновременно. Вот его ответ:
I’ve never done it myself, so I can’t say for sure. But probably the answer is: yes, but it’s a bit tricky.

The complication is that JSFX runs in a pretty tightly controlled sandbox, so it doesn’t have access to anything related to USB. This is by design: it’s this tightly controlled sandbox that makes JSFX unable to crash REAPER while you’re experimenting with stuff in real-time as you’re developing; and it’s also part of what makes JSFX so beginner-friendly and appealing.

But in your case you want the JSFX to have control over stuff outside the sandbox, so I think that the best way to do it is by sending a message to another piece of software that acts as an intermediary: it receives the message from JSFX and sends the COM command.

Here’s an example of how to do this:

1. In JSFX, write to the gmem. The gmem is a global chunk of memory that’s visible by JSFX, ReaScripts, video processors, and so forth.

2. In a ReaScript that’s running continuously on the background, read from the gmem. (To make a ReaScript run continuously on the background, look into ‘reaper.defer()’).

3. When the ReaScript receives a message from the JSFX, send the COM command. This may be done from Lua in several ways, but possibly the most straightforward is by calling a program on the command line (see ‘reaper.ExecProcess()’).

The whole process goes like this:

216458


Here’s an example of JSFX & ReaScript that write & read from gmem:

// JSFX
options:gmem=leafac_gmem
@Init
gmem[0] = 1234;

-- ReaScript
reaper.gmem_attach("leafac_gmem")
reaper.ShowConsoleMsg(tostring(reaper.gmem_read(0)))

And you may refer to some of my scripts for examples of how to call command line programs from ReaScript.

And keep in mind that gmem is only way for the JSFX to communicate with the intermediary that will help it “escape the sandbox.” Any other side-channel will work as well, for example, MIDI, or even audio samples. You could have JSFX encode information into the audio stream (presumably on a separate channel), and have the intermediary monitor that audio stream.

Let me know how it goes.

Best.

Если кто-то возьмётся написать подобную програму, я буду готов это оплатить.
 

Вложения

Сейчас онлайн (Пользователей: 0, Гостей: 1)