Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release Update region start to playhead position by ID v1.2 #1485

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
-- @description Update region start to playhead position by ID
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bad naming. Better: "Set region start to edit cursor, define region by ID"

-- @author Edson Del Santoro
-- @version 1.2
-- @changelog v1.2 Update region start to playhead position by ID
Copy link
Member

@MichaelPilyavskiy MichaelPilyavskiy Jan 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-- @changelog
--   + initial release

-- @about
-- # Update region start to playhead position by ID
--
-- -- # Update region start to playhead position by ID
-- -- This script updates the start time of a region specified by its ID (as shown in the Region/Marker Manager).
-- -- It keeps the region's end time intact and adjusts only the start.
--
-- 1. Set the playhead to the start position that you want.
-- 2. Execute this script.
-- 3. Enter the Region ID that you want to update Start timming.
--
-- That's it.


SCRIPT_NAME = "Update region start to playhead position by ID"

reaper.ClearConsole()

function Msg(variable)
reaper.ShowConsoleMsg(tostring(variable) .. "\n")
end

-- Get playhead position
playhead_position = reaper.GetCursorPosition()

-- Get total number of markers and regions
retval, num_markers, num_regions = reaper.CountProjectMarkers(0)

if num_regions == 0 then
reaper.ShowMessageBox("No regions found in the project.", SCRIPT_NAME, 0)
return
end

-- Ask the user for the ID of the region to update
retval, user_input = reaper.GetUserInputs(SCRIPT_NAME, 1, "Enter Region ID (as shown in Region/Marker Manager):", "")
if not retval or user_input == "" then return end

region_id = tonumber(user_input)

if region_id == nil or region_id < 0 then
reaper.ShowMessageBox("Invalid Region ID. Please enter a valid number.", SCRIPT_NAME, 0)
return
end

-- Find the region with the matching ID
selected_region = nil
for i = 0, num_markers + num_regions - 1 do
retval, isrgn, rgn_start, rgn_end, rgn_name, rgn_index = reaper.EnumProjectMarkers(i)

if isrgn and rgn_index == region_id then
selected_region = {rgn_start = rgn_start, rgn_end = rgn_end, rgn_name = rgn_name, rgn_index = rgn_index, region_marker_index = i}
break
end
end

if selected_region == nil then
reaper.ShowMessageBox("No region found with ID " .. region_id .. ". Please check the Region/Marker Manager.", SCRIPT_NAME, 0)
return
end

-- Update region start time
new_start = playhead_position
rgn_end = selected_region.rgn_end
region_marker_index = selected_region.region_marker_index
rgn_name = selected_region.rgn_name

-- Begin undo-block
reaper.Undo_BeginBlock2(0)

reaper.SetProjectMarkerByIndex(0, region_marker_index, true, new_start, rgn_end, selected_region.rgn_index, rgn_name, 0)

-- End undo-block
reaper.Undo_EndBlock2(0, SCRIPT_NAME, -1)
Copy link
Member

@MichaelPilyavskiy MichaelPilyavskiy Jan 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use 0xFFFFFFFF instead -1

https://www.reaper.fm/sdk/plugin/reaper_plugin.h

UNDO_STATE_ALL 
UNDO_STATE_ALL 0xFFFFFFFF 
UNDO_STATE_TRACKCFG 1 // has track/master vol/pan/routing, ALL envelopes (matser included) 
UNDO_STATE_FX 2  // track/master fx 
UNDO_STATE_ITEMS 4  // track items 
UNDO_STATE_MISCCFG 8 // loop selection, markers, regions, extensions! 

Copy link
Contributor

@Buy-One Buy-One Jan 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does the choice between -1 and 0xFFFFFFFF affect the result or reliability?
-1 was recommended by Schwa and as far as i understand in C that's one and the same

Copy link
Member

@MichaelPilyavskiy MichaelPilyavskiy Jan 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does the choice between -1 and 0xFFFFFFFF affect the result or reliability? -1 was recommended by Schwa and as far as i understand in C that's one and the same

It is not the same. -1 stay for "all byte set" while 0xFFFFFFFF stay for "first 8 bytes set", I remember I got different results somewhere using -1, nothing serious but I don`t remember where it differs I just remember 0xFFFFFFFF worked as expected and -1 did not. I use it everythere since that time, maybe they changed that in API in the past (3+ years ago) and that was really rarely undocumented corner case.

Copy link
Member

@cfillion cfillion Jan 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

4 bytes*

In this case it's equivalent: Undo_EndBlock2's extraflags is a 32-bit integer so -1 and 0xFFFFFFFF both set all 32 bits.


reaper.UpdateArrange()
reaper.ShowMessageBox("Region '" .. rgn_name .. "' (ID " .. region_id .. ") start updated to playhead position.", SCRIPT_NAME, 0)
Loading