Помогите создать экшн / кастом экшн / скрипт (4 онлайн)

diggidon

Administrator
Команда форума
26 Май 2008
6.832
7.486
113
51
Днепр UA
Ребята, помогите, плиз.
Нужна пара несложных, но очень важных для меня скриптов.

Первый, в мэйн окне:
1. Находим и выделяем миди-айтем по названию (как вариант - по названию трека, всё равно на треке этот миди-айтем будет единственным).
2. В выделенный миди-айтем вставляем миди-ноту с заданными параметрами (миди-канал, номер ноты, длительность, велосити)
Вставляем по
а) mouse курсору (мышь при этом ессно вертикально может находиться где угодно, хоть на три трека выше),
b) edit курсору

Второй, в окне миди-эдитора:
То же самое (только первый пункт опускаем). Тоже по мыши и по эдит-курсору.

Ну и просьба закомментить в коде пояснялочку, где что менять (название миди-айтем/миди-трека, и параметры миди-ноты).

Заранее большое спасибо.
 
25 Июл 2017
102
23
18
40
Привет всем! Помогите создать вот такой скрипт, пожалуйста: Render selected tracks through (pre)Master by time selection with 1xOffline Render (idle), 64 bit. Так, чтобы отрендериный айтем добавлялся в проект, и ещё и желательно, не последним треком, а одним треком ниже того трека, которого рендерили. Спасибо!
 
Последнее редактирование:

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@diggidon,
PHP:
    local NAME_ITEM = -1 -- -1 looking for item with name track, otherwise enter "item name"
    local POSITIOT_NOTE = 1     -- 0 editCur / 1 mouseCur
    local LENGTH_NOTE   = 0.468 -- длина ноты
    local SELECTED      = true  -- true / false
    local MUTED         = false -- true / false
    local CHAN          = 1     -- 1 - 16
    local PITCH         = 0     -- 0 - 127 / 12*3+2
    local VELOCITY      = 100   -- 0 - 127



    ----------------------------------------------
    local selTrack = reaper.GetSelectedTrack(0,0);
    if not selTrack then return end;

    if POSITIOT_NOTE == 0 then
        PosMouseCur = reaper.GetCursorPosition();
    elseif POSITIOT_NOTE == 1 then
        PosMouseCur = reaper.BR_PositionAtMouseCursor(true);
        if PosMouseCur < 0 then return end;
    else
        return
    end
    if type(PosMouseCur) ~= "number" then return end

    local TrackName
    if NAME_ITEM == -1 then
        retval, TrackName = reaper.GetSetMediaTrackInfo_String(selTrack,"P_NAME",0,0);
    else
        TrackName = NAME_ITEM
    end

    local CountTrItem = reaper.CountTrackMediaItems(selTrack);
    for i = 1,CountTrItem do;
    
        local Item = reaper.GetTrackMediaItem(selTrack,i-1);
        local PosIt = reaper.GetMediaItemInfo_Value(Item,"D_POSITION");
        local LinIt = reaper.GetMediaItemInfo_Value(Item,"D_LENGTH");
    
        if PosIt <= PosMouseCur and PosIt + LinIt > PosMouseCur then
        
            reaper.SetMediaItemInfo_Value(Item,"B_UISEL",1);
        
            local CountTake = reaper.CountTakes(Item);
            for i2 = 1,CountTake do;
                local Take = reaper.GetMediaItemTake(Item,i2-1);
                local retval,TakeName = reaper.GetSetMediaItemTakeInfo_String(Take,"P_NAME",0,0);
                if TakeName == TrackName then
                     ----
                     local startppqpos = reaper.MIDI_GetPPQPosFromProjTime(Take, PosMouseCur );
                     local endppqpos = reaper.MIDI_GetPPQPosFromProjTime(Take, PosMouseCur+LENGTH_NOTE);
                      reaper.MIDI_InsertNote
                      (Take,SELECTED,MUTED,startppqpos,endppqpos,CHAN-1,PITCH,VELOCITY,false)
                end;
            end;
        end;
    end;
    ---------------------------------------------------------------
