No internet connection
  1. Home
  2. Packages
  3. UAD to UADx Converter

UAD to UADX converter not working

Title

UAD to UADX converter not working

Content type

script

Content name

UAD to UADx Converter

Content package

UAD to UADx Converter

Version info

OS: macOS 26.2.0
SoundFlow: 6.0.9
Pro Tools: null

What do you expect to happen when you run the script?

convert.. but when it hit run it says app is not running in soundflow.. the soundflow app

Are you seeing an error?

UAD to UADX converter not running

What happens when you run the script?

How were you running this script?

I clicked the Run Script or Run Macro button in SoundFlow

How important is this issue to you?

5

Details

{
    "textExpected": "convert.. but when it hit run it says app is not running in soundflow.. the soundflow app\n",
    "textError": "UAD to UADX converter not running",
    "inputHowRun": "I clicked the Run Script or Run Macro button in SoundFlow",
    "inputImportance": 5,
    "textTitle": "UAD to UADX converter not working"
}

Source

//UAD Plugin Arrays
const uadXpluginLookupArray = [
    {
        uadPluginName: "UAD UA 1176 Rev A",
        presetPositionXPercentage: 0.10,
        presetPositionYPercentage: 0.97,
        uadXPluginName: "UADx 1176 Rev A Compressor",
        pastePositionXPercentage: 0.38,
        pastePositionYPercentage: 0.37,
    },
    {
        uadPluginName: "UAD UA 1176LN Rev E",
        presetPositionXPercentage: 0.10,
        presetPositionYPercentage: 0.97,
        uadXPluginName: "UADx 1176LN Rev E Compressor",
        pastePositionXPercentage: 0.38,
        pastePositionYPercentage: 0.37,
    },
    {
        uadPluginName: "UAD UA 1176AE",
        presetPositionXPercentage: 0.10,
        presetPositionYPercentage: 0.97,
        uadXPluginName: "UADx 1176AE Compressor",
        pastePositionXPercentage: 0.38,
        pastePositionYPercentage: 0.37,
    },
    {
        uadPluginName: "UAD API 2500",
        presetPositionXPercentage: 0.09,
        presetPositionYPercentage: 0.98,
        uadXPluginName: "UADx API 2500 Bus Compressor",
        pastePositionXPercentage: 0.35,
        pastePositionYPercentage: 0.20,
    },
    {
        uadPluginName: "UAD Brigade Chorus",
        presetPositionXPercentage: 0.15,
        presetPositionYPercentage: 0.98,
        uadXPluginName: "UADx Brigade Chorus",
        pastePositionXPercentage: 0.60,
        pastePositionYPercentage: 0.18,
    },
    {
        uadPluginName: "UAD Galaxy Tape Echo",
        presetPositionXPercentage: 0.12,
        presetPositionYPercentage: 0.98,
        uadXPluginName: "UADx Galaxy Tape Echo",
        pastePositionXPercentage: 0.47,
        pastePositionYPercentage: 0.22,
    },
    {
        uadPluginName: "UAD Lexicon 224",
        presetPositionXPercentage: 0.28,
        presetPositionYPercentage: 0.985,
        uadXPluginName: "UADx Lexicon 224 Digital Reverb",
        pastePositionXPercentage: 0.81,
        pastePositionYPercentage: 0.14,
    },
    {
        uadPluginName: "UAD Neve 1073",
        presetPositionXPercentage: 0.33,
        presetPositionYPercentage: 0.985,
        uadXPluginName: "UADx Neve 1073 Preamp and EQ",
        pastePositionXPercentage: 0.75,
        pastePositionYPercentage: 0.13,
    },
    {
        uadPluginName: "UAD Pultec EQP-1A",
        presetPositionXPercentage: 0.09,
        presetPositionYPercentage: 0.97,
        uadXPluginName: "UADx Pultec EQP-1A EQ",
        pastePositionXPercentage: 0.38,
        pastePositionYPercentage: 0.27,
    },
    {
        uadPluginName: "UAD Pultec HLF-3C",
        presetPositionXPercentage: 0.095,
        presetPositionYPercentage: 0.97,
        uadXPluginName: "UADx Pultec HLF-3C EQ",
        pastePositionXPercentage: 0.38,
        pastePositionYPercentage: 0.33,
    },
    {
        uadPluginName: "UAD Pultec MEQ-5",
        presetPositionXPercentage: 0.095,
        presetPositionYPercentage: 0.97,
        uadXPluginName: "UADx Pultec MEQ-5 EQ",
        pastePositionXPercentage: 0.38,
        pastePositionYPercentage: 0.33,
    },
    {
        uadPluginName: "UAD Pure Plate",
        presetPositionXPercentage: 0.25,
        presetPositionYPercentage: 0.985,
        uadXPluginName: "UADx Pure Plate Reverb",
        pastePositionXPercentage: 0.84,
        pastePositionYPercentage: 0.13,
    },
    {
        uadPluginName: "UAD Studio D Chorus",
        presetPositionXPercentage: 0.0985,
        presetPositionYPercentage: 0.97,
        uadXPluginName: "UADx Studio D Chorus",
        pastePositionXPercentage: 0.38,
        pastePositionYPercentage: 0.36,
    },
    {
        uadPluginName: "UAD Teletronix LA-2",
        presetPositionXPercentage: 0.0985,
        presetPositionYPercentage: 0.97,
        uadXPluginName: "UADx LA-2 Compressor",
        pastePositionXPercentage: 0.38,
        pastePositionYPercentage: 0.275,
    },
    {
        uadPluginName: "UAD Teletronix LA-2A Gray",
        presetPositionXPercentage: 0.0985,
        presetPositionYPercentage: 0.97,
        uadXPluginName: "UADx LA-2A Gray Compressor",
        pastePositionXPercentage: 0.38,
        pastePositionYPercentage: 0.275,
    },
    {
        uadPluginName: "UAD Teletronix LA-2A Silver",
        presetPositionXPercentage: 0.0985,
        presetPositionYPercentage: 0.97,
        uadXPluginName: "UADx LA-2A Silver Compressor",
        pastePositionXPercentage: 0.38,
        pastePositionYPercentage: 0.275,
    },
];

