Old 07-19-2022, 10:21 AM   #1
matt_t
Human being with feelings
 
Join Date: Nov 2012
Location: West Midlands, UK
Posts: 379
Default v6.64+dev0719 - July 19 2022

v6.64+dev0719 - July 19 2022
  • * Includes feature branch: track media/razor edit grouping
  • * Includes feature branch: pan law/function improvements
  • * Includes feature branch: improve experimental silent-track CPU reduction option to include FX tail length
  • * Includes feature branch: media item fixed lanes
  • * Includes feature branch: internal pin management overhaul for future extension
  • + Media items: fix flickering when moving media items across tracks and "automatically display affected envelopes" is enabled
  • + Razor edits: ignore razor edit areas on envelopes when running action to crossfade media items [p=2579146]
  • + Track grouping: improve grouping of razor edits on tracks with different numbers of fixed lanes
  • # Actions: deselect unaffected items on the not-selected side of the split when running action to split items selecting left or right [p=2578578]
This thread is for pre-release features discussion. Use the Feature Requests forum for other requests.

Changelog - Pre-Releases

Generated by X-Raym's REAPER ChangeLog to BBCode
matt_t is offline   Reply With Quote
Old 07-19-2022, 10:55 AM   #2
Mercado_Negro
Moderator
 
Mercado_Negro's Avatar
 
Join Date: Aug 2007
Location: Caracas, Venezuela
Posts: 8,676
Default

I don't know why but REAPER rescanned all my plug-ins with this new pre.
__________________
Pressure is what turns coal into diamonds - Michael a.k.a. Runaway
Mercado_Negro is offline   Reply With Quote
Old 07-19-2022, 11:43 AM   #3
sockmonkey72
Human being with feelings
 
sockmonkey72's Avatar
 
Join Date: Sep 2021
Location: Berlin
Posts: 1,935
Default

Quote:
  • # Actions: deselect unaffected items on the not-selected side of the split when running action to split items selecting left or right [p=2578578]
I don't want to jinx it, but as far as I can tell, the splitting behavior is perfect now.

My macOS REAPER didn't rescan all my plugins FWIW.

Thank you!
__________________
ReaPack Repository: right-click and copy index URL
sockmonkey72 is offline   Reply With Quote
Old 07-19-2022, 12:03 PM   #4
Sexan
Human being with feelings
 
Sexan's Avatar
 
Join Date: Jun 2009
Location: Croatia
Posts: 4,596
Default

Yeah its really nice now!

Lane selection is good!

This one is still here:

Shift + S , Delete or Cut


EDIT: The problem seems to be when you do initial Split selection (Shift + S) then it also creates the little item on crossfade section

Last edited by Sexan; 07-19-2022 at 12:13 PM.
Sexan is offline   Reply With Quote
Old 07-19-2022, 12:13 PM   #5
schwa
Administrator
 
schwa's Avatar
 
Join Date: Mar 2007
Location: NY
Posts: 15,749
Default

Why not just cut or delete in that scenario instead of splitting first?
schwa is offline   Reply With Quote
Old 07-19-2022, 12:14 PM   #6
Sexan
Human being with feelings
 
Sexan's Avatar
 
Join Date: Jun 2009
Location: Croatia
Posts: 4,596
Default

Quote:
Originally Posted by schwa View Post
Why not just cut or delete in that scenario instead of splitting first?
Just doing weird stuff for bug hunt (normally I would do that). But the problem is that SPLIT is doing that not delete or cut which I thought


It creates additional item

Last edited by Sexan; 07-19-2022 at 12:21 PM.
Sexan is offline   Reply With Quote
Old 07-19-2022, 12:23 PM   #7
schwa
Administrator
 
schwa's Avatar
 
Join Date: Mar 2007
Location: NY
Posts: 15,749
Default

Actually... I can't reproduce that. Does it happen for you without grouping the tracks?