PHP:
    local POSITIOT_NOTE = 1     -- 0 editCur / 1 mouseCur
    local LENGTH_NOTE   = 0.468 -- длина ноты
    local SELECTED      = true  -- true / false
    local MUTED         = false -- true / false
    local CHAN          = 1     -- 1 - 16
    local PITCH         = 0     -- 0 - 127 / 12*3+2
    local VELOCITY      = 100   -- 0 - 127




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


    if POSITIOT_NOTE == 0 then
       PosMouseCur = reaper.GetCursorPosition();
    elseif POSITIOT_NOTE == 1 then
       local window,segment,details = reaper.BR_GetMouseCursorContext();
       if window == "midi_editor" then
          PosMouseCur = reaper.BR_GetMouseCursorContext_Position()
       end
    else
       return
    end

    if type(PosMouseCur) ~= "number" then return end


    local Take = reaper.MIDIEditor_GetTake( MIDIEditor )

    local startppqpos = reaper.MIDI_GetPPQPosFromProjTime(Take, PosMouseCur );
    local endppqpos = reaper.MIDI_GetPPQPosFromProjTime(Take, PosMouseCur+LENGTH_NOTE);
    reaper.MIDI_InsertNote
    (Take,SELECTED,MUTED,startppqpos,endppqpos,CHAN-1,PITCH,VELOCITY,false)
    -----------------------------------------------------------------------
 
Последнее редактирование:
  • Love
Реакции: diggidon

diggidon

Administrator
Команда форума
26 Май 2008
6.832
7.486
113
51
Днепр UA
@Archchie, огромное спасибо, то, что надо!
Можно ещё две небольшие хотелочки в эти скрипты?
1. При добавлении миди-ноты хочется, чтобы она "отзвучала" (режим preview)
2. Перед добавлением ноты скрипт должен проверить, есть ли возле мыши (или эдит курсора) нота ЭТОЙ ЖЕ ВЫСОТЫ, и если да, то сначала удалтить её, а потом уже вставить новую.
Очень важно, чтобы не прямо под мышью, а рядом - если мышь будет на пиксель-два слева от ноты, скрипт всё равно должен её найти и удалить.

И маленькая правочка в скрипт мэйн окна:
Сделай, плиз, чтобы скрипт сам находил и выделял трек по имени (которое будет указано в тексте скрипта).
Не совсем удобно каждый раз кликать по миди-треку или айтему (а иначе скрипт не срабатывает).
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@diggidon,
1. К сожаления я не знаю как это реализовать.
2. Сделал, отступ регулируй параметрам "DEL_NOTE_RAD"
3. Сделал
PHP:
    local DEL_NOTE_RAD = 0  -- в каком радиусе искать ноту (установить отступ 0 точно 1,2,30 и т.д. это отступ в каждую сторону  )
    local NAME_TRACK = "test"
  
    local NAME_ITEM = -1 -- -1 looking for item with name track, otherwise enter "item name"
    local POSITIOT_NOTE = 1     -- 0 editCur / 1 mouseCur
    local LENGTH_NOTE   = 0.468 -- длина ноты
    local SELECTED      = true  -- true / false
    local MUTED         = false -- true / false
    local CHAN          = 1     -- 1 - 16
    local PITCH         = 0     -- 0 - 127 / 12*3+2
    local VELOCITY      = 100   -- 0 - 127
  
  
  
  
    local function remNote(Take,startppqpos,DEL_NOTE_RAD)
        local _, notecnt,_,_ = reaper.MIDI_CountEvts(Take);
        for i = notecnt-1,0,-1 do;
            retval,selected,muted,startppq,endppq,chan,pitch,vel = reaper.MIDI_GetNote(Take,i)
            if startppq > startppqpos - DEL_NOTE_RAD and startppq < startppqpos + DEL_NOTE_RAD and pitch == PITCH then
                reaper.MIDI_DeleteNote(Take,i);
            end
        end;
    end;
  
  
    ----------------------------------------------
    --local selTrack = reaper.GetSelectedTrack(0,0);
    --if not selTrack then return end;
    ----------------------------------------------
    local CountTracks = reaper.CountTracks(0)
    for i = 1, CountTracks do
        local Track = reaper.GetTrack(0,i-1);
        local _, Name = reaper.GetSetMediaTrackInfo_String(Track,"P_NAME",0,0);
        if Name == NAME_TRACK then
            reaper.SetTrackSelected(Track,1)
            selTrack = Track
            break
        end
    end
    if not selTrack then return end;
    ----------------------------------------------
  
    if POSITIOT_NOTE == 0 then
        PosMouseCur = reaper.GetCursorPosition();
    elseif POSITIOT_NOTE == 1 then
        PosMouseCur = reaper.BR_PositionAtMouseCursor(true);
        if PosMouseCur < 0 then return end;
    else
        return
    end
    if type(PosMouseCur) ~= "number" then return end
  
    local TrackName
    if NAME_ITEM == -1 then
        retval, TrackName = reaper.GetSetMediaTrackInfo_String(selTrack,"P_NAME",0,0);
    else
        TrackName = NAME_ITEM
    end
  
    local CountTrItem = reaper.CountTrackMediaItems(selTrack);
    for i = 1,CountTrItem do;
   
        local Item = reaper.GetTrackMediaItem(selTrack,i-1);
        local PosIt = reaper.GetMediaItemInfo_Value(Item,"D_POSITION");
        local LinIt = reaper.GetMediaItemInfo_Value(Item,"D_LENGTH");
   
        if PosIt <= PosMouseCur and PosIt + LinIt > PosMouseCur then
       
            reaper.SetMediaItemInfo_Value(Item,"B_UISEL",1);
       
            local CountTake = reaper.CountTakes(Item);
            for i2 = 1,CountTake do;
                local Take = reaper.GetMediaItemTake(Item,i2-1);
                local retval,TakeName = reaper.GetSetMediaItemTakeInfo_String(Take,"P_NAME",0,0);
                if TakeName == TrackName then
                     ----
                     local startppqpos = reaper.MIDI_GetPPQPosFromProjTime(Take, PosMouseCur );
                     local endppqpos = reaper.MIDI_GetPPQPosFromProjTime(Take, PosMouseCur+LENGTH_NOTE);
                      -----
                      remNote(Take,startppqpos,DEL_NOTE_RAD,PITCH)
                      -----
                      reaper.MIDI_InsertNote
                      (Take,SELECTED,MUTED,startppqpos,endppqpos,CHAN-1,PITCH,VELOCITY,false)
                end;
            end;
        end;
    end;
    ---------------------------------------------------------------
