Pro Tools "Save Track Preset" Batch
Hey ya'll! Hoping to make something like this happen:
- Have a full session mix/ master setup with all inserts/ sends
- Highlight all tracks and macro "Save track preset" for all the different tracks with a prefix or suffix of the artists name
Tired of going through the whole session and saving track presets individually.
Let me know if you got any suggestions?
- Kitch Membery @Kitch2025-06-07 20:23:52.768Z
Hi @Bradley_Denniston, legend!
Below is a script that will store track presets for all tracks in your session that end with a suffix of "_" followed by the Artist name. eg "_Bradley Denniston".
So if one of the tracks was named "Audio 1_Bradley Denniston" a preset would be created like this.
Please note that I've only done limited testing on this script, so let me know if there are any issues, and I'll take a look.
Here are the steps to create the command
-
In SoundFlow, click "+New" and select "Script", name it "Store Track Presets" and press OK.
-
Copy and paste the following script into the new script you've created.
function storeTrackPreset({ name, categoryPath }) { sf.ui.proTools.selectedTrack.titleButton.popupMenuSelect({ menuPath: ["Save Track Preset..."], isRightClick: true }); const saveTrackPresetWindow = sf.ui.proTools.windows.whoseTitle.is("Save Track Preset").first; saveTrackPresetWindow.elementWaitFor(); saveTrackPresetWindow.popupButtons.first.popupMenuSelect({ menuPath: categoryPath }); // Set "Name:" field saveTrackPresetWindow.textFields.first.elementSetTextFieldWithAreaValue({ value: name }); saveTrackPresetWindow.buttons.whoseTitle.is("OK").first.elementClick(); saveTrackPresetWindow.elementWaitFor({ waitType: "Disappear" }); } function storeTrackPresets({ artistName, presetRootFolder, trackPresetsDirectory }) { // Location of artist's track presets folder in finder const targetPresetDirectory = `${trackPresetsDirectory}/${presetRootFolder}/${artistName}`; // Create artist track preset folder if it does not already exist if (!sf.file.directoryExists({ path: targetPresetDirectory }).exists) { sf.file.directoryCreate({ path: targetPresetDirectory, }); } sf.ui.proTools.appActivateMainWindow(); sf.ui.proTools.mainWindow.invalidate(); const tracks = sf.app.proTools.tracks.invalidate().allItems; const targetTracks = tracks.filter(t => !t.isHidden && t.name.endsWith(`_${artistName}`)); const targetTrackNames = targetTracks.map(t => t.name); targetTrackNames.forEach(name => { // Select the track sf.app.proTools.selectTracksByName({ trackNames: [name] }); sf.ui.proTools.trackGetByName({ name }).track.trackScrollToView(); // create preset name by removing the artistNameSuffix from the track Name const presetName = name.replace(`_${artistName}`, "").trim(); storeTrackPreset({ name: presetName, categoryPath: [presetRootFolder, artistName], }); }); } storeTrackPresets({ artistName: "Bradley Denniston", presetRootFolder: "User Presets", trackPresetsDirectory: "~/Documents/Pro Tools/Track Presets", });
-
Update the artist name, preset root folder, and track preset directory (if needed).
-
Assign a keyboard shortcut to the Script or add it to a deck. :-)
-
Name the tracks you want to create preset names for with an "_Artist Name" Suffix, then run the script. (Note: This script could also be adapted to just work on the selected tracks rather than having the suffix added.)
Let me know if you get stuck.
Rock on!- BBradley Denniston @Bradley_Denniston
Amazing! How would I adapt it to just work on the selected tracks?
Kitch Membery @Kitch2025-06-07 21:44:16.193Z
Here is a version that will work on Selected Tracks, so that you don't have to add the "_Artist Name" Suffix.
function storeTrackPreset({ name, categoryPath }) { sf.ui.proTools.selectedTrack.titleButton.popupMenuSelect({ menuPath: ["Save Track Preset..."], isRightClick: true, }); const saveTrackPresetWindow = sf.ui.proTools.windows.whoseTitle.is("Save Track Preset").first; saveTrackPresetWindow.elementWaitFor(); saveTrackPresetWindow.popupButtons.first.popupMenuSelect({ menuPath: categoryPath }); // Set "Name:" field saveTrackPresetWindow.textFields.first.elementSetTextFieldWithAreaValue({ value: name }); saveTrackPresetWindow.buttons.whoseTitle.is("OK").first.elementClick(); saveTrackPresetWindow.elementWaitFor({ waitType: "Disappear" }); } function storeTrackPresets({ artistName, presetRootFolder, trackPresetsDirectory }) { // Location of artist's track presets folder in finder const targetPresetDirectory = `${trackPresetsDirectory}/${presetRootFolder}/${artistName}`; // Create artist track preset folder if it does not already exist if (!sf.file.directoryExists({ path: targetPresetDirectory }).exists) { sf.file.directoryCreate({ path: targetPresetDirectory, }); } sf.ui.proTools.appActivateMainWindow(); sf.ui.proTools.mainWindow.invalidate(); const tracks = sf.app.proTools.tracks.invalidate().allItems; const targetTracks = tracks.filter(t => !t.isHidden && t.isSelected); const targetTrackNames = targetTracks.map(t => t.name); targetTrackNames.forEach(name => { // Select the track sf.app.proTools.selectTracksByName({ trackNames: [name] }); sf.ui.proTools.trackGetByName({ name }).track.trackScrollToView(); storeTrackPreset({ name: name, categoryPath: [presetRootFolder, artistName], }); }); } storeTrackPresets({ artistName: "Bradley Denniston", presetRootFolder: "User Presets", trackPresetsDirectory: "~/Documents/Pro Tools/Track Presets", });
-