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!
- 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:
- 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.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}`; }
- S
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.