PHP:
    local DEL_NOTE_RAD = 0  -- в каком радиусе искать ноту (установить отступ 0 точно 1,2,30 и т.д. это отступ в каждую сторону  )
  
    local POSITIOT_NOTE = 1     -- 0 editCur / 1 mouseCur
    local LENGTH_NOTE   = 0.468 -- длина ноты
    local SELECTED      = true  -- true / false
    local MUTED         = false -- true / false
    local CHAN          = 1     -- 1 - 16
    local PITCH         = 0     -- 0 - 127 / 12*3+2
    local VELOCITY      = 100   -- 0 - 127
  
  
  
    local function remNote(Take,startppqpos,DEL_NOTE_RAD)
       local _, notecnt,_,_ = reaper.MIDI_CountEvts(Take);
       for i = notecnt-1,0,-1 do;
          retval,selected,muted,startppq,endppq,chan,pitch,vel = reaper.MIDI_GetNote(Take,i)
          if startppq > startppqpos - DEL_NOTE_RAD and startppq < startppqpos + DEL_NOTE_RAD and pitch == PITCH then
             reaper.MIDI_DeleteNote(Take,i);
          end
       end;
    end;
  

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


    if POSITIOT_NOTE == 0 then
      PosMouseCur = reaper.GetCursorPosition();
    elseif POSITIOT_NOTE == 1 then
      local window,segment,details = reaper.BR_GetMouseCursorContext();
      if window == "midi_editor" then
        PosMouseCur = reaper.BR_GetMouseCursorContext_Position()
      end
    else
      return
    end

    if type(PosMouseCur) ~= "number" then return end


    local Take = reaper.MIDIEditor_GetTake( MIDIEditor )

    local startppqpos = reaper.MIDI_GetPPQPosFromProjTime(Take, PosMouseCur );
    local endppqpos = reaper.MIDI_GetPPQPosFromProjTime(Take, PosMouseCur+LENGTH_NOTE);
    ---
    remNote(Take,startppqpos,DEL_NOTE_RAD,PITCH)
    ---
    reaper.MIDI_InsertNote
    (Take,SELECTED,MUTED,startppqpos,endppqpos,CHAN-1,PITCH,VELOCITY,false)
    -----------------------------------------------------------------------
 
  • Like