function saveSession() {
    sf.ui.proTools.menuClick({ menuPath: ['File', 'Save'] });
}

function ensureEditWindowIsFocused() {
    //ensure edit window is focused
    sf.ui.proTools.menuClick({ menuPath: ['Window', 'Edit'] });
}

function ensureTempoRulerIsVisible() {
    //ensure tempo ruler is visible
    sf.ui.proTools.menuClick({
        menuPath: ["View", "Rulers", "Tempo"],
        targetValue: "Enable",
    });
}

function hideAllFloatingWindows() {
    //Hide all floating windows
    sf.ui.proTools.menuClick({
        menuPath: ["Window", "Hide All Floating Windows"],
        targetValue: "Enable",
    });
}

/** @param {{ savePath: string, newSessionName: string }} args */
function saveAs({ savePath, newSessionName }) {

    sf.ui.proTools.menuClick({ menuPath: ['File', 'Save As...'] });

    // Save Window
    const saveWin = sf.ui.proTools.windows.whoseTitle.is("Save").first;
    const saveWinSheet = saveWin.sheets.first;

    saveWin.elementWaitFor();

    // Open the "Go to the folder" sheet
    sf.keyboard.press({ keys: 'slash' });
    saveWinSheet.elementWaitFor();

    const sheet = saveWin.sheets.first;

    if (sheet.comboBoxes.first.exists) {
        //Set preset name
        sheet.comboBoxes.first.value.value = savePath;
        //Click "Go"
        sheet.buttons.whoseTitle.is('Go').first.elementClick();

    } else {
        //Set presetPath
        sheet.textFields.first.value.value = savePath;
        sf.keyboard.press({ keys: 'return' });
    }

    //give the sheet extra buffer time to appear
    sf.wait({ intervalMs: 500 });

    // Set name of Save Copy In Session
    saveWin.textFields.first.elementSetTextFieldWithAreaValue({
        value: newSessionName
    });

    // Click 'Save' and wait for window to dissapear 
    saveWin.buttons.whoseTitle.is("Save").first.elementClick();
    saveWin.elementWaitFor({ waitType: 'Disappear' });

    sf.ui.proTools.waitForNoModals();
}

