-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRegionsToItems_SingleTrack.lua
68 lines (54 loc) · 2.13 KB
/
RegionsToItems_SingleTrack.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
-- Create a table to store the region information
local regions = {}
-- Get the total number of regions
local numTotal,numMarkers,numRegions = reaper.CountProjectMarkers(0)
reaper.ShowConsoleMsg("Total markers & regions: " .. numTotal .. "\n", "Info", 0)
reaper.ShowConsoleMsg("Total regions: " .. numRegions .. "\n", "Info", 0)
reaper.ShowConsoleMsg("Total markers: " .. numMarkers .. "\n", "Info", 0)
if numRegions == 0 then
reaper.ShowMessageBox("No regions found in the project.", "Info", 0)
return
end
reaper.ClearConsole()
for i = 0, numTotal - 1 do
local _, isRegion, regionStart, regionEnd, regionName, regionIdx, regionColor = reaper.EnumProjectMarkers3(0, i)
if regionName == "" then
regionName = "Unnamed Region"
end
if isRegion then
table.insert(regions, {name = regionName, start = regionStart, endd = regionEnd, color = regionColor})
end
end
-- Sort the regions by name and start time
table.sort(regions, function(a, b)
return a.name < b.name or (a.name == b.name and a.start < b.start)
end)
reaper.PreventUIRefresh(1)
reaper.Undo_BeginBlock()
-- Write the regions to new tracks as items
local prevRegionName = ""
local trackCpt = 0
local itemCpt = 0
local newTrack, newItem
reaper.InsertTrackAtIndex(trackCpt, false)
newTrack = reaper.GetTrack(0, trackCpt)
reaper.GetSetMediaTrackInfo_String(newTrack, "P_NAME", "REGIONS", true)
for _, region in ipairs(regions) do
-- Create track for each distinct region name
if region.name ~= prevRegionName then
prevRegionName = region.name
itemCpt = 0
end
-- Create item for each region
local newItem = reaper.AddMediaItemToTrack(newTrack)
local newTake = reaper.AddTakeToMediaItem(newItem)
reaper.GetSetMediaItemTakeInfo_String(newTake, "P_NAME", region.name, true)
reaper.SetMediaItemPosition(newItem, region.start, false)
reaper.SetMediaItemLength(newItem, region.endd - region.start, false)
reaper.SetMediaItemInfo_Value(newItem, "I_CUSTOMCOLOR", region.color)
reaper.SetMediaItemInfo_Value(newItem, "I_CURTAKE", 0)
itemCpt = itemCpt + 1
end
reaper.Undo_EndBlock("Regions to items", -1)
reaper.UpdateArrange()
reaper.PreventUIRefresh(-1)