Реакции: diggidon

diggidon

Administrator
Команда форума
26 Май 2008
6.832
7.486
113
51
Днепр UA
@Archchie, неа... Не удаляет предыдущую ноту, увы... Лепит поверх, и в мэйн окне, и в миди-эдиторе.
Трек по имени находит и выделяет, спасибо!
 

Вложения

diggidon

Administrator
Команда форума
26 Май 2008
6.832
7.486
113
51
Днепр UA
@Archchie, да, конечно.
И 0, и 10, и 20...
Упс, сорри, сообразил!
Параметр был очень маленький, нужно делать гораздо больше))
Спасибо, всё работает!
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@diggidon, этот параметр работает не по пикселям, а по времени к сожалению.
Установи например DEL_NOTE_RAD =200 или 300, но имей в виду, когда ты увеличишь зум, то это расстояние так же увеличится
 
  • Like
Реакции: diggidon

diggidon

Administrator
Команда форума
26 Май 2008
6.832
7.486
113
51
Днепр UA
@Archchie, а нельзя ли привязать этот параметр не ко времени, а к ticks peer quarters, например?
Сейчас параметр в чём считается? В миллисекундах?
UPD
Опытным путём выяснил, что параметр DEL_NOTE_RAD = 1000 ищет ноту в пределах 500 миллисекунд.
Ещё раз спасибо, с этим можно жить))
 
Последнее редактирование:
  • Like
Реакции: Archie's

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
а нельзя ли привязать этот параметр не ко времени, а к ticks peer quarters, например?
А что это за параметр?
Он привязан к ppq (я до конца не понимаю что это за параметр), позиция миди нот считается по этому параметру
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@diggidon, ppq - это и есть эти тики, смещение к тикам и привязано.
Но вот только меняя значения в настройках, в скрипте никакие параметры не меняются почему то.
 
  • Like
Реакции: diggidon

diggidon

Administrator
Команда форума
26 Май 2008
6.832
7.486
113
51
Днепр UA
@Archchie,
Йес, я победил свою хотелку по поводу "preview note" (чтобы нота "отзвучала" при добавлении)!!!
Для мэйн окна в код скрипта в конце достаточно вставить что-то типа этого:

reaper.Main_OnCommand(40153, 0); -- включить миди-эдитор
reaper.MIDIEditor_LastFocused_OnCommand(40462, 0); -- velo +1
reaper.MIDIEditor_LastFocused_OnCommand(2, 0); -- закрыть миди-эдитор

Для миди-эдитора - кастом на две строчки:

Твой скрипт.lua
Edit: Note velocity +01

Нота при добавлении будет звучать в обоих случаях!

З.Ы. Я счастлив чуть более, чем полностью.
 

diggidon

Administrator
Команда форума
26 Май 2008
6.832
7.486
113
51
Днепр UA
@Archchie, можно попросить тебя реализовать ещё одну маленькую правочку?
Вместо
Перед добавлением ноты скрипт должен проверить, есть ли возле мыши (или эдит курсора) нота ЭТОЙ ЖЕ ВЫСОТЫ, и если да, то сначала удалтить её, а потом уже вставить новую.
сделать так, чтобы скрипт искал и удалял не ноту этой же высоты, а ноту (ноты) с заданными параметрами высоты?
То есть, напимер - перед добавлением ноты 36 скрипт должен проверить, есть ли в этом месте нота (ноты) 36, 37, или 44, и если да, то удалить её (их)?
З.Ы. Я пытаюсь вникнуть в твой код, и сам чего-то там нашаманить, но знаний пока не хватает, увы...
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
Женя, что это ты за миди комбайн изобретаешь? Строишь авто аранджировщика? На пенсию решил?
 
  • Haha