function saveAsUadx() {
    sf.ui.proTools.appActivateMainWindow();
    sf.ui.proTools.mainWindow.invalidate();

    const sessionPath = sf.ui.proTools.mainWindow.invalidate().sessionPath;
    const sessionParentPath = sessionPath.split("/").slice(0, -1).join("/");
    const sessionName = sessionPath.split("/").slice(-1)[0].split(".")[0];

    saveAs({
        savePath: function () {
            const savePath = `${sessionParentPath}`;

            if (!sf.file.directoryExists({ path: savePath }).exists) {
                sf.file.directoryCreate({ path: savePath });
            }
            return savePath;
        }(),
        //amend filename here
        newSessionName: `${sessionName}_UADx`,
    });
}

//Find all UAD<>UADx Compatiable Tracks
function findAllUadTracks() {
    /**
     * @param {array} plugNames
     * @param {boolean} includeInactive
     */
    function selectTrackskWithPlugName(plugNames, includeInactive) {
        sf.ui.proTools.trackDeselectAll();
        const visibleTrackNames = sf.ui.proTools.visibleTrackNames;
        let foundTracks = []
        //Loop visible tracks
        for (let i = 0; i < visibleTrackNames.length; i++) {
            const trackName = visibleTrackNames[i]

            const track = sf.ui.proTools.trackGetByName({ name: trackName }).track
            const muteBtn = track.buttons.whoseTitle.is("Mute").first
            if (!muteBtn.exists) continue;

            const isTrackInactive = muteBtn.value.value.startsWith('inactive')
            if (isTrackInactive && !includeInactive) continue;

            //Loop insert btns
            for (let i = 0; i < 9; i++) {

                const insertBtn = track.insertButtons[i]
                if (!insertBtn.exists) break;// exit insert loop
                const insertSelectorBtn = track.insertSelectorButtons[i]

                let isInactive
                //If u want to include inactive, isInactive = false so will never continue by this reason,
                //else, will only go to next step if active
                includeInactive ? isInactive = false : isInactive = insertSelectorBtn.value.invalidate().value === "inactive"

                if (isInactive) continue;

                const plugName = insertBtn.value.invalidate().value
                if (plugNames.includes(plugName)) {
                    foundTracks.push(track.normalizedTrackName)

                };

            };
        };
        if (foundTracks.length === 0) { alert(`No active UAD<>UADx Compatiable inserts or tracks found`); throw 0; }
        sf.ui.proTools.trackSelectByName({ names: foundTracks });
    };

    /**
     * @param {object} param
     * @param {string[]} param.plugNames
     * @param {boolean} [param.includeInactive]
     */
    function selectTracksWithPlug_in({ plugNames, includeInactive = false }) {

        sf.ui.proTools.invalidate();

        // Get disabled viwes
        const disabled = ["Inserts A-E", "Inserts F-J"].filter(view => !sf.ui.proTools.getMenuItem("View", "Edit Window Views", view).isMenuChecked);
        //Enable Disabled Views
        disabled.map(view => sf.ui.proTools.menuClick({ menuPath: ["View", "Edit Window Views", view], targetValue: "Enable" }));
        try {
            selectTrackskWithPlugName(plugNames, includeInactive)

        } catch (err) {
            throw err;
        } finally {

            // Return Views to original state
            disabled.map(view => sf.ui.proTools.menuClick({ menuPath: ["View", "Edit Window Views", view], targetValue: "Disable" }));
        }
    };

    selectTracksWithPlug_in({
        plugNames:
            ["UAD UA 1176 Rev A",
                "UAD UA 1176AE",
                "UAD UA 1176LN Rev E",
                "UAD API 2500",
                "UAD Brigade Chorus",
                "UAD Galaxy Tape Echo",
                "UAD Lexicon 224",
                "UAD Neve 1073",
                "UAD Pultec EQP-1A",
                "UAD Pultec HLF-3C",
                "UAD Pultec MEQ-5",
                "UAD Pure Plate",
                "UAD Studio D Chorus",
                "UAD Teletronix LA-2",
                "UAD Teletronix LA-2A Gray",
                "UAD Teletronix LA-2A Silver"]
    });
}


