@EUGEN27771, в 5-ке в этом окне есть чекбокс который сохраняет настройки, нажав на него окно больше не вылазит
//EEL
items = CountMediaItems(0);
i = 0;
loop(items,
GetSelectedMediaItem(0, i);
Main_OnCommand(40405, 1);
i += 1;
);
Подтверждаю, рендерит в stem...у меня на этот экшн и на несколько других (абсолютно не связанных между собой, как из скрипта, так и из окна экшнов) происходит рендер дороги, название изменяется на " - stem".
Идёт от версии к версии. Может кто подтвердить такое поведение?
Не совсем понял, как это сделать.ставь X-Raym_Prevent UI Refresh в начале кастома и X-Raym_Prevent UI Refresh Restore в конце
Не совсем понял, как это сделать.
Нормально тут всё со ссылками)))не помню, как тут насчёт ссылок в плане модерации, так что если надо - уберу
Ну понятно, точно такой же Command ID (40405) имеет экшн из Main секции Render tracks to stereo post-fader tracks (and mute original)... Печаль.происходит рендер дороги, название изменяется на " - stem".
Да, точно, это я тупанул.точно такой же Command ID (40405) имеет экшн из Main секции
Main_OnCommand(40153, 0); // врубить мидиэдитор
MIDIEditor_LastFocused_OnCommand(40003, 0); // выделить там всё
MIDIEditor_LastFocused_OnCommand(40405, 0); // порезать это дело
MIDIEditor_LastFocused_OnCommand(2, 0); // закрыть от греха подальше
GetToggleCommandState(NamedCommandLookup("_S&M_EXCL_TGL1"))?
(
tr = GetTrack(0, 2); // выбираем 3-ий трэк
TrackFX_SetEnabled(tr, 1, 1); // FX02 - Unbypass
TrackFX_SetEnabled(tr, 2, 0); // FX03 - Bypass
TrackFX_SetEnabled(tr, 3, 0);
TrackFX_SetEnabled(tr, 4, 0);
TrackFX_SetEnabled(tr, 5, 0);
TrackFX_SetEnabled(tr, 6, 0);
);
Каких чекбоксов?состояние чекбоксов при сохранении темплэйта трека, сделать их включенными по умолчанию?
Сделал тестовый проект с тремя инструментами и синхронной сменой (запуском Цикл Экшинов) - всё работает как часы и я не пойму почему --- видимо в Рипере всё-же сделан буфер на выполнение любых действий и последовательное их выполнение... В общем час гонял - работает и всё тут.Но!!!! Решение не надёжное, так как может вполне случиться так, что несколько музыкантов нажмут смену пресета одновременно и ......, ну тут как повезёт, но может быть и беда.
Премного благодаренСмотрите видео Andy Vax-а, там есть как установить правильно питон. На русском ни черта нет, на сколько мне известно.
-- ------------------------------------------
-- BPM Converter v.1.05
-- Author : VIENTE
-- http://forum.cockos.com/member.php?u=42674
-- Forum: Viente's BPM Converter
-- http://forum.cockos.com/showthread.php?t=110780
-- Mod 1.06 by X-Raym
-- 2015-05-13
-- http://extremraym.com
-- # Now in Lua
-- + Works on multiple selected items (BPM detection based on first selected item)
-- # user input "cancel" corrected
-- ------------------------------------------
------ functionine variables and functions ----------------------------------------------------------------------------------------------------------------------------------------
numItems = reaper.CountSelectedMediaItems(0)
selItem = reaper.GetSelectedMediaItem(0, 0)
function msg(m) -- functionine function: console output alias for debugging
reaper.ShowConsoleMsg(tostring(m) .. '\n')
end
--msg("")
function getMusicalLenght(selItem)
-- Get selected item's start and end
itemStart = reaper.GetMediaItemInfo_Value(selItem, "D_POSITION")
itemEnd = itemStart + reaper.GetMediaItemInfo_Value(selItem, "D_LENGTH")
-- Check if there are any tempo changes during item's length (NextChangeTime will output -1 if there are no more tempo markers after the requested position)
if reaper.TimeMap2_GetNextChangeTime(0, itemStart) > itemEnd or reaper.TimeMap2_GetNextChangeTime(0, itemStart) == -1 then
-- There are no tempo markers over selected item so we continue
timeSig, timesig_denomOut, startBPM = reaper.TimeMap_GetTimeSigAtTime(0, itemStart)
-- This is needed because then we don't have to worry about linear/square difference of tempo points
timeSig, timesig_denomOut, endBPM = reaper.TimeMap_GetTimeSigAtTime(0, itemEnd) -- we don't use TimeMap_GetDividedBpmAtTime because note in the API says: get the effective BPM at the time (seconds) position (i.e. 2x in /8 signatures)
-- This is the formula
musicalLenght = ((startBPM + endBPM) * timesig_denomOut * (itemEnd - itemStart)) / (480 * timeSig)
else
-- if there are existing tempo markers during item's length, you have to get them and calculate everything separately
reaper.Main_OnCommand(65535, 0)
end
end
function getTempo()
timeSel = reaper.GetMediaItemInfo_Value(selItem, "D_LENGTH")
rawTempo = 4*60/timeSel
tempo = math.floor(rawTempo+0.5, 2)
if musicalLenght < 1 or musicalLenght == 1 then
bpm = tempo
elseif musicalLenght > 1 and musicalLenght < 3 then
bpm = tempo * 2
elseif musicalLenght > 3 and musicalLenght < 5 then
bpm = tempo * 4
elseif musicalLenght > 5 and musicalLenght < 7 then
bpm = tempo * 6
elseif musicalLenght > 7 and musicalLenght < 9 then
bpm = tempo * 8
elseif musicalLenght > 9 and musicalLenght < 11 then
bpm = tempo * 10
elseif musicalLenght > 11 and musicalLenght < 13 then
bpm = tempo * 12
elseif musicalLenght > 13 and musicalLenght < 15 then
bpm = tempo * 14
elseif musicalLenght > 15 and musicalLenght < 17 then
bpm = tempo * 16
else
bpm = 1
end
end --reaper.ShowConsoleMsg(str(bpm) + "\n")
function setTempo()
master_tempo = math.floor(reaper.Master_GetTempo())
functionaults = tostring(bpm)..","..tostring(master_tempo)
retval, retvals_csv = reaper.GetUserInputs("BPM Converter", 2, "Original Tempo (BPM),Target Tempo (BPM)", functionaults)
if retval == true then
-- PARSE THE STRING
answer1, answer2 = retvals_csv:match("([^,]+),([^,]+)")
answer1 = tonumber(answer1)
answer2 = tonumber(answer2)
if answer1 > 20 and answer1 < 299 and answer2 > 20 and answer2 < 299 then
if answer2 > answer1 then
bpm_rate = (answer2 / answer1) -1
for i = 0, numItems - 1 do
item = reaper.GetSelectedMediaItem(0, i)
take = reaper.GetActiveTake(item)
currentrate = reaper.GetMediaItemTakeInfo_Value(take, "D_PLAYRATE")
reaper.SetMediaItemTakeInfo_Value(take, "D_PLAYRATE", currentrate + bpm_rate)
end
elseif answer2 < answer1 then
bpm_rate = (answer2 / answer1)
bpm_calc = (1 - bpm_rate)
for i = 0, numItems - 1 do
item = reaper.GetSelectedMediaItem(0, i)
take = reaper.GetActiveTake(item)
currentrate = reaper.GetMediaItemTakeInfo_Value(take, "D_PLAYRATE")
reaper.SetMediaItemTakeInfo_Value(take, "D_PLAYRATE", currentrate - bpm_calc)
end
end
reaper.Main_OnCommand(40612,0) -- Fix item length
else
reaper.ShowMessageBox("Incorrect tempo!", "Error", 0) -- 0=OK,2=OKCANCEL,2=ABORTRETRYIGNORE,3=YESNOCANCEL,4=YESNO,5=RETRYCANCEL : ret 1=OK,2=CANCEL,3=ABORT,4=RETRY,5=IGNORE,6=YES,7=NO
end
end
end
------ Calling actions & functions ----------------------------------------------------------------------------------------------------------------------------------------------
reaper.Undo_BeginBlock()
if numItems >= 1 then
getMusicalLenght(selItem)
getTempo()
setTempo()
reaper.UpdateArrange()
else
reaper.ShowMessageBox("Please select one item...", "Error", 0) -- 0=OK,2=OKCANCEL,2=ABORTRETRYIGNORE,3=YESNOCANCEL,4=YESNO,5=RETRYCANCEL : ret 1=OK,2=CANCEL,3=ABORT,4=RETRY,5=IGNORE,6=YES,7=NO
end
reaper.Undo_EndBlock("Convert BPM of selected item",-1)
cпасибо, там как раз и видео по установке и использованию скриптов есть, то что нужно новичкам Рипера@MikaNiko, python устарел к настоящему моменту. Этот скрипт X-Raym недавно перевёл в lua (работает в 5pre без установки дополнительных библиотек):
http://extremraym.com/en/my-reaper-scripts/ (Item Properties/Viente_X-Raym_BPM Converter.lua)
// Glue takes (in place) eel script by Diggidon
Undo_BeginBlock();
PreventUIRefresh(1);
Main_OnCommand(NamedCommandLookup("_SWS_SAVETIME1"), 0);
Main_OnCommand(40290, 0);
Main_OnCommand(40224, 0);
Main_OnCommand(41588, 0);
Main_OnCommand(NamedCommandLookup("_SWS_AWTRIMFILL"), 0);
Main_OnCommand(NamedCommandLookup("_SWS_SELTRKWITEM"), 0);
Main_OnCommand(NamedCommandLookup("_SWS_MAKEFOLDER"), 0);
Main_OnCommand(40438, 0);
Main_OnCommand(NamedCommandLookup("_SWS_SELCHILDREN"), 0);
Main_OnCommand(40005, 0);
Main_OnCommand(NamedCommandLookup("_SWS_SELTRKWITEM"), 0);
Main_OnCommand(40418, 0);
Main_OnCommand(40718, 0);
Main_OnCommand(40699, 0);
Main_OnCommand(40419, 0);
Main_OnCommand(41384, 0);
Main_OnCommand(NamedCommandLookup("_XENAKIOS_SELPREVTRACK"), 0);
Main_OnCommand(NamedCommandLookup("_SWS_AWPASTE"), 0);
Main_OnCommand(NamedCommandLookup("_XENAKIOS_SELNEXTTRACK"), 0);
Main_OnCommand(40005, 0);
Main_OnCommand(40635, 0);
Main_OnCommand(NamedCommandLookup("_SWS_RESTTIME1"), 0);
PreventUIRefresh(-1);
Undo_EndBlock("Glue Takes (in place)", 0);
А я и не спорю, и на роль продвинутого программера с элегантными мыслями ни разу не претендую (по крайней мере пока). Вот когда вырасту - тогда и посмотрим))Мне кажется, скрипт всё-таки призван делать нечто более продуманное, нежели prevent united fresh + кастом экшн. Должна чувствоваться гибкость и элегантность мысли (во ляпнул).
А почему? Почему подобное не нужно описывать в скрипте? Другой вопрос, что если бы я владел eel, я бы наверняка сделал это более элегантно и менее громоздко.Просто подобный скрипт по сути в скрипте то и не совсем нужно описывать
Пробовал, всё равно чепуха получается, когда экшн огромный. Я поэтому и решил увековечить свою нетленку в скрипте, потому что оно так надёжнее работает.можно, например, его в Цикл Экшине сделать - не пробовал?
Я вообще пока что понимаю только Main_OnCommand и Main_OnCommand(NamedCommandLookup), ну и PreventUI с Undo блоком. На всё остальное - как баран на новые ворота. Но учитывая, что я в первую очередь всё-таки музыкант и звукорежиссёр, то не особо парюсь.А с мануалами по EEL - беда
Насколько мне известно, только перебор + GetSetMediaTrackInfo_String.обратится к треку по имени