Реакции: diggidon

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
сделать так, чтобы скрипт искал и удалял не ноту этой же высоты, а ноту (ноты) с заданными параметрами высоты?
То есть, напимер - перед добавлением ноты 36 скрипт должен проверить, есть ли в этом месте нота (ноты) 36, 37, или 44, и если да, то удалить её (их)?
Сделал, параметр REMOVE_PITCH_N - перечисляешь высоту удаляемых нот через запятую и обязательно в фигурных скобках.
PHP:
    local REMOVE_PITCH_N = {1,3,5,6,8,10}--Высоту указанной ноты через запятую, обязательно в фигурных скобках
    
    local DEL_NOTE_RAD = 1  -- в каком радиусе искать ноту (установить отступ 0 точно 1,2,30 и т.д. это отступ в каждую сторону)
    local POSITIOT_NOTE = 1     -- 0 editCur / 1 mouseCur
    local LENGTH_NOTE   = 0.468 -- длина ноты
    local SELECTED      = true  -- true / false
    local MUTED         = false -- true / false
    local CHAN          = 1     -- 1 - 16
    local PITCH         = 0     -- 0 - 127 / 12*3+2
    local VELOCITY      = 100   -- 0 - 127
  
  
    
    
    local function remNote(Take,startppqpos,DEL_NOTE_RAD,REMOVE_PITCH_N);
        local _, notecnt,_,_ = reaper.MIDI_CountEvts(Take);
        for i = notecnt-1,0,-1 do;
            local retval,selected,muted,startppq,endppq,chan,pitch,vel = reaper.MIDI_GetNote(Take,i);
            if startppq > startppqpos - DEL_NOTE_RAD and startppq < startppqpos + DEL_NOTE_RAD then;
                for i2 = 1,#REMOVE_PITCH_N do;
                    if pitch == REMOVE_PITCH_N[i2]-1 then;
                        reaper.MIDI_DeleteNote(Take,i);
                    end;
                end;
            end;
        end;
    end;
  
    
    
    
    --------------------------------------------------------
    local MIDIEditor = reaper.MIDIEditor_GetActive()
    if not MIDIEditor then return end;


    if POSITIOT_NOTE == 0 then
     PosMouseCur = reaper.GetCursorPosition();
    elseif POSITIOT_NOTE == 1 then
     local window,segment,details = reaper.BR_GetMouseCursorContext();
     if window == "midi_editor" then
       PosMouseCur = reaper.BR_GetMouseCursorContext_Position()
     end
    else
     return
    end

    if type(PosMouseCur) ~= "number" then return end


    local Take = reaper.MIDIEditor_GetTake( MIDIEditor )

    local startppqpos = reaper.MIDI_GetPPQPosFromProjTime(Take, PosMouseCur );
    local endppqpos = reaper.MIDI_GetPPQPosFromProjTime(Take, PosMouseCur+LENGTH_NOTE);
    ---
    remNote(Take,startppqpos,DEL_NOTE_RAD,REMOVE_PITCH_N)
    ---
    reaper.MIDI_InsertNote
    (Take,SELECTED,MUTED,startppqpos,endppqpos,CHAN-1,PITCH,VELOCITY,false)
    -----------------------------------------------------------------------