function loadFirstUadPlug() {

    function getInsertsInfo() {
        const insertInfo = Array(10).fill(0).map((_, index) => {

            const track = sf.ui.proTools.selectedTrack;

            const insertButton = track.invalidate().insertButtons[index];
            const insertButtonValue = insertButton.value.invalidate().value;

            const insertSelectorButton = track.invalidate().insertSelectorButtons[index]
            const insertSelectorButtonValue = insertSelectorButton.value.invalidate().value;

            return {
                insertButton,
                insertButtonValue,
                insertSelectorButton,
                insertSelectorButtonValue,
                insertIndex: index,
                pluginName: insertButtonValue,
                //isBypassed: insertSelectorButtonValue.includes('bypassed'),
                isActive: !insertSelectorButtonValue.includes('inactive'),
            };
        });

        return insertInfo;
    }

    //Get an array of usable UAD plugin names
    const usablePluginNames = uadXpluginLookupArray.map(item => item.uadPluginName);

    const insertsInfo = getInsertsInfo();

    //Filter to get all insert slots whose name includes any of the usablePluginNames
    const matchingInsertSlots = insertsInfo.filter(btn => {
        return usablePluginNames.some((name) => name === btn.pluginName) && btn.isActive === true;
    });

    sf.ui.proTools.appActivateMainWindow();

    //Loop through the matchingInsertSlots
    matchingInsertSlots.forEach(insert => {

        sf.ui.proTools.selectedTrack.trackInsertToggleShow({
            insertNumber: insert.insertIndex + 1,
        });

        convertUadToUadx();

    });

}

