SCRIPT SHARING - Revoice Pro 4.3 Quick Doubler Script
Hi everyone,
First of all, thank you to this great community, which has been of a great help in my humble attemps to build macros and scripts!
Here's one I use A LOT and I'm sure will be usefull to others. It uses @Andrew_Scheps ' "move tracks to new routing folder" script and is also wildly inspired by @Chris_Shaw 's "Pro Tools Utility" package.
Might not be the most elegant as I'm fairly new to this, but it works :)
It takes selected audio on a track, creates a double using Revoice Pro 4.3 Quick Doubler AudioSuite, then routes both track to a new routing folder, and assigns the folder exactly as the original track was, while clearing assignments from the original track. The last part is a bit "bold", as I get rid of the original track's groups assignment by duplicating it, which would leave it's playlists (should it have any) with an abnoxious .dup1 at the end of the name. I'm still trying to figure out a better way!
It's completely automatic except for the audio to select.
There you go! Enjoy!
There are two blocks of "quoted" script below.
The first one is a setup script that you will have to run only once. The second one is the doubler script!
var folderPath = "~/Documents/Pro Tools/Track Presets";
var folderName = "Soundflow Revoice Doubler";
var clearPreset = "CLEARInsSndGrp"
var storePreset = "STOREInsSndGrp"
function dismissConfirmationDialog(btn) {
if (sf.ui.proTools.confirmationDialog.invalidate().buttons.whoseTitle.is(btn).first.exists) {
sf.ui.proTools.confirmationDialog.buttons.whoseTitle.is(btn).first.elementClick();
}
};
///////////////////////////////////
//CREATE FOLDER FOR TRACK PRESETS//
//////////////////////////////////
//Make finder active
sf.ui.finder.appActivate();
//Open go to folder dialog
sf.keyboard.press({
keys: "cmd+shift+g, cmd+shift+g",
});
//Enter path
sf.keyboard.type({
text: folderPath,
});
//Confirm
sf.keyboard.press ({
keys: "return",
fast: true,
});
sf.wait({
intervalMs: 1000,
});
//Create new folder
sf.ui.finder.menuClick({
menuPath: ["File","New Folder"],
});
sf.wait({
intervalMs: 1000,
});
//Fiddle with the new folder so finder refreshes
sf.keyboard.press({
keys: "right, alt+shift+left, alt+shift+left, alt+shift+left, alt+shift+left",
});
//Name new folder
sf.keyboard.type({
text: folderName,
});
//Confirm
sf.keyboard.press ({
keys: "return"
});
sf.wait({
intervalMs: 250,
});
//Go back to Pro Tools
sf.ui.proTools.appActivateMainWindow();
sf.wait({
intervalMs: 1000,
});
sf.interaction.displayDialog({
hiddenAnswer: true,
title: "",
prompt: "The script will now create an audio track that will be erased at the end of the process",
giveUpAfterSeconds: 1,
});
/////////////////////////////////////////////////
//CREATE NEW BLANK TRACK AND SAVE PRESETS 1 & 2//
/////////////////////////////////////////////////
//Deselect all tracks and select first track in session
sf.ui.proTools.trackDeselectAll();
sf.keyboard.press({
keys: "home, semicolon",
fast: true,
});
//Create new track, without any insert, sends or groups
sf.keyboard.press({
keys: "cmd+shift+n, cmd+right, tab, shift+t, shift+e, shift+m, shift+p, return",
fast: true,
});
sf.wait({
intervalMs: 1500,
});
//Open "Save Track Preset" Dialog
sf.keyboard.press({
keys: "alt+shift+p",
});
//Open "Track Data to Recall..." = CMD + R when in the Save Track Preset Dialog
sf.keyboard.press({
keys: "cmd+r",
});
//Click "Track Data to Recall preset" popup menu and choose "<factory default>" for a clean starting point
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.children.whoseRole.is("AXMenuButton").whoseTitle.is("Librarian menu").first.popupMenuSelect({
menuPath: ["<factory default>"],
});
//Uncheck all the boxes
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.mouseClickElement({
relativePosition: {"x":25,"y":98},
isOption: true,
});
sf.wait({
intervalMs: 500,
});
//Setup up "Track Data to Recall..." to recall Sends and their settings, Plug-ins and their settings, Mix/Edit groups
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Send Volume Automation and Setting").first.elementClick();
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Send Pan Automation and Setting").first.elementClick();
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Send Mute Automation and Setting").first.elementClick();
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Send Output Assignments").first.elementClick();
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Plug-in Assignments").first.elementClick();
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Plug-in Settings and Automation").first.elementClick();
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Mix / Edit Groups").first.elementClick();
//Confirm and go back to "New track preset dialog"
sf.keyboard.press({
keys: "return"
});
//Click text field
sf.ui.proTools.windows.whoseTitle.is("Save Track Preset ").first.textFields.first.elementClick();
//Choose category
sf.ui.proTools.windows.whoseTitle.is("Save Track Preset ").first.popupButtons.first.popupMenuSelect({
menuPath: ["Soundflow Revoice Doubler"],
});
//Name preset clearPreset
sf.keyboard.type({
text: clearPreset,
});
sf.wait({
intervalMs: 1500,
});
//Confirm
sf.keyboard.press({
keys: "return, return"
});
dismissConfirmationDialog("Replace");
sf.wait({
intervalMs: 1500,
});
//Open "Save Track Preset" Dialog
sf.keyboard.press({
keys: "alt+shift+p",
});
//Open "Track Data to Recall..." = CMD + R when in the Save Track Preset Dialog
sf.keyboard.press({
keys: "cmd+r",
});
//Click "Track Data to Recall preset" popup menu and choose "<factory default>" for a clean starting point
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.children.whoseRole.is("AXMenuButton").whoseTitle.is("Librarian menu").first.popupMenuSelect({
menuPath: ["<factory default>"],
});
//Uncheck all the boxes
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.mouseClickElement({
relativePosition: {"x":25,"y":98},
isOption: true,
});
sf.wait({
intervalMs: 500,
});
//Setup up "Track Data to Recall..." to recall Sends and their settings, Plug-ins and their settings, Mix/Edit groups
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Send Volume Automation and Setting").first.elementClick();
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Send Pan Automation and Setting").first.elementClick();
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Send Mute Automation and Setting").first.elementClick();
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Send Output Assignments").first.elementClick();
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Plug-in Assignments").first.elementClick();
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Plug-in Settings and Automation").first.elementClick();
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.groups.whoseTitle.is("Track Data").first.checkBoxes.whoseTitle.is("Mix / Edit Groups").first.elementClick();
//Confirm and go back to "New track preset dialog"
sf.keyboard.press({
keys: "return"
});
//Click text field
sf.ui.proTools.windows.whoseTitle.is("Save Track Preset ").first.textFields.first.elementClick();
//Choose category
sf.ui.proTools.windows.whoseTitle.is("Save Track Preset ").first.popupButtons.first.popupMenuSelect({
menuPath: ["Soundflow Revoice Doubler"],
});
//Name preset clearPreset
sf.keyboard.type({
text: storePreset,
});
sf.wait({
intervalMs: 1500,
});
//Confirm
sf.keyboard.press({
keys: "return, return"
});
dismissConfirmationDialog("Replace");
sf.ui.proTools.trackSelectByName({
names: ["TEMP"],
});
sf.ui.proTools.trackDelete();
sf.interaction.displayDialog({
hiddenAnswer: true,
title: "",
prompt: "Presets are ready!",
giveUpAfterSeconds: 2,
});
Here is the script for the Doubler!
//Declare function "Dismiss Confirmation Dialog"
function dismissConfirmationDialog(btn) {
if (sf.ui.proTools.confirmationDialog.invalidate().buttons.whoseTitle.is(btn).first.exists) {
sf.ui.proTools.confirmationDialog.buttons.whoseTitle.is(btn).first.elementClick();
}
};
///////////////////
////MAIN SCRIPT////
///////////////////
//Display script condition dialog
sf.interaction.displayDialog({
title: "Create double and route to new Routing Folder",
prompt: "Please make sure that Revoice Pro 4 is runnin and that some audio is selected then press OK",
giveUpAfterSeconds: 3,
});
//Get original track name from comments
sf.ui.proTools.selectedTrack.trackOpenRenameDialog();
sf.keyboard.press({
keys: "tab, cmd+c, return",
});
//Store the name of the original track from the clipboard to a variable
var originalTrackName = sf.clipboard.getText().text;
//Set the name of the Double Track
var doubleTrackName = originalTrackName + " DBL" //<----- Enter prefix or suffix by adding "prefix" + or + "suffix"
//Set the name of the folder
var folderName = originalTrackName + " LR" //<----- Enter prefix or suffix by adding "prefix" + or + "suffix"
//Close all floating windows
sf.ui.proTools.viewCloseFloatingWindows();
/////////////////////////////////////////////////////////////////////////////////////////////////////
//////Store original track's Send, Insert and Group assignments in Track Preset named "InsSndGrp"////
/////////////////////////////////////////////////////////////////////////////////////////////////////
//Open "Save Track Preset" Dialog
sf.keyboard.press({
keys: "alt+shift+p",
});
//Open "Track Data to Recall..." = CMD + R when in the Save Track Preset Dialog
sf.keyboard.press({
keys: "cmd+r",
});
//Click "Track Data to Recall preset" popup menu and choose "InsSndGrp" preset
sf.ui.proTools.windows.whoseTitle.is("Track Data to Recall").first.children.whoseRole.is("AXMenuButton").whoseTitle.is("Librarian menu").first.popupMenuSelect({
menuPath: ["Soundflow Revoice Doubler"],
});
//Wait
sf.wait({
intervalMs: 250,
});
//Confirm
sf.keyboard.press({
keys: "return, return",
});
//Wait
sf.wait({
intervalMs: 500,
});
//Set where the preset will be saved
sf.ui.proTools.windows.whoseTitle.is("Save Track Preset ").first.popupButtons.first.popupMenuSelect({
menuPath: ["Soundflow Revoice Doubler"],
});
//Select current preset name
sf.keyboard.press({
keys: "cmd+a, backspace",
});
//Type in Track Preset name
sf.keyboard.press({
keys: "shift+s, shift+t, shift+o, shift+r, shift+e, shift+i, n, s, shift+s, n, d, shift+g, r, p",
fast: true,
});
//Wait
sf.wait({
intervalMs: 500,
});
//Confirm
sf.keyboard.press({
keys: "return, return",
});
//Wait for over-write dialog to appear
sf.ui.proTools.confirmationDialog.elementWaitFor({
waitType: "Appear",
});
//Dismiss over-write dialog
dismissConfirmationDialog("Replace")
//Wait for confirmationDialog to disapear
sf.ui.proTools.confirmationDialog.elementWaitFor({
waitType: "Disappear",
});
//////////////////////////////////////////////
///////CREATE DOUBLE ON DUPLICATE TRACK///////
//////////////////////////////////////////////
//Open Revoice Pro Quick Doubler Audiosuite
sf.ui.proTools.audioSuiteOpenPlugin({
category: "Other",
name: "Revoice Pro Quick Doubler",
});
//Click analyze on audiosuite window
sf.ui.proTools.firstAudioSuiteWindow.mouseClickElement({
relativePosition: {"x":395,"y":205},
});
//Wait for analyze to be done
sf.ui.proTools.getAudioSuiteWindow('Revoice Pro Quick Doubler').audioSuiteRender();
//Duplicate orignal track
sf.ui.proTools.trackDuplicateSelected({
duplicateActivePlaylist: false,
duplicateAlternatePlaylists: false,
duplicateAutomation: false,
duplicateInserts: false,
duplicateSends: false,
duplicateGroupAssignments: false,
});
//Click Render on Audiosuite window
sf.ui.proTools.firstAudioSuiteWindow.mouseClickElement({
relativePosition: {"x":395,"y":255},
});
//Wait for render to be done
sf.ui.proTools.getAudioSuiteWindow('Revoice Pro Quick Doubler').audioSuiteRender();
//Close all floating windows
sf.ui.proTools.viewCloseFloatingWindows();
//Rename DBL track, clear comments and write name into comments
sf.ui.proTools.selectedTrack.trackOpenRenameDialog();
sf.keyboard.type({
text: doubleTrackName,
});
sf.keyboard.press({
keys: "tab, cmd+a",
});
sf.keyboard.type({
text: doubleTrackName,
});
//Confirm name
sf.keyboard.press({
keys: "return",
});
//Wait for rename track window to be closed
sf.ui.proTools.children.whoseRole.is("AXWindow").first.buttons.whoseTitle.is("OK").first.elementWaitFor({
waitType: "Disappear",
});
//Set original track pan to -100
sf.ui.proTools.trackSelectByName({ deselectOthers: true, names: [originalTrackName] });
sf.ui.proTools.selectedTrack.trackOutputToggleShow();
sf.ui.proTools.mainTrackOutputWindow.textFields.whoseTitle.is('Front Pan Numerical').first.elementClick();
sf.keyboard.type({
text: "-100",
});
sf.keyboard.press({
keys: "return",
});
//Set double track pan to 100
sf.ui.proTools.trackSelectByName({ deselectOthers: true, names: [doubleTrackName] });
sf.ui.proTools.selectedTrack.trackOutputToggleShow();
sf.ui.proTools.mainTrackOutputWindow.textFields.whoseTitle.is('Front Pan Numerical').first.elementClick();
sf.keyboard.type({
text: "100",
});
sf.keyboard.press({
keys: "return",
});
//Wait
sf.wait({
intervalMs: 500,
});
//Select Original Track
sf.ui.proTools.trackSelectByName({ deselectOthers: true, names: [originalTrackName] });
//Close all floating windows
sf.ui.proTools.viewCloseFloatingWindows();
//Reselect original track + dbl
sf.keyboard.press({
keys: "shift+semicolon",
});
////////////////////////////////////////////////////////////////
////ROUTE ORIGINAL TRACKS AND DOUBLE TO NEW ROUTING FOLDER//////
////////////////BY ANDREW SCHEPS///////////////////////////////
//////////////////////////////////////////////////////////////
// Set up variables to hold original assignments. NOTE this will only check the top-most selected track
//Variable to store the current output assignment
var originalOutput = sf.ui.proTools.selectedTrack.outputPathButton.value.invalidate().value;
sf.ui.proTools.appActivateMainWindow();
// Refresh PTs track list
sf.ui.proTools.mainWindow.invalidate();
// Open Move to New Folder dialog and set parameters
sf.ui.proTools.menuClick({
menuPath: ["Track", "Move to New Folder..."],
});
//Wait for the 'Move to New Folder' dialog to appear and assign it to the folderDlg variable
var folderDlg = sf.ui.proTools.dialogWaitForManual({
dialogTitle: 'Move To New Folder'
}).dialog;
//Get the Children of the Move to New Folder dialog, filter them so we only get the popup buttons,
var popupButtons = folderDlg.getElements("AXChildren").filter(function (e) { return e.fullRole == "AXPopUpButton" });
//Assign the buttons coming out of the previous instruction to individual variables
var folderType = popupButtons[0];
if (folderType.value.value != 'Routing Folder')
folderType.popupMenuSelect({ menuPath: ['Routing Folder'] });
//Now that it's definitely a routing folder we have the other two popup menus available to assign to variables
var folderWidth = sf.ui.proTools.windows.whoseTitle.is('Move To New Folder').first.popupButtons.allItems[2];
var timeBase = sf.ui.proTools.windows.whoseTitle.is('Move To New Folder').first.popupButtons.allItems[1];
// Set them accordingly
if (folderWidth.value.value != 'Stereo')
folderWidth.popupMenuSelect({ menuPath: ['Stereo'] });
if (timeBase.value.value != 'Samples')
timeBase.popupMenuSelect({ menuPath: ['Samples'] });
sf.ui.proTools.windows.whoseTitle.is('Move to New Folder').first.checkBoxes.whoseTitle.is('Route Tracks to New Folder').first.checkboxSet({
targetValue: "Enable",
});
sf.ui.proTools.windows.whoseTitle.is('Move To New Folder').first.textFields.whoseTitle.is('Track name').first.elementSetTextFieldWithAreaValue({
value: folderName,
});
// Make it so
sf.ui.proTools.windows.whoseTitle.is('Move To New Folder').first.buttons.whoseTitle.is('Create').first.elementClick();
sf.ui.proTools.windows.whoseTitle.is('Move To New Folder').first.elementWaitFor({
waitType: "Disappear",
timeout: 2000,
});
// Refresh PTs track list
sf.ui.proTools.mainWindow.invalidate();
//Reselect the new folder
sf.ui.proTools.trackSelectByName({ deselectOthers: true, names: [folderName] });
// Folder will automatically be assigned to the session's default output
// If the source track's output was different assign it to the original output
if (originalOutput !== "MAIN") {
sf.ui.proTools.selectedTrack.trackOutputSelect({
outputSelector: items => items.filter(item => item.path.slice(-1)[0].includes(originalOutput))[0],
selectForAllSelectedTracks: true,
});
}
//Wait
sf.wait({
intervalMs: 500,
});
//Copy new folder name to comments
sf.ui.proTools.selectedTrack.trackOpenRenameDialog();
sf.keyboard.press({
keys: "cmd+c, tab, cmd+v, return",
});
//Color new folder <-------- According to your template
sf.ui.proTools.colorsSelect({
colorType: "Color",
colorBrightness: "Medium",
colorNumber: 12,
});
//Wait
sf.wait({
intervalMs: 2000,
});
//Scroll selected tracks into view to avoid fails when loading track preset
sf.ui.proTools.selectedTrack.titleButton.popupMenuSelect({
isRightClick: true,
menuPath: ["Scroll Into View"],
});
//Apply orignal track's data to newly created folder
//Calling command "Recall Track Preset on Selected Track" from package "Pro Tools Utilities" (installed from user/pkg/version "srAasovvDiQacRZ2mcId4RrOA8R2/ck1w23x1o0000ef10gotnvo1z/cko4vno0300016y10lm312ray")
sf.soundflow.runCommand({
commandId: 'user:ckpcjd5io00018t1042p6loif:ckfs5niws0007v110s447k1ac',
props: {
trackPresetPath: ["Soundflow Revoice Doubler","STOREInsSndGrp"],
}
});
//Wait
sf.wait({
intervalMs: 1000,
});
//Go back to original track & extend selection to double track
sf.ui.proTools.trackSelectByName({ deselectOthers: true, names: [originalTrackName] });
sf.keyboard.press({
keys: "shift+semicolon",
});
//Wait
sf.wait({
intervalMs: 1000,
});
//Clear insert and sends from original track and double
//Calling command "Recall Track Preset on Selected Track" from package "Pro Tools Utilities" (installed from user/pkg/version "srAasovvDiQacRZ2mcId4RrOA8R2/ck1w23x1o0000ef10gotnvo1z/cko4vno0300016y10lm312ray")
sf.soundflow.runCommand({
commandId: 'user:ckpcjd5io00018t1042p6loif:ckfs5niws0007v110s447k1ac',
props: {
trackPresetPath: ["Soundflow Revoice Doubler","CLEARInsSndGrp"],
}
});
//Wait
sf.wait({
intervalMs: 1000,
});
//Select Original track & open rename track dialog
sf.ui.proTools.trackSelectByName({ deselectOthers: true, names: [originalTrackName] });
sf.ui.proTools.selectedTrack.trackOpenRenameDialog();
//Add bullshit suffix & confirm
sf.keyboard.type({
text: originalTrackName + "xx",
});
sf.keyboard.press({
keys: "return",
});
//Duplicate orignal track again
sf.ui.proTools.trackDuplicateSelected({
duplicateActivePlaylist: true,
duplicateAlternatePlaylists: true,
duplicateAutomation: false,
duplicateInserts: false,
duplicateSends: false,
duplicateGroupAssignments: false,
});
//Rename Duplicate
sf.ui.proTools.selectedTrack.trackOpenRenameDialog();
//Paste original track name & confirm
sf.keyboard.type({
text: originalTrackName,
});
sf.keyboard.press({
keys: "return, return",
});
//Wait for rename track window to be closed
sf.ui.proTools.children.whoseRole.is("AXWindow").first.buttons.whoseTitle.is("OK").first.elementWaitFor({
waitType: "Disappear",
});
//Go back to original track with suffix & delete it
sf.ui.proTools.trackSelectByName({ deselectOthers: true, names: [originalTrackName + "xx"] });
sf.ui.proTools.trackDelete();
//Wait for delete warning to appear
sf.ui.proTools.windows.first.elementWaitFor();
//Dismiss "There are audio clips on this track"
dismissConfirmationDialog("Delete");
- TThomas Gloor @Thomas_Gloor
Script updated to be more efficient.
I also added a setup script that has to be run once!