No internet connection
  1. Home
  2. How to
  3. Ableton Live

Adding plugins+ duplicating without take lanes

By Sarah @Sarah
    2025-06-19 12:54:59.284Z

    I'd like to add 3rd party plugins in Ableton in Soundflow. How do I do that? I can't figure out how the 'browser path' works....
    Also, is there a way to 'Duplicate track without content', and have the macro also delete the take lanes on the new track? I'd like to duplicate a vocal recording track without copying all the take lanes. Thank you!

    • 15 replies

    There are 15 replies. Estimated reading time: 18 minutes

    1. Chad Wahlbrink @Chad2025-06-19 15:31:22.549Z

      Hi @Sarah,

      Thanks for the question. To load third-party plug-ins in Ableton, you'll use the "Load-Plug-ins" command in the "Plug-ins" section of the Ableton Package here:

      The path typically includes the manufacturer's name and then the plug-in name.

      To load specific presets or add-on packs of devices/content, you can use the "Load Devices" command in the "Browser" section of the Ableton Package.

      Here's a quick video walking through these steps:

      1. SSarah @Sarah
          2025-06-20 13:33:52.145Z

          This answers my questions very well!!! Thanks so much! This is amazing

        • In reply toSarah:
          Chad Wahlbrink @Chad2025-06-19 15:35:28.834Z2026-01-30 17:28:38.004Z

          For your second question about "Duplicate Track without Content" and deleting take lanes, this script should be able to do that for you.

          (This is an excellent idea by the way, and I'll add this as a command to the package in the next update!)

          Copy and paste this to a new script in SoundFlow and give it a shot:

          // Updated 2026-01-30
          
          // Bail out if Ableton is not running
          if (!sf.ui.abletonLive.isRunning) throw `Ableton Live is not running`;
          
          /**
           * Extracts and converts the semantic version from an Ableton version string.
           * e.g. "12.2 (2025-05-20_1c7a2c5dac)" -> 120200
           *       "12.1.11 (2025-04-08_ce4b7c22b0)" -> 120111
           * @param {string} fullVersion - Full Ableton version string
           * @returns {number}
           */
          function abletonFullVersionToNumber(fullVersion) {
              const match = fullVersion.match(/^([\d.]+)/);
              if (!match) throw new Error("Invalid Ableton version format");
          
              const version = match[1]; // Extracted "12.2" or "12.1.11"
              const parts = version.split('.').map(Number);
              const [major = 0, minor = 0, patch = 0] = parts;
              return major * 10000 + minor * 100 + patch;
          }
          
          let appVersion = abletonFullVersionToNumber(sf.ui.abletonLive.appVersion);
          
          sf.ui.abletonLive.appActivateMainWindow();
          
          // Store explicit reference to Ableton Main Window
          let mainWindow = sf.ui.abletonLive.mainWindow;
          
          // Store explicit reference to Session View
          let sessionView = mainWindow.session;
          
          // Store Whether Session View is Active
          let isSessionView = sessionView.scenes.invalidate().exists;
          
          // If we are in session view, switch to arrangement view
          if (isSessionView) {
              sf.ui.abletonLive.menuClick({ menuPath: ['Navigate', 'Arrangement View'] }, `Could Not Select Arrangement View`)
          }
          
          // Ableton Session
          let abletonSession = sf.app.abletonLive.song
          
          // Get the Name of the selected track
          let selectedTrack = abletonSession.view.selectedTrack.invalidate().name.stringValue;
          
          // Get the track header for the selected track
          let selectedTrackHeader = mainWindow.groups.first.groups.whoseTitle.is("Arrangement").first.children.whoseRole.is("AXOutline").whoseDescription.is("Track Headers")
              .first.children.find(trackHeaders => trackHeaders.title.value.startsWith(selectedTrack))
          
          // Show menu for selected track headers
          selectedTrackHeader.elementClick({ actionName: 'AXShowMenu' }, `Could Not Show Context Menu for Selected Track Headers`);
          
          // Explicitly define the context menu
          let contextMenuWin = sf.ui.abletonLive.windows.whoseTitle.is('').allItems.find(window => window.groups.first.groups.whoseTitle.is('Context').exists);
          
          try {
              // Wait for the context menu to show up
              contextMenuWin.elementWaitFor({}, `Failed waiting for context menu to appear`);
          
              contextMenuWin.groups.first.groups.whoseTitle.is("Context")
                  .first.menuItems.find(mi => mi.title.value.startsWith("Duplicate")).elementClick({ actionName: 'AXPick' }, `Could Not Pick "Duplicate" from Context Menu`);
          
              contextMenuWin.elementWaitFor({ waitType: "Disappear" }, `Failed waiting for context menu to appear`);
          
          } catch (err) {
              throw `Failed Duplicating Tracks: ${err}`;
          }
          
          // update the selected track
          selectedTrack = abletonSession.view.selectedTrack.invalidate().name.stringValue;
          
          // update the selected track header
          selectedTrackHeader = mainWindow.groups.first.groups.whoseTitle.is("Arrangement").first.children.whoseRole.is("AXOutline").whoseDescription.is("Track Headers")
              .first.invalidate().children.find(trackHeaders => trackHeaders.title.value.startsWith(selectedTrack))
          
          // Show menu for selected track headers
          selectedTrackHeader.elementClick({ actionName: 'AXShowMenu' }, `Could Not Show Context Menu for Selected Track Headers`);
          
          // Wait for the context menu to show up
          contextMenuWin.elementWaitFor({}, `Failed waiting for context menu to appear`);
          
          if (contextMenuWin.groups.first.groups.whoseTitle.is("Context")
              .first.menuItems.find(mi => mi.title.value.startsWith("Select Track Content")).isEnabled) {
              contextMenuWin.groups.first.groups.whoseTitle.is("Context")
                  .first.menuItems.find(mi => mi.title.value.startsWith("Select Track Content")).elementClick({ actionName: 'AXPick' }, `Could Not Pick "Select Track Content" from Context Menu`);
          } else {
              //dismiss menu
              sf.keyboard.internalPress({ virtualKey: `kVK_Escape` });
              throw 0;
          }
          
          
          contextMenuWin.elementWaitFor({ waitType: "Disappear" }, `Failed waiting for context menu to appear`);
          
          // Show Context Menu from Arrangement Window Selection
          mainWindow.groups.first.groups.whoseTitle.is("Arrangement").first.children.first.elementClick({ actionName: "AXShowMenu" })
          
          try {
              // Wait for the context menu to show up
              contextMenuWin.elementWaitFor({}, `Failed waiting for context menu to appear`);
          
              contextMenuWin.groups.first.groups.whoseTitle.is("Context")
                  .first.menuItems.find(mi => mi.title.value.startsWith("Delete")).elementClick({ actionName: 'AXPick' }, `Could Not Pick "Delete" from Context Menu`);
          
              contextMenuWin.elementWaitFor({ waitType: "Disappear" }, `Failed waiting for context menu to appear`);
              
          
          } catch (err) {
              throw `Failed Deleting Track Content: ${err}`;
          }
          
          if (appVersion > 120111) {
              // Show menu for selected track headers
              selectedTrackHeader.elementClick({ actionName: 'AXShowMenu' }, `Could Not Show Context Menu for Selected Track Headers`);
          
              try {
                  // Wait for the context menu to show up
                  contextMenuWin.elementWaitFor({}, `Failed waiting for context menu to appear`);
          
                  contextMenuWin.groups.first.groups.whoseTitle.is("Context")
                      .first.menuItems.find(mi => mi.title.value.startsWith("Delete All Take Lanes")).elementClick({ actionName: 'AXPick' }, `Could Not Pick "Delete All Take Lanes" from Context Menu`);
          
                  contextMenuWin.elementWaitFor({ waitType: "Disappear" }, `Failed waiting for context menu to appear`);
          
              } catch (err) {
                  throw `Failed Deleting Take Lanes: ${err}`;
              }
          }
          
          1. U@unnamed_795
              2025-10-26 19:16:12.297Z

              hey chad, i tried that out and it doesn't work for me, also not from the ableton package. is there anything i'm missing? i'm in live 12.2.6

              1. Chad Wahlbrink @Chad2025-11-06 20:08:00.491Z

                Hi, @unnamed_795,

                I apologize for the late reply here! We are still catching up on support with the release of SoundFlow 6 last month.

                This is still working as expected for me here. Have you gone through the process of setting up the SoundFlow Control Surface in Ableton's Link, Tempo, & MIDI session?

                Check out this help article for more information:

                https://soundflow.org/docs/getting-started/ableton-live#set-up-the-control-surface

                Let me know if you need more help, though! I'm happy to hop on a quick Zoom call to help you troubleshoot if helpful.

                1. SSarah @Sarah
                    2025-11-09 23:25:18.798Z

                    Is the 12.3 beta version supported?

                    1. Chad Wahlbrink @Chad2025-11-10 18:11:39.847Z

                      Hi, @Sarah,

                      We are tracking a bug where our MIDI Remote Script device is not installed for beta versions of Ableton.

                      You can manually download the MIDI Remote Script folder here:
                      https://drive.google.com/file/d/1zXFdXlU0tIuF-bAekJnwVmYtg-Er6Eo6/view?usp=sharing

                      Unzip the downloaded zip file and then navigate to your Applications folder.

                      If you right-click on the version of Ableton you want to use with SoundFlow, click "Show Package Contents," and from there navigate to Contents > App-Resources > MIDI Remote Scripts. Copy or move that "SoundFlow" folder from the zip file to this MIDI Remote Scripts folder.

                      Re-launch Ableton, and you should be able to set up the MIDI Remote control surface in settings.

                      See the video linked in this other post for more info:
                      Ableton Live / Soundflow Plugin Error #post-2

                    2. In reply toChad:
                      U@unnamed_795
                        2025-12-12 10:11:42.912Z

                        Hey Chad, thanks for the reply! It works now, but with a constraint: it duplicates the track without content on the main playlist/lane content, but it keeps the alternate lanes with their content when duplicating. is this supposed to be like this? because in a perfect world to my understanding it should also delete the underlying takes and lanes. best, joschka

                        1. Chad Wahlbrink @Chad2026-01-29 22:50:37.989Z

                          Hi, @unnamed_795!

                          I apologize for the delayed reply.

                          Are you using the script above or the script in the package? This has been added as a command in the latest public Ableton Live Package version (1.0.12 as of today).

                          When I run this, it duplicates the track, removes content from the main take lane, and then uses the context menu to "Delete All Take Lanes."

                          If this isn't working for you, can you use the Help/Issue Workflow to submit a report so I can take a look? If you can provide a quick screen recording of the behavior and share the link via Google Drive or Dropbox, that would be very helpful in narrowing down the issue you are experiencing.

                          1. U@unnamed_795
                              2026-01-30 13:58:41.025Z

                              hey chad, yes, i updated the script and it works perfect now in a clean session. in an older one it still doesn't work, it always says "could not pick "show take lanes" from context menu". do you have any idea why that might be the case?

                              best
                              joschka

                              1. Chad Wahlbrink @Chad2026-01-30 17:29:28.039Z

                                Hi,@unnamed_795,

                                I'm not sure why that would be the case.

                                In the older session, right-click the track header and confirm whether "Duplicate", "Select Track Content", and "Delete All Take Lanes" are visible. If not, could you take a screenshot of what is shown?

                                These are the actual actions being taken.

                                The "could not pick "show take lanes" is not an accurate error message leftover from an earlier version of the script. I'll update the script on the next version of the package, and in the meantime, I've updated the script above:

                                1. U@unnamed_795
                                    2026-02-02 09:45:12.980Z

                                    Hey, i tried again, it comes up with a different error message now, screenshot is attached:

                                    1. Chad Wahlbrink @Chad2026-02-02 13:42:40.821Z

                                      Hi, @unnamed_795,

                                      Thanks for this screenshot. Can you please try this workflow again and submit a Help/Issue Workflow report? This would give me better context for your system, recent SoundFlow logs, etc.

                                      Thank you!

                      • S
                        In reply toSarah:
                        Sarah @Sarah
                          2025-06-20 13:25:53.836Z

                          OMG THIS WORKS LIKE A CHARM. THANK YOU!!!

                          1. Chad Wahlbrink @Chad2025-06-20 14:56:56.347Z

                            Yay! Thanks for letting me know, @Sarah.

                            Let me know if you have other workflow ideas you want to try.