function convertUadToUadx() {
    //position plugin window so drop down menu has room to drop
    const targetWindowXPostion = sf.ui.proTools.mainWindow.buttons.whoseTitle.is("Add Tempo Change").first.frame.x;
    const targetWindowYPosition = sf.ui.proTools.mainWindow.gridNudgeCluster.frame.y;

    const pluginWindow = sf.ui.proTools.windows.whoseTitle.contains("Plug-in:").first;

    //get plugin bypass info - if bypass is active, then move on to the next instance
    const pluginBypassInfo = sf.ui.proTools.windows.whoseTitle.startsWith("Plug-in: UAD").first.buttons.whoseTitle.is("Effect Bypass").first.value.invalidate().value;

    if (pluginBypassInfo === "on") {
        return
    }

    function setWindowsizeAndPosition(settings) {
        const { window, x, y, screenIndex } = settings;
        let screenFrame = sf.ui.screens.allScreens[screenIndex].visibleFrame;

        window.windowMove({
            position: { x, y, }
        });
    }

    setWindowsizeAndPosition({
        window: pluginWindow,
        x: targetWindowXPostion,
        y: targetWindowYPosition,
        screenIndex: 0,
    });

    const targetPluginName = sf.ui.proTools.windows.first.popupButtons.whoseTitle.startsWith('Plug-In Selector').first.value.invalidate().value;

    const matchingPluginInfo = uadXpluginLookupArray.find(item => item.uadPluginName === targetPluginName);

    const pluginWindowFrame = pluginWindow.frame;

    const relativePresetButtonPosition = {
        x: pluginWindowFrame.x + pluginWindowFrame.w * matchingPluginInfo.presetPositionXPercentage,
        y: pluginWindowFrame.y + pluginWindowFrame.h * matchingPluginInfo.presetPositionYPercentage,
    }

    function copyUadSetting({ relativePresetButtonPosition }) {
        sf.mouse.setPosition({ position: relativePresetButtonPosition });

        sf.wait({ intervalMs: 200 });

        sf.mouse.click({ position: relativePresetButtonPosition, });

        sf.keyboard.press({
            keys: "down",
            repetitions: 3,
        });

        sf.keyboard.press({
            keys: "return",
        });

    }

    copyUadSetting({
        relativePresetButtonPosition
    });

    const pluginMenuItems = sf.ui.proTools.windows.first.popupButtons.whoseTitle.startsWith("Plug-In Selector").first.popupMenuFetchAllItems().menuItems;

    const menuPath = pluginMenuItems.find(mi => mi.element.isMenuChecked).path;

    //Get the width to add to the end of the plugin name.
    const pluginWidth = menuPath[2].match(/\(([^)]+)\)/)[0];

    //Find the matching object in the 
    const matchingPluginObject = uadXpluginLookupArray.find(plugin => {
        return plugin.uadPluginName === menuPath[2].split(" (")[0];
    });

    //Create the UADx pluing name
    const uadxName = `${matchingPluginObject.uadXPluginName} ${pluginWidth}`;

    //This is the path to the UADx plugin
    const uadXPluginPath = [
        menuPath[0],
        menuPath[1],
        uadxName
    ];

    sf.ui.proTools.appActivateMainWindow();

    const relativePasteButtonPosition = {
        x: pluginWindowFrame.x + pluginWindowFrame.w * matchingPluginInfo.pastePositionXPercentage,
        y: pluginWindowFrame.y + pluginWindowFrame.h * matchingPluginInfo.pastePositionYPercentage
    }

    function pasteUadx() {
        //wait for plugin to appear
        sf.ui.proTools.windows.whoseTitle.contains("Plug-in: UADx").first.elementWaitFor({
            waitType: "Appear",
        });

        sf.mouse.click({
            position: relativePasteButtonPosition,
        });
    }

    function unlinkedMultiMono() {
        /////MULTI MONO STUFF/////
        const masterLinkUad = sf.ui.proTools.windows.whoseTitle.contains("Plug-in: UAD").first.buttons.whoseTitle.is("Master Link button");
        const targetInsertSlot = sf.ui.proTools.windows.whoseTitle.contains("Plug-in: UAD").first.popupButtons.allItems[4].value.invalidate().value;

        const linkStatus = masterLinkUad.first.value.invalidate().value;

        const pluginWin = sf.ui.proTools.windows.whoseTitle.contains("Plug-in:").first;

        //open multimono plugin instance
        function convertMultiMonoUadToUadx() {
            pluginWin.popupButtons.allItems[5].popupMenuSelect({
                menuPath: uadXPluginPath,
            });
        }

        //duplicate current track
        function duplicateTrack() {

            sf.ui.proTools.menuClick({
                menuPath: ["Track", "Duplicate..."],
            });

            //Wait for Dialog
            sf.ui.proTools.duplicateTracksDialog

            //duplicate settings
            sf.ui.proTools.trackDuplicateSelected({
                duplicateActivePlaylist: false,
                duplicateAlternatePlaylists: false,
                duplicateAutomation: false,
                duplicateGroupAssignments: false,
                duplicateInserts: true,
                duplicateSends: false,
                insertAfterLastSelectedTrack: true,
                numberOfDuplicates: 1
            })

            //Wait for dlg to disappear
            sf.ui.proTools.duplicateTracksDialog.elementWaitFor({
                waitType: "Disappear",
            });

            const isThereAnAlertWindow = sf.ui.proTools.windows.whoseDescription.is("alert").first.elementWaitFor({
                timeout: 1000,
                onError: "Continue",
            }).success

            if (isThereAnAlertWindow) {
                sf.wait({ intervalMs: 200 });
                sf.ui.proTools.windows.whoseDescription.is("alert").first.getElement("AXDefaultButton").elementClick();
            }

            //wait for main window become active
            sf.wait({ intervalMs: 200 });

        }

        function openTargetInsertSlot() {
            var currentInsertSlot = sf.ui.proTools.windows.whoseTitle.startsWith("Plug-in: UAD").first.popupButtons.allItems[4].value.invalidate().value;

            const insertSlotsByLetter = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"];
            var letter = currentInsertSlot;
            var insertByNumber = insertSlotsByLetter.indexOf(letter) + 1;

            sf.ui.proTools.selectedTrack.trackInsertToggleShow({
                insertNumber: insertByNumber,
                targetValue: "Enable",
                waitForInsertWindow: true,
            });
        }

        //L or R channel focused
        //copy left channel
        function focusLeftChannel() {
            if (pluginWin.popupButtons.allItems[3].value.invalidate().value !== "L") {
                pluginWin.popupButtons.allItems[3].popupMenuSelect({
                    menuPath: ["Left"],
                });
            }
        }

        //copy right channel
        function focusRightChannel() {
            if (pluginWin.popupButtons.allItems[3].value.invalidate().value !== "R") {
                pluginWin.popupButtons.allItems[3].popupMenuSelect({
                    menuPath: ["Right"],
                });
            }
        }

        function selectTrackAbove() {
            sf.ui.proTools.menuClick({
                menuPath: ["Edit", "Selection", "Extend Edit Up"],
            });

            sf.ui.proTools.menuClick({
                menuPath: ["Edit", "Selection", "Remove Edit from Bottom"],
            });
        }

        function selectTrackBelow() {
            sf.ui.proTools.menuClick({
                menuPath: ["Edit", "Selection", "Extend Edit Down"],
            });

            sf.ui.proTools.menuClick({
                menuPath: ["Edit", "Selection", "Remove Edit from Top"],
            });
        }

        function deleteSelectedTrack() {
            if (sf.ui.proTools.getMenuItem('Track', 'Delete...').exists) {
                sf.ui.proTools.getMenuItem('Track', 'Delete...').elementClick();
                sf.ui.proTools.confirmationDialog.invalidate().elementWaitFor();
                sf.ui.proTools.confirmationDialog.buttons.whoseTitle.is('Delete').first.elementClick();
            } else if (sf.ui.proTools.getMenuItem('Track', 'Delete').exists) {
                sf.ui.proTools.getMenuItem('Track', 'Delete').elementClick();
            }
        }

        focusLeftChannel();

        duplicateTrack();

        openTargetInsertSlot();

        focusLeftChannel();

        copyUadSetting({
            relativePresetButtonPosition
        });

        selectTrackAbove();

        openTargetInsertSlot();

        //launch UADx multimono instance
        sf.ui.proTools.windows.whoseTitle.startsWith("Plug-in:").first.popupButtons.allItems[5].popupMenuSelect({
            menuPath: uadXPluginPath,
        });

        sf.ui.proTools.windows.whoseTitle.contains("Plug-in:").first.buttons.whoseTitle.is("Master Link button").first.invalidate();

        sf.ui.proTools.windows.whoseTitle.contains("Plug-in:").first.buttons.whoseTitle.is("Master Link button").first.elementClick();

        pasteUadx();

        selectTrackBelow();

        openTargetInsertSlot();

        focusRightChannel();

        copyUadSetting({
            relativePresetButtonPosition
        });

        selectTrackAbove();

        openTargetInsertSlot();

        focusRightChannel();

        pasteUadx();

        //store originally selected track name
        const selectedTracks = sf.ui.proTools.selectedTrackNames

        selectTrackBelow();

        deleteSelectedTrack();

        // select original track name
        sf.ui.proTools.trackSelectByName({ names: selectedTracks })

    }

    //load UADx Version
    if (menuPath[0] === "multi-mono plug-in" && sf.ui.proTools.windows.whoseTitle.contains("Plug-in: UAD").first.buttons.whoseTitle.is("Master Link button").first.value.invalidate().value === "") {
        //selects multi-mono instance unlinked
        unlinkedMultiMono();
    } else if (menuPath[0] === "multi-mono plug-in") {
        //selects multi-mono instance
        sf.ui.proTools.windows.whoseTitle.startsWith("Plug-in:").first.popupButtons.allItems[5].popupMenuSelect({
            menuPath: uadXPluginPath,
        });
        pasteUadx();
    } else {
        //selects multichannel or individual instance
        sf.ui.proTools.windows.whoseTitle.startsWith("Plug-in:").first.popupButtons.allItems[4].popupMenuSelect({
            menuPath: uadXPluginPath,
        });
        pasteUadx();
    }

    //Close plugin window
    sf.ui.proTools.menuClick({
        menuPath: ["Window", "Hide All Floating Windows"],
        targetValue: "Enable",
    });

}

