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!

    • 5 replies
    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.834Z

          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:

          
          // Bail out if Ableton is not running
          if (!sf.ui.abletonLive.isRunning) throw `Ableton Live is not running`;
          
          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 "Show Take Lanes" 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 "Show Take Lanes" 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`);
          
          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}`;
          }
          
          // 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. 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.