PHP:
    local REMOVE_PITCH_N = {1,3,5,6,8,10}--Высоту указанной ноты через запятую, обязательно в фигурных скобках
    
    local DEL_NOTE_RAD = 1  -- в каком радиусе искать ноту (установить отступ 0 точно 1,2,30 и т.д. это отступ в каждую сторону  )
    local NAME_TRACK = "test"
    local NAME_ITEM = -1 -- -1 looking for item with name track, otherwise enter "item name"
    local POSITIOT_NOTE = 1     -- 0 editCur / 1 mouseCur
    local LENGTH_NOTE   = 0.468 -- длина ноты
    local SELECTED      = true  -- true / false
    local MUTED         = false -- true / false
    local CHAN          = 1     -- 1 - 16
    local PITCH         = 0     -- 0 - 127 / 12*3+2
    local VELOCITY      = 100   -- 0 - 127
 
 
 
 
    local function remNote(Take,startppqpos,DEL_NOTE_RAD,REMOVE_PITCH_N);
        local _, notecnt,_,_ = reaper.MIDI_CountEvts(Take);
        for i = notecnt-1,0,-1 do;
            local retval,selected,muted,startppq,endppq,chan,pitch,vel = reaper.MIDI_GetNote(Take,i);
            if startppq > startppqpos - DEL_NOTE_RAD and startppq < startppqpos + DEL_NOTE_RAD then;
                for i2 = 1,#REMOVE_PITCH_N do;
                    if pitch == REMOVE_PITCH_N[i2]-1 then;
                        reaper.MIDI_DeleteNote(Take,i);
                    end;
                end;
            end;
        end;
    end;
 
 
    ----------------------------------------------
    --local selTrack = reaper.GetSelectedTrack(0,0);
    --if not selTrack then return end;
    ----------------------------------------------
    local CountTracks = reaper.CountTracks(0)
    for i = 1, CountTracks do
        local Track = reaper.GetTrack(0,i-1);
        local _, Name = reaper.GetSetMediaTrackInfo_String(Track,"P_NAME",0,0);
        if Name == NAME_TRACK then
            reaper.SetTrackSelected(Track,1)
            selTrack = Track
            break
        end
    end
    if not selTrack then return end;
    ----------------------------------------------
 
    if POSITIOT_NOTE == 0 then
        PosMouseCur = reaper.GetCursorPosition();
    elseif POSITIOT_NOTE == 1 then
        PosMouseCur = reaper.BR_PositionAtMouseCursor(true);
        if PosMouseCur < 0 then return end;
    else
        return
    end
    if type(PosMouseCur) ~= "number" then return end
 
    local TrackName
    if NAME_ITEM == -1 then
        retval, TrackName = reaper.GetSetMediaTrackInfo_String(selTrack,"P_NAME",0,0);
    else
        TrackName = NAME_ITEM
    end
 
    local CountTrItem = reaper.CountTrackMediaItems(selTrack);
    for i = 1,CountTrItem do;
  
        local Item = reaper.GetTrackMediaItem(selTrack,i-1);
        local PosIt = reaper.GetMediaItemInfo_Value(Item,"D_POSITION");
        local LinIt = reaper.GetMediaItemInfo_Value(Item,"D_LENGTH");
  
        if PosIt <= PosMouseCur and PosIt + LinIt > PosMouseCur then
      
            reaper.SetMediaItemInfo_Value(Item,"B_UISEL",1);
      
            local CountTake = reaper.CountTakes(Item);
            for i2 = 1,CountTake do;
                local Take = reaper.GetMediaItemTake(Item,i2-1);
                local retval,TakeName = reaper.GetSetMediaItemTakeInfo_String(Take,"P_NAME",0,0);
                if TakeName == TrackName then
                     ----
                     local startppqpos = reaper.MIDI_GetPPQPosFromProjTime(Take, PosMouseCur );
                     local endppqpos = reaper.MIDI_GetPPQPosFromProjTime(Take, PosMouseCur+LENGTH_NOTE);
                      -----
                      remNote(Take,startppqpos,DEL_NOTE_RAD,REMOVE_PITCH_N)
                      -----
                      reaper.MIDI_InsertNote
                      (Take,SELECTED,MUTED,startppqpos,endppqpos,CHAN-1,PITCH,VELOCITY,false)
                end;
            end;
        end;
    end;
    ---------------------------------------------------------------
 
  • Like
Реакции: diggidon

fractala

Well-Known Member
1 Авг 2012
2.416
998
113
Ребята помогите решить или подскажите способы решения такой задачи в рипере:
1) есть миди клавиатура на которой есть к примеру 4 кнопки (на каждую кнопку прописаны свои миди CC значения, которые встроены в прошивку мидиконтроллера и изменить их нельзя никак / клавиатура novation launchkey mini 2)
2) есть железные синтезаторы, банки звуков и программы которых меняются по стандартному протоколу GM
тоесть для смены банка и программы достаточно менять эти значения (Program и LSB)
164126

-- > Мне нужно чтобы с помощью 2-ух кнопок на мидиконтроллере я мог переключать программы PROGRAM с шагом (+ или- 1) на железном синтезаторе
-->Мне нужно с помощью оставшихся еще 2-ух кнопок на мидиконтроллере я мог переключать банки LSB с шагом (+ или- 1) на железном синтезаторе

может уже есть подобный js плагин или скрипт?

Как я это вижу: окно плагина/скрипта в котором есть
--> окошко input 1 (сюда я ввожу СС своей 1-ой кнопки на мидиконтроллере, которая будет листать LSB банки с шагом +1 вперед от 0 до 127)
--> окошко input 2(сюда я ввожу СС своей 2-ой кнопки на мидиконтроллере, которая будет листать LSB банки с шагом -1 назад)