//MAIN FUNCTION
function main() {
    sf.ui.proTools.appActivateMainWindow();
    sf.ui.proTools.mainWindow.invalidate();

    var conversionType = sf.interaction.displayDialog({
        buttons: ["Single Instance", "Whole Track", "Entire Session"],
        prompt: "What UAD to UADx conversion type do you want?",
        title: "Tristan Hoogland's UAD to UADx Converter",
    }).button;

    if (conversionType === "Single Instance") {
        convertSingleInstance();
    } else if (conversionType === "Whole Track") {
        convertWholeTrack();
    } else if (conversionType === "Entire Session") {
        convertEntireSession();
    }

    function convertSingleInstance() {
        ensureEditWindowIsFocused();

        ensureTempoRulerIsVisible();

        //get open plugin focused
        function focusOpenPlugin() {
            var frontPluginWin = sf.ui.proTools.getFloatingWindowWithTitleStartingWith("Plug-in: UAD").invalidate();
            var pluginTrack = frontPluginWin.popupButtons.whoseTitle.is("Track Selector").first.value.invalidate().value

            sf.ui.proTools.trackSelectByName({ names: [pluginTrack] });
        }

        try {

            focusOpenPlugin();

            convertUadToUadx();

        } catch (error) {
            var selectPlugin = sf.interaction.displayDialog({
                buttons: ["OK", "Cancel"],
                cancelButton: "Cancel",
                prompt: "Please launch a compatiable UAD<>UADx insert then press OK to proceed.",
                title: "Tristan Hoogland's UAD to UADx Converter",
            }).button;
            if (selectPlugin === "OK") {
                convertSingleInstance();
            }
        }
    }

    function convertWholeTrack() {
        ensureEditWindowIsFocused();

        hideAllFloatingWindows();

        ensureTempoRulerIsVisible();

        function doForAllSelectedTracks(action) {
            var originallySelectedTrackNames = sf.ui.proTools.selectedTrackNames;

            try {
                sf.ui.proTools.selectedTrackHeaders.forEach(track => {
                    track.trackSelect();
                    action(track);
                });
            }
            finally {
                sf.ui.proTools.trackSelectByName({ names: originallySelectedTrackNames });
            }
        }

        /**@param {AxPtTrackHeader} track */
        function trackFunc(track) {

            loadFirstUadPlug();

        }

        doForAllSelectedTracks(trackFunc);
    }

    function convertEntireSession() {
        sf.interaction.displayDialog({
            buttons: ["Yes", "Cancel"],
            cancelButton: "Cancel",
            defaultButton: "Yes",
            prompt: "You are about to find and replace ALL active instances of UAD with UADx compatiable plugins. This may take some time." + ("\n") + ("\n") + "Are you sure you want to continue?",
            title: "Tristan Hoogland's UAD to UADx Converter",
        }).button;

        ensureEditWindowIsFocused();

        //save current version before proceeding
        saveSession();

        saveAsUadx();

        hideAllFloatingWindows();

        ensureTempoRulerIsVisible();

        findAllUadTracks();

        function doForAllSelectedTracks(action) {
            var originallySelectedTrackNames = sf.ui.proTools.selectedTrackNames;

            try {
                sf.ui.proTools.selectedTrackHeaders.forEach(track => {
                    track.trackSelect();
                    action(track);
                });
            }
            finally {
                sf.ui.proTools.trackSelectByName({ names: originallySelectedTrackNames });
            }
        }

        /**@param {AxPtTrackHeader} track */
        function trackFunc(track) {

            loadFirstUadPlug();

        }

        doForAllSelectedTracks(trackFunc);

        //finally deselect all tracks
        sf.ui.proTools.trackDeselectAll();

        // log("UAD to UADx conversion complete!");

        saveSession();

        var reopenSession = sf.interaction.displayDialog({
            buttons: ["Yes", "No"],
            cancelButton: "No",
            defaultButton: "No",
            prompt: "UAD to UADx conversion complete!" + ("\n") + ("\n") + "Would you like to close and reopen the session?",
            title: "Tristan Hoogland's UAD to UADx Converter",
        }).button;

        if (reopenSession === "Yes") {
            sf.ui.proTools.menuClick({
                menuPath: ["File", "Close Session"],
            });

            if (sf.ui.proTools.confirmationDialog.exists) {
                sf.ui.proTools.confirmationDialog.elementWaitFor();
                sf.ui.proTools.confirmationDialog.buttons.whoseTitle.is("Save").first.elementClick();
                sf.ui.proTools.confirmationDialog.elementWaitFor({ waitType: "Disappear" });
            }

            //open most recent session
            sf.keyboard.press({
                keys: "cmd+shift+o",
            });
        }
    }

    sf.interaction.displayDialog({
        prompt: "UAD to UADx Conversion complete!"
    })

}