[edit] never mind, got it!
schwa is offline   Reply With Quote
Old 07-19-2022, 12:27 PM   #8
Sexan
Human being with feelings
 
Sexan's Avatar
 
Join Date: Jun 2009
Location: Croatia
Posts: 4,596
Default

Quote:
Originally Posted by schwa View Post
Actually... I can't reproduce that. Does it happen for you without grouping the tracks?
Yeah that above is new clean project with just 1 track without grouping. Maybe this is the problem?


EDIT: yeah it is
Sexan is offline   Reply With Quote
Old 07-19-2022, 10:52 PM   #9
ferropop
Human being with feelings
 
ferropop's Avatar
 
Join Date: Jan 2016
Location: Los Angeles, CA
Posts: 3,116
Default

Grouping looks so great!

Wondering - any plans for "temporary grouping"?

There's many situations where you don't want to create formal groups, as you need to edit stuff together one time, or temporarily.

Reaper already does this with Volume Faders -- if you select multiple tracks and pull a fader, they all come down together. It's easy to forget that this is basically ad-hoc grouping of the Volume Fader.

This exact behavior, but for Volume Envelopes, Mutes etc, could make a lot of sense for those "let me quickly dip the volume on these 7 tracks" type situations, which comes up All the time.

example : select tracks, engage "ad hoc grouping", now any track-based adjustments (shared volume envelope trims/draws/deletes/stretches) happen together. Disengage ad hoc grouping when done.
__________________
FERRO
Songs I've Written/Produced : https://sptfy.com/7SIW
Instagram : http://www.instagram.com/ferropop

Last edited by ferropop; 07-19-2022 at 10:58 PM.
ferropop is online now   Reply With Quote
Old 07-19-2022, 11:05 PM   #10
sockmonkey72
Human being with feelings
 
sockmonkey72's Avatar
 
Join Date: Sep 2021
Location: Berlin
Posts: 1,935
Default

Quote:
Originally Posted by ferropop View Post
Grouping looks so great!

Wondering - any plans for "temporary grouping"?

There's many situations where you don't want to create formal groups, as you need to edit stuff together one time, or temporarily.

Reaper already does this with Volume Faders -- if you select multiple tracks and pull a fader, they all come down together. It's easy to forget that this is basically ad-hoc grouping of the Volume Fader.

This exact behavior, but for Volume Envelopes, Mutes etc, could make a lot of sense for those "let me quickly dip the volume on these 7 tracks" type situations, which comes up All the time.
I don't want to push my luck this dev cycle, but I'm going to +1 this, with the qualification that I don't think temporary groups should be automatic (like with volume faders). I guess this is something easy enough for an intrepid scripter to do, though, since the building blocks are basically there[*].

I have a question about those actions, though ("Track: Create track media/razor editing group from selected tracks" and "Track: Remove selected tracks from track media/razor editing groups"). It looks like they use the first unused (empty) group to do their thing -- is that the case? Is there any way to influence which group is used (always Group 64, for instance)?

I guess that my only wish[*] would be to have this notional temporary group outside of the 64-group system, only for track media/razor editing, so that it would always have the same color and work the same way regardless of what else is happening in groupville. Actually...
[*] I guess what the benefit of the "temp group" would be is that you wouldn't need to have to reselect the tracks to remove the group, which you have to do now. You could just clear or remake the temp group and it's done. You only get one.

Again, the intrepid scripter could probably manage all of this herself (always use group 64, cache which tracks are currently in the group, etc.). It would be a useful addition to the built-in feature, though.

EDIT: putting my money where my mouth is, here's a script to do it using Group 64. It might be nice to make this script work on the basis of selected media items rather than selected tracks, maybe later...

Code:
-- @description Create a "temporary" track media/razor edit group in Group 64
-- @author sockmonkey72
-- @version 1.0
-- @changelog 1.0 initial upload

