diff --git a/4PointCutting/4Pcut_execute.lua b/4PointCutting/4Pcut_execute.lua new file mode 100644 index 0000000..53a1661 --- /dev/null +++ b/4PointCutting/4Pcut_execute.lua @@ -0,0 +1,144 @@ +local stored_cursorPos = 0 +local stored_timeSelStart = 0 +local stored_timeSelEnd = 0 +local stored_sel_tracks = {} +local stored_sel_items = {} +local mark_srcin_pos = -1 +local mark_srcin_id = -1 +local mark_srcout_pos = -1 +local mark_srcout_id = -1 +local mark_dstin_pos = -1 +local mark_dstin_id = -1 +local mark_dstout_pos = -1 +local mark_dstout_id = -1 + +-- Send a message to the console +function msg(m) + reaper.ShowConsoleMsg(tostring(m) .. "\n") +end + +function select_src_tracks() + local tracks_str = '' + local tracks = {} + local retval + + retval, tracks_str = reaper.GetProjExtState(0, '4PointCut', 'src_tracks') + if retval > 0 then -- variable exists in rpp + -- separate GUIDs and populate track table + for str in string.gmatch(tracks_str, "([^"..'{'.."]+)") do + table.insert(tracks, reaper.BR_GetMediaTrackByGUID(0, '{' .. str)) + end + -- select tracks + --reaper.Main_OnCommand(40297, 0) -- Unselect all tracks + for _, track in ipairs(tracks) do + reaper.SetTrackSelected(track, true) + end + else + -- default to all tracks + for i = 0, reaper.CountTracks(0)-1 do + reaper.SetTrackSelected(reaper.GetTrack(0, i), true) + end + end +end + +function select_dst_track_only() + local track_str = '' + local retval + retval, track_str = reaper.GetProjExtState(0, '4PointCut', 'dst_track') + if retval > 0 then -- variable exists in rpp + reaper.SetOnlyTrackSelected(reaper.BR_GetMediaTrackByGUID(0, track_str)) + else --default to first track + reaper.SetOnlyTrackSelected(reaper.GetTrack(0, 0)) + end +end + +-- START HERE vvvvvvvvvvvvvvvvvvvvvvvvvv +-- Store cursor position, time selection, selected tracks, selected items +stored_cursorPos = reaper.GetCursorPosition() +stored_timeSelStart, stored_timeSelEnd = reaper.GetSet_LoopTimeRange(false, true, 0, 1, false) +for i = 0, reaper.CountSelectedTracks(0)-1 do + stored_sel_tracks[i+1] = reaper.GetSelectedTrack(0, i) +end +for i = 0, reaper.CountSelectedMediaItems(0)-1 do + stored_sel_items[i+1] = reaper.GetSelectedMediaItem(0, i) +end +if reaper.CountSelectedMediaItems(0) > 0 then + reaper.Main_OnCommand(40289, 0) -- Unselect all items +end +if reaper.CountSelectedTracks(0) > 0then + reaper.Main_OnCommand(40297, 0) -- Unselect all tracks +end +--reaper.Main_OnCommand(40769, 0) +select_src_tracks() -- select tracks specified in rpp (by using 4Pcut_set_src-tracks.lua) + +-- run through all markers and get position of the 4 points +local nof_markers = 0 +_, nof_markers, _ = reaper.CountProjectMarkers(0) +for i = 0, nof_markers - 1 do + local name = '' + local pos = 0 + local id = 0 + local isregion = false + _, isregion, pos, _, name, id = reaper.EnumProjectMarkers(i) + if not isregion then + if name == 'SRC-IN_4Pcut' then + mark_srcin_pos = pos + mark_srcin_id = id + elseif name == 'SRC-OUT_4Pcut' then + mark_srcout_pos = pos + mark_srcout_id = id + elseif name == 'DST-IN_4Pcut' then + mark_dstin_pos = pos + mark_dstin_id = id + elseif name == 'DST-OUT_4Pcut' then + mark_dstout_pos = pos + mark_dstout_id = id + end + end +end + +-- error messages +if mark_srcin_pos < 0 then + msg('Please set Source-In Marker first!') + return +end +if mark_srcout_pos < 0 then + msg('Please set Source-Out Marker first!') +end +if mark_dstin_pos < 0 then + msg('Please set Destination-In Marker first!') + return +end + +-- Do stuff before actual edits... +reaper.Undo_BeginBlock() + + +-- Set Source Time selection and Copy Items +reaper.GetSet_LoopTimeRange(true, false, mark_srcin_pos, mark_srcout_pos, false) +reaper.Main_OnCommand(40718, 0) -- select items on selected tracks under time selection +reaper.Main_OnCommand(40060, 0) -- copy selected items under time selection 41383 +-- reaper.Main_OnCommand( reaper.NamedCommandLookup('_SWS_SMARTCOPY'), 0 ) + + +-- Move edit cursor to Dest-In and Paste +--reaper.GoToMarker(0, mark_dstin_id, false) +-- reaper.GetSet_LoopTimeRange(true, false, mark_dstin_pos, mark_dstout_pos, false) +reaper.MoveEditCursor(mark_dstin_pos - reaper.GetCursorPosition(), false) +select_dst_track_only() +reaper.Main_OnCommand(40058, 0) -- paste item +reaper.SetProjectMarker(mark_dstin_id, false, mark_dstin_pos + (mark_srcout_pos - mark_srcin_pos), 0, 'DST-IN_4Pcut') + +-- Restore cursor position, time selection, selected tracks, selected items +reaper.MoveEditCursor(stored_cursorPos - reaper.GetCursorPosition(), false) +reaper.Main_OnCommand(40297, 0) -- Unselect all tracks +for _, track in ipairs(stored_sel_tracks) do + reaper.SetTrackSelected(track, true) +end + reaper.Main_OnCommand(40289, 0) -- Unselect all items +for _, item in ipairs(stored_sel_items) do + reaper.SetMediaItemSelected(item, true) +end +reaper.GetSet_LoopTimeRange(true, true, stored_timeSelStart, stored_timeSelEnd, false) + +reaper.Undo_EndBlock('4 point cut: Execute', 4) -- 4 is a flag for actions concerning items \ No newline at end of file diff --git a/4PointCutting/4Pcut_reset_markers.lua b/4PointCutting/4Pcut_reset_markers.lua new file mode 100644 index 0000000..80a7387 --- /dev/null +++ b/4PointCutting/4Pcut_reset_markers.lua @@ -0,0 +1,22 @@ +local nof_markers = 0 +local id = -1 +local name = '' +local isregion = false +local ids = {} + +-- check if markers exist +_, nof_markers, _ = reaper.CountProjectMarkers(0) +for i = 0, nof_markers - 1 do + _, isregion, _, _, name, id = reaper.EnumProjectMarkers(i) + if not isregion and + (name == 'SRC-IN_4Pcut' or + name == 'SRC-OUT_4Pcut' or + name == 'DST-IN_4Pcut' or + name == 'DST-OUT_4Pcut') then + table.insert(ids, id) + end +end +-- delete markers +for _, id in ipairs(ids) do + reaper.DeleteProjectMarker(0, id, false) +end \ No newline at end of file diff --git a/4PointCutting/4Pcut_reset_src-dest-tracks.lua b/4PointCutting/4Pcut_reset_src-dest-tracks.lua new file mode 100644 index 0000000..8cbbb97 --- /dev/null +++ b/4PointCutting/4Pcut_reset_src-dest-tracks.lua @@ -0,0 +1,2 @@ +reaper.SetProjExtState(0, '4PointCut', 'dst_track', '') +reaper.SetProjExtState(0, '4PointCut', 'src_tracks', '') \ No newline at end of file diff --git a/4PointCutting/4Pcut_select_dst-track.lua b/4PointCutting/4Pcut_select_dst-track.lua new file mode 100644 index 0000000..d9705f7 --- /dev/null +++ b/4PointCutting/4Pcut_select_dst-track.lua @@ -0,0 +1,13 @@ +-- Send a message to the console +function msg(m) + reaper.ShowConsoleMsg(tostring(m) .. "\n") +end + +-- START HERE vvvvvvvvvvvvvvvvv +local track_str = '' +local retval + +retval, track_str = reaper.GetProjExtState(0, '4PointCut', 'dst_track') +if retval > 0 then -- variable exists in rpp + reaper.SetOnlyTrackSelected(reaper.BR_GetMediaTrackByGUID(0, track_str)) +end \ No newline at end of file diff --git a/4PointCutting/4Pcut_select_src-tracks.lua b/4PointCutting/4Pcut_select_src-tracks.lua new file mode 100644 index 0000000..20f3a8a --- /dev/null +++ b/4PointCutting/4Pcut_select_src-tracks.lua @@ -0,0 +1,22 @@ +-- Send a message to the console +function msg(m) + reaper.ShowConsoleMsg(tostring(m) .. "\n") +end + +-- START HERE vvvvvvvvvvvvvvvvv +local tracks_str = '' +local tracks = {} +local retval + +retval, tracks_str = reaper.GetProjExtState(0, '4PointCut', 'src_tracks') +if retval > 0 then -- variable exists in rpp + -- separate GUIDs and populate track table + for str in string.gmatch(tracks_str, "([^"..'{'.."]+)") do + table.insert(tracks, reaper.BR_GetMediaTrackByGUID(0, '{' .. str)) + end + -- select tracks + reaper.Main_OnCommand(40297, 0) -- Unselect all tracks + for _, track in ipairs(tracks) do + reaper.SetTrackSelected(track, true) + end +end \ No newline at end of file diff --git a/4PointCutting/4Pcut_set_DST-IN.lua b/4PointCutting/4Pcut_set_DST-IN.lua new file mode 100644 index 0000000..fc08dc6 --- /dev/null +++ b/4PointCutting/4Pcut_set_DST-IN.lua @@ -0,0 +1,25 @@ +local nof_markers = 0 +local id = -1 + +-- check if marker already exists +_, nof_markers, _ = reaper.CountProjectMarkers(0) +for i = 0, nof_markers - 1 do + local name_tmp = '' + local isregion_tmp = false + local id_tmp = 0 + _, isregion_tmp, _, _, name_tmp, id_tmp = reaper.EnumProjectMarkers(i) + if not isregion then + if name_tmp == 'DST-IN_4Pcut' then + id = id_tmp + break + end + end +end + +if id >= 0 then + -- edit existing marker + reaper.SetProjectMarker(id, false, reaper.GetCursorPosition(), 0, 'DST-IN_4Pcut') +else + -- create new marker + reaper.AddProjectMarker2(0, false, reaper.GetCursorPosition(), 0, 'DST-IN_4Pcut', -1, reaper.ColorToNative(0, 255, 0)|0x1000000) +end \ No newline at end of file diff --git a/4PointCutting/4Pcut_set_DST-OUT.lua b/4PointCutting/4Pcut_set_DST-OUT.lua new file mode 100644 index 0000000..202aff2 --- /dev/null +++ b/4PointCutting/4Pcut_set_DST-OUT.lua @@ -0,0 +1,25 @@ +local nof_markers = 0 +local id = -1 + +-- check if marker already exists +_, nof_markers, _ = reaper.CountProjectMarkers(0) +for i = 0, nof_markers - 1 do + local name_tmp = '' + local isregion_tmp = false + local id_tmp = 0 + _, isregion_tmp, _, _, name_tmp, id_tmp = reaper.EnumProjectMarkers(i) + if not isregion then + if name_tmp == 'DST-OUT_4Pcut' then + id = id_tmp + break + end + end +end + +if id >= 0 then + -- edit existing marker + reaper.SetProjectMarker(id, false, reaper.GetCursorPosition(), 0, 'DST-OUT_4Pcut') +else + -- create new marker + reaper.AddProjectMarker2(0, false, reaper.GetCursorPosition(), 0, 'DST-OUT_4Pcut', -1, reaper.ColorToNative(0, 255, 0)|0x1000000) +end \ No newline at end of file diff --git a/4PointCutting/4Pcut_set_SRC-IN.lua b/4PointCutting/4Pcut_set_SRC-IN.lua new file mode 100644 index 0000000..dbeb5ef --- /dev/null +++ b/4PointCutting/4Pcut_set_SRC-IN.lua @@ -0,0 +1,25 @@ +local nof_markers = 0 +local id = -1 + +-- check if marker already exists +_, nof_markers, _ = reaper.CountProjectMarkers(0) +for i = 0, nof_markers - 1 do + local name_tmp = '' + local isregion_tmp = false + local id_tmp = 0 + _, isregion_tmp, _, _, name_tmp, id_tmp = reaper.EnumProjectMarkers(i) + if not isregion then + if name_tmp == 'SRC-IN_4Pcut' then + id = id_tmp + break + end + end +end + +if id >= 0 then + -- edit existing marker + reaper.SetProjectMarker(id, false, reaper.GetCursorPosition(), 0, 'SRC-IN_4Pcut') +else + -- create new marker + reaper.AddProjectMarker2(0, false, reaper.GetCursorPosition(), 0, 'SRC-IN_4Pcut', -1, reaper.ColorToNative(0, 255, 0)|0x1000000) +end \ No newline at end of file diff --git a/4PointCutting/4Pcut_set_SRC-OUT.lua b/4PointCutting/4Pcut_set_SRC-OUT.lua new file mode 100644 index 0000000..aa93d47 --- /dev/null +++ b/4PointCutting/4Pcut_set_SRC-OUT.lua @@ -0,0 +1,25 @@ +local nof_markers = 0 +local id = -1 + +-- check if marker already exists +_, nof_markers, _ = reaper.CountProjectMarkers(0) +for i = 0, nof_markers - 1 do + local name_tmp = '' + local isregion_tmp = false + local id_tmp = 0 + _, isregion_tmp, _, _, name_tmp, id_tmp = reaper.EnumProjectMarkers(i) + if not isregion then + if name_tmp == 'SRC-OUT_4Pcut' then + id = id_tmp + break + end + end +end + +if id >= 0 then + -- edit existing marker + reaper.SetProjectMarker(id, false, reaper.GetCursorPosition(), 0, 'SRC-OUT_4Pcut') +else + -- create new marker + reaper.AddProjectMarker2(0, false, reaper.GetCursorPosition(), 0, 'SRC-OUT_4Pcut', -1, reaper.ColorToNative(0, 255, 0)|0x1000000) +end \ No newline at end of file diff --git a/4PointCutting/4Pcut_set_dst-track.lua b/4PointCutting/4Pcut_set_dst-track.lua new file mode 100644 index 0000000..ea33216 --- /dev/null +++ b/4PointCutting/4Pcut_set_dst-track.lua @@ -0,0 +1,10 @@ +-- Send a message to the console +function msg(m) + reaper.ShowConsoleMsg(tostring(m) .. "\n") +end + +-- START HERE vvvvvvv +if reaper.CountSelectedTracks(0) > 0 then + local first_sel_track = reaper.GetTrackGUID(reaper.GetSelectedTrack(0, 0)) + reaper.SetProjExtState(0, '4PointCut', 'dst_track', first_sel_track) +end \ No newline at end of file diff --git a/4PointCutting/4Pcut_set_src-tracks.lua b/4PointCutting/4Pcut_set_src-tracks.lua new file mode 100644 index 0000000..210963d --- /dev/null +++ b/4PointCutting/4Pcut_set_src-tracks.lua @@ -0,0 +1,14 @@ +-- Send a message to the console +function msg(m) + reaper.ShowConsoleMsg(tostring(m) .. "\n") +end + +-- START HERE vvvvvvv + +-- get list of selected tracks and make string of GUIDs +local sel_tracks = '' +for i = 0, reaper.CountSelectedTracks(0)-1 do + sel_tracks = sel_tracks .. reaper.GetTrackGUID(reaper.GetSelectedTrack(0, i)) +end +-- store selected tracks to rpp +reaper.SetProjExtState(0, '4PointCut', 'src_tracks', sel_tracks) \ No newline at end of file diff --git a/4PointCutting/README.md b/4PointCutting/README.md new file mode 100644 index 0000000..f8bce9b --- /dev/null +++ b/4PointCutting/README.md @@ -0,0 +1,2 @@ +# 4 Point Cutting (WORK IN PROGRESS) +Brings 4 point editing to reaper... \ No newline at end of file