main();

Links

User UID: vJpolCkKEqVNlE3Na2RPrn26YVR2

Feedback Key: sffeedback:vJpolCkKEqVNlE3Na2RPrn26YVR2:-OjxUmtiC3xUBAVFnJCp

Feedback ZIP: Ah3EnJCVwwKGjzHDaBFdETwFvQGe//eJ0YCeOnDjBMelcPkYZ4qXkJHeiPs51RsDNIlFDkRFAEA++P4FqHEg9qzhmbPcYqUKKY00uMzGhWiXrqOuVUEd4FZ/7otD5R5s/34VreCbORFAYlgTrsZl18/t56lzyCjOmIfsYnCL4ot4ilcTykpOyTthRcYKRtpYng34S+SnMvrGqXPrYjycYE4CbXuxztgAjD+I9WzMv3OPW0aaZ39TFImDmnoVQrCMgwlinZGtPIKiDSdD90VGxA7ExUbXVFUsJFiH6sMI1gf39yu4rLOLg6AX/wZrl/Zc69ZUSFhraLZ17KM/0Ra/Fs+b3yy7Leqls/UX5lNW4Is=

  • 4 replies
  1. Chad Wahlbrink @Chad2026-01-28 16:00:56.434Z

    Hi there,

    I believe this script is from the UAD to UADx Converter by @Tristan. Feel free to ask any questions related to this package in the package forum for this package here:

    You can get to a Package's forum by selecting the package in your package list and then clicking the "Package Forum" Button

    1. Chad Wahlbrink @Chad2026-01-28 16:17:24.017Z

      Note that the error you were seeing indicates that Pro Tools may not have been running when you tried to run this script.

      This script converts UAD Plug-ins on a selected track to their equivalent UADx versions. Currently, not all available UADx plugins are supported by this script, and it could use a bit of updating for the latest versions of Pro Tools (instances of "Plug-in" need to be changed to "Plugin" in PT 2024.10+).

      Still, the concept of this script is great, and if you are savvy with code, you could update it yourself via the "Make Editable Copy" button for the script:

      1. T
        Tristan Hoogland @Tristan
          2026-01-28 20:32:41.367Z

          Hey! I get a lot of requests to update this script, it's been on the to do list for months, but I've been absolutely slammed with work non stop for the past 12 months. Can't promise I'll fix it asap unfortunately, but when work next quietens down I'll be sure to update all my scripts (there are manyyyy)

          1. Chad Wahlbrink @Chad2026-01-28 20:34:08.474Z

            No worries, @Tristan!