--> окошко input 3 (сюда я ввожу СС своей 3-ой кнопки на мидиконтроллере, которая будет листать PROGRAM с шагом +1 вперед от 0 до 127)
--> окошко input 4(сюда я ввожу СС своей 4-ой кнопки на мидиконтроллере, которая будет листать PROGRAM с шагом -1 назад)

Получается что этот скрипт:при нажатии кнопки на мидиконтроллере преобразует миди CC сообщение в сообщение Program c шагом в + или -1 к примеру

PS: Хочется задействовать именно кнопки миди контроллера, понимаю что можно сделать через регуляторы на миди клавиатуре и JS плагин midi CC mapper (тоесть переназначить мои вшитые midi СС) -но крутилки нужны для другого
 

fractala

Well-Known Member
1 Авг 2012
2.416
998
113
Ребята, плиз, есть какие идеи как это реализовать ?( в предыдущем посте)
 

PianoIst

Well-Known Member
19 Май 2010
4.090
4.141
113
29
Kirchberg, kreis Zwickau
soundcloud.com
@fractala, не сложно :)
Но мне, например, надо часа 4 угрохать, пока их нет.
Там главное — менять СС после щелчка программы, чтобы можно было листать и в плюс и в минус.
 

fractala

Well-Known Member
1 Авг 2012
2.416
998
113
@PianoIst, не совсем
--> нужно чтобы при поступлении на вход JS скрипта от СС109 сообщения со значением 127 (так как кнопка мидиконтроллера имеет значения в ненажатом положении 0/в нажатом 127) - скрипт делал +1 значения Program
Другой СС будет делать -1 значения Program, и еще 2 midi CC будут менять BanksLSB
Главное чтобы эти входящие midi CC я мог в выпадающих окошках забивать свои

надеюсь что внятно объяснил задачу ;)

ps: если сделаете - прям огромное спасибо - уже устал смену banks/program лезть в меню и тыкать на железках, которые бог весть где разбросаны , хотелось бы с 4-ех кнопок на миди клавиатуре все это делать - она постоянно под руками

pss: этот скрипт будет спасением для тех, у кого миди клавиатура не поддерживает программно менять параметры banks/prorgram.
 
Последнее редактирование:

fractala

Well-Known Member
1 Авг 2012
2.416
998
113
@@Michael, готовые скрипты есть? или писать все равно под эту задачу?
Ps: встроенные js с околоблизкими названиями типа midi cc convert перерыл, не нашел
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Есть, в ReaPack пакет Send short NoteOn MIDI message to virtual keyboard (скрипты вида Send NoteOn to VK, pitch 51 D#3.lua), модифицировать под отправку напрямую в девайс (доступно начиная с v5.33), ну и соответствующие сообщения отправлять.
 
  • Like
Реакции: fractala

PianoIst

Well-Known Member
19 Май 2010
4.090
4.141
113
29
Kirchberg, kreis Zwickau
soundcloud.com
@fractala, чисто теоретически — должно работать.
(create new JS) -> Ctrl-V
JavaScript:
slider1:109<1,127,1>Bank+ CC
slider2:110<1,127,1>Bank- CC
slider3:111<1,127,1>Program+ CC
slider4:112<1,127,1>Program- CC

slider5:bank_val=0<0,127,1>-Hidden parameter
slider6:prog_val=0<0,127,1>-Hidden parameter

@block
while (midirecv(offset, msg1, msg2, msg3)) (
    msg1 >= $xb0 && msg1<$xc0?(
        msg2 == slider1 ? (
            bank_val += 1;
            midisend(offset, msg1, 0, bank_val)
        );
        msg2 == slider2 ? (
            bank_val -= 1;
            midisend(offset, msg1, 0, bank_val)
        );
        msg2 == slider3 ? (
            prog_val += 1;
            midisend(offset, msg1, 32, prog_val);
            midisend(offset, msg1+16, prog_val, prog_val);
        );
        msg2 == slider4 ? (
            prog_val -= 1;
            midisend(offset, msg1, 32, prog_val);
            midisend(offset, msg1+16, prog_val, prog_val);
        );
    ) : midisend(offset, msg1, msg2, msg3);
);
 
Последнее редактирование:
  • Like
Реакции: fractala

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