Adding plugins+ duplicating without take lanes
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!
Linked from:
Chad Wahlbrink @Chad2025-06-19 15:31:22.549ZHi @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:
- SSarah @Sarah
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.004ZFor 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}`; } }- U@unnamed_795
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
Chad Wahlbrink @Chad2025-11-06 20:08:00.491ZHi, @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.
- SSarah @Sarah
Is the 12.3 beta version supported?
Chad Wahlbrink @Chad2025-11-10 18:11:39.847ZHi, @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=sharingUnzip 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
- In reply toChad⬆:U@unnamed_795
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
Chad Wahlbrink @Chad2026-01-29 22:50:37.989ZHi, @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.
- U@unnamed_795
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
Chad Wahlbrink @Chad2026-01-30 17:29:28.039ZHi,@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:
- U@unnamed_795
Hey, i tried again, it comes up with a different error message now, screenshot is attached:

Chad Wahlbrink @Chad2026-02-02 13:42:40.821ZHi, @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
Chad Wahlbrink @Chad2025-06-20 14:56:56.347ZYay! Thanks for letting me know, @Sarah.
Let me know if you have other workflow ideas you want to try.