-
Notifications
You must be signed in to change notification settings - Fork 174
Expand file tree
/
Copy pathjunishiscripts_Create merged regions from time selection items.lua
More file actions
112 lines (96 loc) · 3.19 KB
/
junishiscripts_Create merged regions from time selection items.lua
File metadata and controls
112 lines (96 loc) · 3.19 KB
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
-- @description Create merged regions from time selection items
-- @author Junishi Scripts
-- @version 1.0.0
-- @link X https://x.com/1496jun
-- @about
-- - Purpose
-- Creates merged regions from media items within the current time selection in REAPER.
--
-- - Key Features
-- Time Selection Based: Only items inside the current time selection are considered.
-- Strict Item Range: Ignores fades—uses pure item start/end points.
-- Auto Expansion: Regions expand to include overlapping items.
-- Region Merging: Overlapping areas are merged into one.
--
--
-- - Usage
-- Set a time selection.
-- Run the script.
-- Regions will be created and labeled based on overlapping items.
reaper.Undo_BeginBlock()
-- Time Selection 範囲取得
local time_start, time_end = reaper.GetSet_LoopTimeRange(false, false, 0, 0, false)
if time_end <= time_start then
reaper.MB("Please set a valid time selection.", "Error", 0)
return
end
-- フェードを考慮せず、純粋なアイテム範囲のみを対象にする(安定性重視)
local function get_strict_item_range(item)
local pos = reaper.GetMediaItemInfo_Value(item, "D_POSITION")
local len = reaper.GetMediaItemInfo_Value(item, "D_LENGTH")
return pos, pos + len
end
-- 指定された範囲に含まれるアイテムを使って拡張
local function expand_region(start_pos, end_pos)
local changed = true
local iteration = 0
while changed and iteration < 10 do
changed = false
local new_start = start_pos
local new_end = end_pos
for t = 0, reaper.CountTracks(0) - 1 do
local track = reaper.GetTrack(0, t)
for i = 0, reaper.CountTrackMediaItems(track) - 1 do
local item = reaper.GetTrackMediaItem(track, i)
local istart, iend = get_strict_item_range(item)
if iend > start_pos and istart < end_pos then
if istart < new_start then
new_start = istart
changed = true
end
if iend > new_end then
new_end = iend
changed = true
end
end
end
end
start_pos = new_start
end_pos = new_end
iteration = iteration + 1
end
return start_pos, end_pos
end
-- Region候補収集
local raw_regions = {}
for t = 0, reaper.CountTracks(0) - 1 do
local track = reaper.GetTrack(0, t)
for i = 0, reaper.CountTrackMediaItems(track) - 1 do
local item = reaper.GetTrackMediaItem(track, i)
local istart, iend = get_strict_item_range(item)
if iend > time_start and istart < time_end then
local r_start, r_end = expand_region(istart, iend)
table.insert(raw_regions, {start = r_start, endp = r_end})
end
end
end
-- Region統合
table.sort(raw_regions, function(a, b) return a.start < b.start end)
local merged = {}
for _, r in ipairs(raw_regions) do
if #merged == 0 then
table.insert(merged, r)
else
local last = merged[#merged]
if r.start <= last.endp then
last.endp = math.max(last.endp, r.endp)
else
table.insert(merged, r)
end
end
end
-- Region作成
for i, r in ipairs(merged) do
reaper.AddProjectMarker2(0, true, r.start, r.endp, "TSRegion_" .. i, -1, 0)
end
reaper.Undo_EndBlock("Create stable merged regions from time selection", -1)