Code:
-- copy children items to all identically named parent items
-- author: embass
-- v0.1
local mouse_x, mouse_y = reaper.GetMousePosition()
local media_item_count = reaper.CountSelectedMediaItems(0);
if media_item_count ~= 1 then
reaper.TrackCtl_SetToolTip("Select 1 media item", mouse_x + 15, mouse_y, true)
return -- terminate script
end
local media_item = reaper.GetSelectedMediaItem(0, 0); if media_item == nil then return end -- terminate script
local media_item_len = reaper.GetMediaItemInfo_Value(media_item, "D_LENGTH"); if media_item_len == 0 then return end -- terminate script
local media_item_start = reaper.GetMediaItemInfo_Value(media_item, "D_POSITION")
local media_item_end = media_item_start + media_item_len
local track = reaper.GetMediaItem_Track(media_item); if track == nil then return end -- terminate script
if reaper.GetMediaTrackInfo_Value(track, "I_FOLDERDEPTH") ~= 1 then
reaper.TrackCtl_SetToolTip("Select item on parent track", mouse_x + 15, mouse_y, true)
return -- terminate script
end
local track_count = reaper.CountTracks(0)
if track_count == reaper.GetMediaTrackInfo_Value(track, "IP_TRACKNUMBER") then return end -- terminate script, item on last track
local take = reaper.GetActiveTake(media_item); if take == nil then return end -- terminate script
local take_name = reaper.GetTakeName(take); if take_name == nil then return end -- terminate script
local media_items = {} -- media items with the same name
for i = 0, reaper.CountTrackMediaItems(track) - 1 do
local media_item = reaper.GetTrackMediaItem(track, i)
if reaper.GetMediaItemInfo_Value(media_item, "D_LENGTH") > 0 then
local take = reaper.GetActiveTake(media_item)
if take ~= nil then
if take_name == reaper.GetTakeName(take) then
table.insert(media_items, media_item)
end
end
end
end
if #media_items < 2 then return end -- terminate script
function get_children_tracks(parent_track) --> children tracks
local children_tracks = {}
local track_count = reaper.CountTracks(0)
local parent_track_depth = reaper.GetTrackDepth(parent_track)
local track_index = reaper.GetMediaTrackInfo_Value(parent_track, "IP_TRACKNUMBER") -- next track index
for i = track_index, track_count - 1 do
local track = reaper.GetTrack(0, i)
local track_depth = reaper.GetTrackDepth(track)
if track_depth > parent_track_depth then table.insert(children_tracks, track)
else break -- exit loop
end
end
return children_tracks
end
local children_tracks = get_children_tracks(track); if #children_tracks == 0 then return end -- terminate script
local track1 = children_tracks[1] -- first child
local edit_cursor_pos = reaper.GetCursorPosition() -- save
local trim_state = reaper.GetToggleCommandState(42421) -- Options: Always trim content behind razor edits
reaper.PreventUIRefresh(1)
reaper.Undo_BeginBlock()
reaper.Main_OnCommand(40309, 0) -- Set ripple editing off
if trim_state == 0 then reaper.Main_OnCommand(42421, 0); restore_trim = true end -- set trim content behind area
local hidden_tracks = {} -- save
for i, track in ipairs(children_tracks) do
if not reaper.IsTrackVisible(track, false) then
hidden_tracks[track] = true
reaper.SetMediaTrackInfo_Value(track, "B_SHOWINTCP", 1) -- make visible
end
end
reaper.Main_OnCommand(42406, 0) -- Razor edit: Clear all areas
reaper.SelectAllMediaItems(0, false) -- unselect all items
local str_track_razor_edits = string.format([[%s %s '']], media_item_start, media_item_end)
for i, track in ipairs(children_tracks) do
reaper.GetSetMediaTrackInfo_String(track, "P_RAZOREDITS", str_track_razor_edits, true) -- set
end
reaper.Main_OnCommand(40060, 0) -- Item: Copy selected area of items
reaper.SetOnlyTrackSelected(track1) -- set last touched track
for i, item in ipairs(media_items) do
if item ~= media_item then
local item_start = reaper.GetMediaItemInfo_Value(item, "D_POSITION")
reaper.SetEditCurPos(item_start, false, false)
reaper.Main_OnCommand(42398, 0) --Item: Paste items/tracks
end
end
reaper.Main_OnCommand(42406, 0) -- Razor edit: Clear all areas
reaper.SelectAllMediaItems(0, false) -- unselect all items
reaper.SetEditCurPos(edit_cursor_pos, false, false) -- restore
for track in pairs(hidden_tracks) do
reaper.SetMediaTrackInfo_Value(track, "B_SHOWINTCP", 0) -- hide
end
reaper.SetOnlyTrackSelected(track) -- parent track
reaper.SetMediaItemSelected(media_item, true) -- restore media item selection
if restore_trim then reaper.Main_OnCommand(42421, 0) end -- restore
reaper.Undo_EndBlock("Copy items", -1)
reaper.PreventUIRefresh(-1)
reaper.UpdateArrange()