I've just uploaded
Lokasenna_Invert selected CC event values to ReaPack; should be available in a few minutes.
As I suggested, it's a lot more straightforward to do when we don't have to fiddle with native actions. Here's the code with some extra comments:
Code:
local editor = reaper.MIDIEditor_GetActive()
if not editor then return end
local take = reaper.MIDIEditor_GetTake(editor)
if not take then return end
reaper.Undo_BeginBlock()
-- This loop structure keeps asking Reaper for the next selected
-- CC event until Reaper says there aren't any more.
local ccIdx = -1
while true do
ccIdx = reaper.MIDI_EnumSelCC(take, ccIdx)
if ccIdx == -1 then break end
-- msg3 is the CC value
local _, _, _, _, _, _, _, msg3 = reaper.MIDI_GetCC(take, ccIdx)
reaper.MIDI_SetCC(take, ccIdx, nil, nil, nil, nil, nil, nil, 127 - msg3, true)
end
-- For performance reasons, it's better to tell Reaper not to do
-- any sorting while we loop through the events and then sort them
-- all at once afterward
reaper.MIDI_Sort(take)
-- Hack to make Reaper recognize that the item was altered so we
-- get a correct Undo point
local item = reaper.GetMediaItemTake_Item(take)
reaper.SetMediaItemSelected(item, false)
reaper.SetMediaItemSelected(item, true)
reaper.Undo_EndBlock("Invert selected CC event values", 4)