function selectionIdenticalToExtState(extTrackGUIDs)
  local rv = false
  local selTrkCount = reaper.CountSelectedTracks(0)
  if selTrkCount > 0 then
    local sameSelection = true
    for i = 0, selTrkCount - 1 do
      local trk = reaper.GetSelectedTrack(0, i)
      if trk ~= 0 then
        local trkGUID = reaper.GetTrackGUID(trk)
        local found = false
        for _, guid in pairs(extTrackGUIDs) do
          if guid == trkGUID then 
            found = true 
            break
          end
        end
        if found == false then
          sameSelection = false
          break
        end
      end
    end
    if sameSelection == true then rv = true end
  end
  return rv
end

function removeTrackEditGroupFromAllTracks()
  local rv = false
  local numTracks = reaper.CountTracks(0)
  for i = 0, numTracks - 1 do
    local trk = reaper.GetTrack(0, i)
    if trk ~= 0 then
      local state1 = reaper.GetSetTrackGroupMembershipHigh(trk, "ITEM_EDIT_LEAD", 0, 0)
      local state2 = reaper.GetSetTrackGroupMembershipHigh(trk, "ITEM_EDIT_FOLLOW", 0, 0)
      if state1 & (1 << 31) ~= 0 or state2 & (1 << 31) ~= 0 then
        reaper.GetSetTrackGroupMembershipHigh(trk, "ITEM_EDIT_LEAD", 1 << 31, 0)
        reaper.GetSetTrackGroupMembershipHigh(trk, "ITEM_EDIT_FOLLOW", 1 << 31, 0)
        rv = true
      end
    end
  end
  return rv;
end

