Reaper: Interesting Tips, Tricks & Actions.

Discussion in 'Reaper' started by justsomerandomdude, Feb 9, 2023.

  1. typical-love

    typical-love Platinum Record

    Joined:
    May 9, 2020
    Messages:
    351
    Likes Received:
    167
    Yeah, this rules. Been meaning to set this up to where I can do editing/menial tasks on my laptop and finish on my PC and go back and forth etc, just so I'm not sitting in a chair all day long.
     
  2. justsomerandomdude

    justsomerandomdude Rock Star

    Joined:
    Aug 24, 2020
    Messages:
    546
    Likes Received:
    371
  3. justsomerandomdude

    justsomerandomdude Rock Star

    Joined:
    Aug 24, 2020
    Messages:
    546
    Likes Received:
    371
    Toggle Bertom EQ Curve Analyzer above and below floating FX
    (requires bertom Eq Curve analyzer plugin: https://bertomaudio.com/eq-curve-analyzer.html)

    Script made with Chat Gpt:

    This does what it says above, adds bertom analyzer on the top and bottom of the floating fx in your plugin chain.
    Its a pain in ass to add this when needed and to remove it.

    This just adds two instances, which u already know if u r using bertom analyzer, and just floats the analyzer (the bottom one). Running it again acts like toggle and removes the instances.
    I use an old version of bertom i guess its 1.2.0, if u r using latest version 2 u might want to change the fx name in the script from this
    Code:
    local FX_NAME = "EQ Curve Analyzer (Bertom)"
    to
    Code:
    local FX_NAME = "EQ Curve Analyzer 2 (Bertom)"
    Here is the Script
    Code:
    -- @description Toggle EQ Curve Analyzer (Bertom) above and below floating FX
    -- @version 1.9
    -- @author ChatGPT
    
    local FX_NAME = "EQ Curve Analyzer (Bertom)"
    local FLAG_PARAM_VALUE = 0.123456789  -- unique magic value to mark inserted FX (param 0)
    
    function isTaggedFX(track, fx_index)
      local param_val = reaper.TrackFX_GetParam(track, fx_index, 0)
      return math.abs(param_val - FLAG_PARAM_VALUE) < 0.000001
    end
    
    function findTaggedFX(track)
      local tagged = {}
      local count = reaper.TrackFX_GetCount(track)
      for i = 0, count - 1 do
        if isTaggedFX(track, i) then
          table.insert(tagged, i)
        end
      end
      return tagged
    end
    
    function removeTaggedFX(track)
      local tagged = findTaggedFX(track)
      -- Delete from highest index to lowest to avoid reindexing issues
      table.sort(tagged, function(a,b) return a > b end)
      for _, i in ipairs(tagged) do
        reaper.TrackFX_Delete(track, i)
      end
    end
    
    function tagFX(track, fx_index)
      -- Mark param 0 with magic value to identify inserted FX
      reaper.TrackFX_SetParam(track, fx_index, 0, FLAG_PARAM_VALUE)
    end
    
    function insertAnalyzerAt(track, insert_pos)
      local fx_index = reaper.TrackFX_AddByName(track, FX_NAME, false, -1)
      if fx_index == -1 then return -1 end
    
      tagFX(track, fx_index)
    
      if fx_index ~= insert_pos then
        reaper.TrackFX_CopyToTrack(track, fx_index, track, insert_pos, true)
      end
    
      return insert_pos
    end
    
    function getFirstFloatingFX()
      local track_count = reaper.CountTracks(0)
      for i = 0, track_count - 1 do
        local track = reaper.GetTrack(0, i)
        local fx_count = reaper.TrackFX_GetCount(track)
        for fx = 0, fx_count - 1 do
          if reaper.TrackFX_GetFloatingWindow(track, fx) then
            return track, fx
          end
        end
      end
      return nil, nil
    end
    
    local function floatFX(track, fx_index)
      reaper.TrackFX_Show(track, fx_index, 3) -- 3 = floating and focused
    end
    
    function toggleAnalyzers()
      local track, fx_index = getFirstFloatingFX()
      if not track then
        reaper.MB("No floating FX window found.\nOpen and float a plugin window first.", "Error", 0)
        return
      end
    
      local tagged = findTaggedFX(track)
      if #tagged > 0 then
        reaper.Undo_BeginBlock()
        removeTaggedFX(track)
        reaper.Undo_EndBlock("Removed EQ Curve Analyzers", -1)
        return
      end
    
      reaper.Undo_BeginBlock()
      -- Insert top (signal generator)
      insertAnalyzerAt(track, fx_index)
      -- Insert bottom (analyzer)
      local bottom_fx_index = insertAnalyzerAt(track, fx_index + 2)
    
      -- Close floating window of top FX (signal generator) if open
      reaper.TrackFX_Show(track, fx_index, 2)
    
      -- Float only the bottom analyzer FX window
      if bottom_fx_index and bottom_fx_index >= 0 then
        floatFX(track, bottom_fx_index)
      end
    
      reaper.Undo_EndBlock("Inserted EQ Curve Analyzers with floating analyzer only", -1)
    end
    
    reaper.PreventUIRefresh(1)
    toggleAnalyzers()
    reaper.PreventUIRefresh(-1)
    reaper.UpdateArrange()
    

    Edit:
    Code:
    -- @description Toggle EQ Curve Analyzer (Bertom) above and below floating FX
    -- @version 1.9
    -- @author ChatGPT
    
    local FX_NAME = "EQ Curve Analyzer 2 (Bertom)"
    local FLAG_PARAM_VALUE = 0.123456789  -- unique magic value to mark inserted FX (param 0)
    
    function isTaggedFX(track, fx_index)
      local param_val = reaper.TrackFX_GetParam(track, fx_index, 0)
      return math.abs(param_val - FLAG_PARAM_VALUE) < 0.000001
    end
    
    function findTaggedFX(track)
      local tagged = {}
      local count = reaper.TrackFX_GetCount(track)
      for i = 0, count - 1 do
        if isTaggedFX(track, i) then
          table.insert(tagged, i)
        end
      end
      return tagged
    end
    
    function removeTaggedFX(track)
      local tagged = findTaggedFX(track)
      -- Delete from highest index to lowest to avoid reindexing issues
      table.sort(tagged, function(a,b) return a > b end)
      for _, i in ipairs(tagged) do
        reaper.TrackFX_Delete(track, i)
      end
    end
    
    function tagFX(track, fx_index)
      -- Mark param 0 with magic value to identify inserted FX
      reaper.TrackFX_SetParam(track, fx_index, 0, FLAG_PARAM_VALUE)
    end
    
    function insertAnalyzerAt(track, insert_pos)
      local fx_index = reaper.TrackFX_AddByName(track, FX_NAME, false, -1)
      if fx_index == -1 then return -1 end
    
      tagFX(track, fx_index)
    
      if fx_index ~= insert_pos then
        reaper.TrackFX_CopyToTrack(track, fx_index, track, insert_pos, true)
      end
    
      return insert_pos
    end
    
    function getFirstFloatingFX()
      local track_count = reaper.CountTracks(0)
      for i = 0, track_count - 1 do
        local track = reaper.GetTrack(0, i)
        local fx_count = reaper.TrackFX_GetCount(track)
        for fx = 0, fx_count - 1 do
          if reaper.TrackFX_GetFloatingWindow(track, fx) then
            return track, fx
          end
        end
      end
      return nil, nil
    end
    
    local function floatFX(track, fx_index)
      reaper.TrackFX_Show(track, fx_index, 3) -- 3 = floating and focused
    end
    
    function toggleAnalyzers()
      local track, fx_index = getFirstFloatingFX()
      if not track then
        reaper.MB("No floating FX window found.\nOpen and float a plugin window first.", "Error", 0)
        return
      end
    
      local tagged = findTaggedFX(track)
      if #tagged > 0 then
        reaper.Undo_BeginBlock()
        removeTaggedFX(track)
        reaper.Undo_EndBlock("Removed EQ Curve Analyzers", -1)
        return
      end
    
      reaper.Undo_BeginBlock()
      -- Insert top (signal generator)
      insertAnalyzerAt(track, fx_index)
      -- Insert bottom (analyzer)
      local bottom_fx_index = insertAnalyzerAt(track, fx_index + 2)
    
      -- Close floating window of top FX (signal generator) if open
      reaper.TrackFX_Show(track, fx_index, 2)
    
      -- Float only the bottom analyzer FX window
      if bottom_fx_index and bottom_fx_index >= 0 then
        floatFX(track, bottom_fx_index)
      end
    
      reaper.Undo_EndBlock("Inserted EQ Curve Analyzers with floating analyzer only", -1)
    end
    
    reaper.PreventUIRefresh(1)
    toggleAnalyzers()
    reaper.PreventUIRefresh(-1)
    reaper.UpdateArrange()
    

    Note* This works only for 64-bit plugins vst and vst3 plugins, didn't work with 32-bit bridged plugins. Any one with a workaround can modify this and share it if u wish to.
     
    Last edited: Jun 25, 2025
  4. xorome

    xorome Audiosexual

    Joined:
    Sep 28, 2021
    Messages:
    1,793
    Likes Received:
    1,351
    Interesting idea. I don't need the exact same thing, but here's what I came up with for my own needs:

    Code:
    local fx_pre = "BertEQA"
    local fx_pos = "BertEQA"
    
    local function sammich()
        retval, trackidx, itemidx, takeidx, fxidx, parm = reaper.GetTouchedOrFocusedFX(1);
    
        if retval == false then
            retval, trackidx, itemidx, takeidx, fxidx, parm = reaper.GetTouchedOrFocusedFX(0);
        end
    
        if retval == false then return end
    
        track = reaper.GetTrack(0, trackidx);
    
        if track then
            reaper.TrackFX_AddByName(track, fx_pre, 0, -1000 - fxidx);
            reaper.TrackFX_AddByName(track, fx_pos, 0, -1002 - fxidx);
        end
    end
    
    reaper.PreventUIRefresh(1)
    reaper.defer(sammich)
    reaper.UpdateArrange()
    reaper.PreventUIRefresh(-1)
    
    This sandwiches the currently selected or last touched plugin between two other plugins.
    The plugin that is inserted before is assigned in local fx_pre = "BertEQA"
    The plugin that is inserted after in local fx_pos = "BertEQA"

    BertEQA is what I renamed Bertom EQ Analyzer to in my case.

    You could change this to other combinations, like fx_pre = "AutoGainMatchBefore", fx_pos = "AutoGainMatchAfter" if you had two such plugins, or a M/S encoder/decoder pair and so on.

    Just save a copy under a different file name if needed.

    I have no idea how reliable this is, seems to work for me. Would need changes to work for containers I think.

    E: A word
     
    Last edited: Jun 25, 2025
  5. justsomerandomdude

    justsomerandomdude Rock Star

    Joined:
    Aug 24, 2020
    Messages:
    546
    Likes Received:
    371
    I knew u would hop in to help, thanks @xorome, at first that was what i came up with using Chat gpt, but i usually use it for a short while and remove it from the chain. Just for a quick reference and to make sure im going the right way.
    So, i need only the Analyzer window open, because both would flood my screen.

    So, our dear Chat gpt made a script that i assigned to a shortcut,
    when enabled it
    1. sandwiches the floating fx
    2. opens only the analyzer while the generator does not float,
    and after use
    3. with the same shortcut/script removes the analyzer and generator from the chain. :)
     
  6. justsomerandomdude

    justsomerandomdude Rock Star

    Joined:
    Aug 24, 2020
    Messages:
    546
    Likes Received:
    371
    Reduce Number of Envelope Points

    TBH i wasn't aware of its existence, up until now, cauz i never needed it. I was looking for a way to thin out the cc points on the envelops, as i just wanted to create a envelop, just sort of a volume gate, after using the script "mpl peak follower" but too much points doesn't sound very good.....so i just right clicked, with out using the script cc thin scripts.. and there it was.

    reaper_AEe57NgBBB.png
    IzaOZouHPn.png

    I dont know when it was implemented so checked. and found kenny's video. Instead of me typing non-sense the video explains in full.
     
    • Like Like x 6
    • Useful Useful x 2
    • List
  7. bluebone

    bluebone Kapellmeister

    Joined:
    Feb 25, 2023
    Messages:
    71
    Likes Received:
    48
    Location:
    saturn
    • Interesting Interesting x 1
    • List
  8. vuldegger

    vuldegger Platinum Record

    Joined:
    Mar 15, 2021
    Messages:
    474
    Likes Received:
    257
    i can see all the sends in the mixer, thanks anyway
     
  9. bluebone

    bluebone Kapellmeister

    Joined:
    Feb 25, 2023
    Messages:
    71
    Likes Received:
    48
    Location:
    saturn
    dark mode
    https://github.com/RobKor77/ReaperDarkMode
    discovered this today. together with following ahk script my reaper looks better than ever. i think that white title bars are ugly when using dark themes
    EDIT: this has negative impact on redrawing UI, for example when resizing mixer
    EDIT2: on my second testing pc (older, but has better gfx) with default reaper installation there are no problems with darkmode. maybe it conflicts with something in my "modded" reaper


    toggle main menu - ahk macro (v 1.x)
    i don't remember where i got this idea, credits to unknown author <3. i'm using it for like a year without problems.

    this can be used together in fullscreen mode to also hide main menu navigation (my reasons: light menu with dark themes is ugly - not relevant with new dark mode hehe; i use it only occassionaly and this also gives me extra little space)

    reason to use extra shortcut (and not F11 also - theoretically you can change "F12::" to "~F11::" to toggle both menu and title bar) is that reaper remembers fullscreen mode on exit. so when you launch reaper with fullscreen on, pressing F11 will hide menu but show title bar.

    Code:
    F12::
    {
    IfWinActive, ahk_exe reaper.exe
    ToggleMenu()
    return
    }
    
    ToggleMenu()
    {
      ;static associative array for keeping track of all windows that have had their menus hidden
      static MenuArray := {}
      ;find active window handle in array / add to array if not found
      hWin := WinExist("A")
      hMenu := null
      hMenu := MenuArray.Remove(hWin)
      if (hMenu = null)
      {
        ;store a reference to the window's menu in the array
        hMenu := (DllCall("GetMenu", "uint", hWin))
        MenuArray[hWin] := hMenu
     
        ;hide the menu by uncoupling it from the parent window
        DllCall("SetMenu", "uint", hWin, "uint", 0)
      }
      else
      {
        ;show menu by recoupling it to the parent window
        DllCall("SetMenu", "uint", hWin, "uint", hMenu)
      }
    }
    
    btw. you can have some sort of "master script" for AHK macro, which will monitor running applications and then run specific scripts for them only when they are open. this is not reaper related, but im using this (auto start) so maybe it can be useful for someone.

    Code:
    #Persistent
    #SingleInstance Force
    SetTimer, ProcessMonitor, 5000  ; Check every 5 seconds
    
    ; Initialize our tracking object
    runningScripts := Object()
    return
    
    ProcessMonitor:
        ; Define your process-script pairs here
        ; Format: ProcessName : ScriptPath
        processScripts := Object()
    
       ; DEFINE YOUR APPS HERE
        processScripts["reaper.exe"] := "C:\reaper.ahk"
        processScripts["yourapp.exe"] := "C:\yourapp.ahk"
     
        ; Check each process
        for processName, scriptPath in processScripts {
            Process, Exist, %processName%
            pid := ErrorLevel
         
            if (pid) {  ; Process is running
                if (!runningScripts.HasKey(processName)) {
                    ; Launch the script if not already running
                    Run, "%A_AhkPath%" "%scriptPath%",,, scriptPID
                    runningScripts[processName] := {pid: scriptPID, path: scriptPath}
                    OutputDebug, % "Launched " scriptPath " for " processName
                }
            } else {  ; Process is not running
                if (runningScripts.HasKey(processName)) {
                    ; Kill the script if process is gone
                    scriptPID := runningScripts[processName].pid
                    Process, Close, %scriptPID%
                    runningScripts.Delete(processName)
                    OutputDebug, % "Closed script for " processName
                }
            }
        }
    return


    reaper readers
    change font size where it is not possible normally (i can finally see clearly my plugin names in browser on high resolution LCD with my old eyes, yay!)
    https://analogdessert.com/downloads/reaper-readers/
     
    Last edited: Jun 19, 2026 at 1:14 PM
  10. capitan crunch

    capitan crunch Audiosexual

    Joined:
    Jul 15, 2023
    Messages:
    724
    Likes Received:
    554
    Location:
    euro dictatorship
    anybody using The Analog Molecule Deluxe? I think it's a gamechanger. So easy to use.
     
    • Interesting Interesting x 1
    • List
  11. bluebone

    bluebone Kapellmeister

    Joined:
    Feb 25, 2023
    Messages:
    71
    Likes Received:
    48
    Location:
    saturn
    Analog Molecule Deluxe

    https://ko-fi.com/s/e46fdb9a07

    The Analog Molecule Deluxe is the ultimate channel strip version of my free 3D console emulator, The Analog Molecule. This groundbreaking plugin creates a living ecosystem inside REAPER, where tracks physically interact with each other through true summing crosstalk and realistic voltage sag.



    gonna try this asap, thanks for bringing this to our attention :winker:
     
    Last edited: Jun 19, 2026 at 6:31 PM
  12. capitan crunch

    capitan crunch Audiosexual

    Joined:
    Jul 15, 2023
    Messages:
    724
    Likes Received:
    554
    Location:
    euro dictatorship
    it's not God's Particle. The Analog Molecule Deluxe really does something I like. You don't have to do anything and it sounds better. No heavy compressors or eqs needed almost 0 cpu.
     
Loading...
Similar Threads - Reaper Interesting Tips Forum Date
Professional Composer automated Reaper with AI Ai for Music May 12, 2026
Problem with swing settings (reaper) Reaper May 3, 2026
[SOLVED] Reaper - Export Issue Reaper Mar 3, 2026
Softube plugins in Reaper problem Reaper Mar 1, 2026
UVI Falcon and Reaper-HOW TO? Software Feb 2, 2026
Loading...