function createTrackEditGroupFromSelection()
  local rv = false
  local trackGUIDs = {}
  local selTrkCount = reaper.CountSelectedTracks(0)
  for i = 0, selTrkCount - 1 do
    local trk = reaper.GetSelectedTrack(0, i)
    if trk ~= 0 then
      reaper.GetSetTrackGroupMembershipHigh(trk, "ITEM_EDIT_LEAD", 1 << 31, 1 << 31)
      reaper.GetSetTrackGroupMembershipHigh(trk, "ITEM_EDIT_FOLLOW", 1 << 31, 1 << 31)
      trackGUIDs[#trackGUIDs + 1] = reaper.GetTrackGUID(trk)
      rv = true
    end
  end
  return rv, trackGUIDs
end

-----------------------------------------------------------
-----------------------------------------------------------

reaper.PreventUIRefresh(1)

local undoStarted = false
local removed = false
local created = false
local onlyRemove = false

local _, extState = reaper.GetProjExtState(0, "sm72_tempTrackEditGroup", "tracks")
if extState ~= "" then
  local extTrackGUIDs = {}

  undoStarted = true
  reaper.Undo_BeginBlock2(0)
  
  for guid in string.gmatch(extState, "[^,]+") do
      extTrackGUIDs[#extTrackGUIDs + 1] = guid
  end
  if #extTrackGUIDs > 0 then -- only delete stuff if we were responsible for it
    onlyRemove = selectionIdenticalToExtState(extTrackGUIDs)
    removed = removeTrackEditGroupFromAllTracks()
  end
  reaper.SetProjExtState(0, "sm72_tempTrackEditGroup", "", "")
end

-- for extra credit we could check whether Group 64 is in use and bail here if so
-- not doing because I am lazy

local selTrkCount = reaper.CountSelectedTracks(0)
if onlyRemove == false and selTrkCount > 0 then
  if undoStarted == false then reaper.Undo_BeginBlock2(0) end
  undoStarted = true;

  local trackGUIDs
  created, trackGUIDs = createTrackEditGroupFromSelection()
  if #trackGUIDs > 0 then
    reaper.SetProjExtState(0, "sm72_tempTrackEditGroup", "tracks", table.concat(trackGUIDs, ","))
  end
end

local description = "Temp Edit Group"
if undoStarted == true then
  if removed == true and created == true then
    description = "Update Temp Edit Group"
  elseif removed == true then
    description = "Delete Temp Edit Group"
  elseif created == true then
    description = "Create Temp Edit Group"
  end
  reaper.Undo_EndBlock2(0, description, -1)
end

reaper.TrackList_AdjustWindows(false)

reaper.PreventUIRefresh(-1)
__________________
ReaPack Repository: right-click and copy index URL

Last edited by sockmonkey72; 07-20-2022 at 01:53 AM.
sockmonkey72 is offline   Reply With Quote
Old 07-20-2022, 05:47 AM   #11
Loulou92
Human being with feelings
 
Loulou92's Avatar
 
Join Date: Sep 2015
Location: Paris
Posts: 544
Default

Could it be possible to have more toolbar slots, please, it was discussed in a schwa youtube stream month ago, he said it was do-able and that someone had to ask for it in the pre release updates forum to remind him. Thanks !
Loulou92 is offline   Reply With Quote
Old 07-20-2022, 06:02 AM   #12
sockmonkey72
Human being with feelings
 
sockmonkey72's Avatar
 
Join Date: Sep 2021
Location: Berlin
Posts: 1,935
Default

Quote:
Originally Posted by sockmonkey72 View Post
It might be nice to make this script work on the basis of selected media items rather than selected tracks, maybe later...
Later is now, maybe someone will find this useful, either to use or as a prototype:

Code:
-- @description Create a "temporary" track media/razor edit group in Group 64
-- @author sockmonkey72
-- @version 1.0
-- @changelog 1.0 initial upload

tracksForItems = {}
tracksForItemsCount = 0;

function addTrackToTable(trk)
  if trk then
    local guid = reaper.GetTrackGUID(trk)
    if tracksForItems[guid] == nil then
      tracksForItems[guid] = trk
      tracksForItemsCount = tracksForItemsCount + 1
    end
  end
end

-- add selected items AND selected tracks
function populateTracksForItems()
  local selectedMediaItems = reaper.CountSelectedMediaItems(0)
  for i = 0, selectedMediaItems - 1 do
    local item = reaper.GetSelectedMediaItem(0, i)
    if item then
      addTrackToTable(reaper.GetMediaItem_Track(item))
    end
  end
  local selectedTracks = reaper.CountSelectedTracks(0)
  for i = 0, selectedTracks - 1 do
    addTrackToTable(reaper.GetSelectedTrack(0, i))
  end
  return tracksForItems
end

function selectionIdenticalToExtState(extTrackGUIDs)
  local rv = false
  local sameSelection = true
  if #extTrackGUIDs ~= tracksForItemsCount then return false end
  for trkGUID, trk in pairs(tracksForItems) do
    local found = false
    for _, guid in pairs(extTrackGUIDs) do
      if guid == trkGUID then 
        found = true 
        break
      end
    end
    if found == false then
      sameSelection = false
      break
    end
  end
  if sameSelection == true then rv = true end
  return rv
end

function removeTrackEditGroupFromAllTracks()
  local rv = false
  local numTracks = reaper.CountTracks(0)
  for i = 0, numTracks - 1 do
    local trk = reaper.GetTrack(0, i)
    if trk then
      local state1 = reaper.GetSetTrackGroupMembershipHigh(trk, "MEDIA_EDIT_LEAD", 0, 0)
      local state2 = reaper.GetSetTrackGroupMembershipHigh(trk, "MEDIA_EDIT_FOLLOW", 0, 0)
      if state1 & (1 << 31) ~= 0 or state2 & (1 << 31) ~= 0 then
        reaper.GetSetTrackGroupMembershipHigh(trk, "MEDIA_EDIT_LEAD", 1 << 31, 0)
        reaper.GetSetTrackGroupMembershipHigh(trk, "MEDIA_EDIT_FOLLOW", 1 << 31, 0)
        rv = true
      end
    end
  end
  return rv;
end

function createTrackEditGroupFromSelection()
  local rv = false
  local trackGUIDs = {}
  for trkGUID, trk in pairs(tracksForItems) do
    reaper.GetSetTrackGroupMembershipHigh(trk, "MEDIA_EDIT_LEAD", 1 << 31, 1 << 31)
    reaper.GetSetTrackGroupMembershipHigh(trk, "MEDIA_EDIT_FOLLOW", 1 << 31, 1 << 31)
    trackGUIDs[#trackGUIDs + 1] = trkGUID
    rv = true
  end
  return rv, trackGUIDs
end

-----------------------------------------------------------
-----------------------------------------------------------

reaper.PreventUIRefresh(1)

local removed = false
local created = false
local onlyRemove = false

populateTracksForItems()

reaper.Undo_BeginBlock2(0)

local _, extState = reaper.GetProjExtState(0, "sm72_tempTrackEditGroup", "tracks")
if extState ~= "" then
  local extTrackGUIDs = {}
  for guid in string.gmatch(extState, "[^,]+") do
      extTrackGUIDs[#extTrackGUIDs + 1] = guid
  end
  if #extTrackGUIDs > 0 then -- only delete stuff if we were responsible for it
    onlyRemove = selectionIdenticalToExtState(extTrackGUIDs)
    removed = removeTrackEditGroupFromAllTracks()
  end
  reaper.SetProjExtState(0, "sm72_tempTrackEditGroup", "", "")
end

-- for extra credit we could check whether Group 64 is in use and bail here if so
-- not doing because I am lazy

if onlyRemove == false and tracksForItemsCount > 0 then
  local trackGUIDs
  created, trackGUIDs = createTrackEditGroupFromSelection()
  if #trackGUIDs > 0 then
    reaper.SetProjExtState(0, "sm72_tempTrackEditGroup", "tracks", table.concat(trackGUIDs, ","))
  end
end

local description = "Temp Edit Group"
if removed == true and created == true then
  description = "Update Temp Edit Group"
elseif removed == true then
  description = "Delete Temp Edit Group"
elseif created == true then
  description = "Create Temp Edit Group"
end
reaper.Undo_EndBlock2(0, description, -1)

reaper.TrackList_AdjustWindows(false)

reaper.PreventUIRefresh(-1)
__________________
ReaPack Repository: right-click and copy index URL

Last edited by sockmonkey72; 07-20-2022 at 02:28 PM. Reason: updated to work with +dev0720
sockmonkey72 is offline   Reply With Quote
Old 07-20-2022, 06:36 PM   #13
ferropop
Human being with feelings
 
ferropop's Avatar
 
Join Date: Jan 2016
Location: Los Angeles, CA
Posts: 3,116
Default

Quote:
Originally Posted by sockmonkey72 View Post
Later is now, maybe someone will find this useful, either to use or as a prototype:

Code:
-- @description Create a "temporary" track media/razor edit group in Group 64
-- @author sockmonkey72
-- @version 1.0
-- @changelog 1.0 initial upload

tracksForItems = {}
tracksForItemsCount = 0;

function addTrackToTable(trk)
  if trk then
    local guid = reaper.GetTrackGUID(trk)
    if tracksForItems[guid] == nil then
      tracksForItems[guid] = trk
      tracksForItemsCount = tracksForItemsCount + 1
    end
  end
end

-- add selected items AND selected tracks
function populateTracksForItems()
  local selectedMediaItems = reaper.CountSelectedMediaItems(0)
  for i = 0, selectedMediaItems - 1 do
    local item = reaper.GetSelectedMediaItem(0, i)
    if item then
      addTrackToTable(reaper.GetMediaItem_Track(item))
    end
  end
  local selectedTracks = reaper.CountSelectedTracks(0)
  for i = 0, selectedTracks - 1 do
    addTrackToTable(reaper.GetSelectedTrack(0, i))
  end
  return tracksForItems
end

function selectionIdenticalToExtState(extTrackGUIDs)
  local rv = false
  local sameSelection = true
  if #extTrackGUIDs ~= tracksForItemsCount then return false end
  for trkGUID, trk in pairs(tracksForItems) do
    local found = false
    for _, guid in pairs(extTrackGUIDs) do
      if guid == trkGUID then 
        found = true 
        break
      end
    end
    if found == false then
      sameSelection = false
      break
    end
  end
  if sameSelection == true then rv = true end
  return rv
end

function removeTrackEditGroupFromAllTracks()
  local rv = false
  local numTracks = reaper.CountTracks(0)
  for i = 0, numTracks - 1 do
    local trk = reaper.GetTrack(0, i)
    if trk then
      local state1 = reaper.GetSetTrackGroupMembershipHigh(trk, "MEDIA_EDIT_LEAD", 0, 0)
      local state2 = reaper.GetSetTrackGroupMembershipHigh(trk, "MEDIA_EDIT_FOLLOW", 0, 0)
      if state1 & (1 << 31) ~= 0 or state2 & (1 << 31) ~= 0 then
        reaper.GetSetTrackGroupMembershipHigh(trk, "MEDIA_EDIT_LEAD", 1 << 31, 0)
        reaper.GetSetTrackGroupMembershipHigh(trk, "MEDIA_EDIT_FOLLOW", 1 << 31, 0)
        rv = true
      end
    end
  end
  return rv;
end

function createTrackEditGroupFromSelection()
  local rv = false
  local trackGUIDs = {}
  for trkGUID, trk in pairs(tracksForItems) do
    reaper.GetSetTrackGroupMembershipHigh(trk, "MEDIA_EDIT_LEAD", 1 << 31, 1 << 31)
    reaper.GetSetTrackGroupMembershipHigh(trk, "MEDIA_EDIT_FOLLOW", 1 << 31, 1 << 31)
    trackGUIDs[#trackGUIDs + 1] = trkGUID
    rv = true
  end
  return rv, trackGUIDs
end

-----------------------------------------------------------
-----------------------------------------------------------

reaper.PreventUIRefresh(1)

local removed = false
local created = false
local onlyRemove = false

populateTracksForItems()

reaper.Undo_BeginBlock2(0)

local _, extState = reaper.GetProjExtState(0, "sm72_tempTrackEditGroup", "tracks")
if extState ~= "" then
  local extTrackGUIDs = {}
  for guid in string.gmatch(extState, "[^,]+") do
      extTrackGUIDs[#extTrackGUIDs + 1] = guid
  end
  if #extTrackGUIDs > 0 then -- only delete stuff if we were responsible for it
    onlyRemove = selectionIdenticalToExtState(extTrackGUIDs)
    removed = removeTrackEditGroupFromAllTracks()
  end
  reaper.SetProjExtState(0, "sm72_tempTrackEditGroup", "", "")
end

-- for extra credit we could check whether Group 64 is in use and bail here if so
-- not doing because I am lazy

if onlyRemove == false and tracksForItemsCount > 0 then
  local trackGUIDs
  created, trackGUIDs = createTrackEditGroupFromSelection()
  if #trackGUIDs > 0 then
    reaper.SetProjExtState(0, "sm72_tempTrackEditGroup", "tracks", table.concat(trackGUIDs, ","))
  end
end

local description = "Temp Edit Group"
if removed == true and created == true then
  description = "Update Temp Edit Group"
elseif removed == true then
  description = "Delete Temp Edit Group"
elseif created == true then
  description = "Create Temp Edit Group"
end
reaper.Undo_EndBlock2(0, description, -1)

reaper.TrackList_AdjustWindows(false)

reaper.PreventUIRefresh(-1)
Yesssss <3
__________________
FERRO
Songs I've Written/Produced : https://sptfy.com/7SIW
Instagram : http://www.instagram.com/ferropop
ferropop is online now   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -7. The time now is 01:43 PM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.