Revoice Pro APT script
Hi!
Id love to be able to make a script or macro that easily analyzes the area i have selected and uses revoice pro apt to time align, for example, the background vocals. Here is my usual workflow:
- open the revoice pro standalone application to a new session
- go to audiosuite > synchro arts > revoice pro apt
- select the area i want to analyze as the "capture guide"
- hit the capture button
- select the area i want to analyze as the "capture dub"
- hit the capture dub button
- hit the spot button
After that i would then move on to the next area i want to do the same sequence to but you obviouls ydont need to open the revoice standalone again because its already open.
Any thoughts on the best way to do this? This would REALLY speed up my workclow. Essentialy VoAlign on steroids.
Linked from:
- Kitch Membery @Kitch2020-10-25 23:01:59.314Z2020-10-25 23:33:28.290Z
Hold my beer! :-)
This will work if the dub is directly below the the guide... one click;
//Launch Revoice Standalone App sf.app.launch({ path: "/Applications/Revoice Pro.app", }); //Wait for Revoice Standalone App to become avtive sf.ui.app('com.synchroarts.Revoice-Pro').appWaitForActive(); //Open Revoice Pro APT AudioSuite plugin sf.ui.proTools.audioSuiteOpenPlugin({ category: "Synchro Arts", name: "Revoice Pro APT", }); //Store window as a variable const revoice = sf.ui.proTools.windows.whoseTitle.is('Audio Suite: Revoice Pro APT').first; //Click Capture Guide revoice.mouseClickElement({ relativePosition: {"x":145,"y":132}, }); //Click Capture Button revoice.buttons.whoseTitle.is('Analyze').first.elementClick(); //Wait for audio to be processed sf.ui.proTools.waitForNoModals(); //Move down a track sf.ui.proTools.menuClick({menuPath:["Edit","Selection","Extend Edit Down"]}); sf.ui.proTools.menuClick({menuPath:["Edit","Selection","Remove Edit from Top"]}); //Click Capture Dub revoice.mouseClickElement({ relativePosition: {"x":145,"y":157}, }); //Click Capture Button revoice.buttons.whoseTitle.is('Analyze').first.elementClick(); //Wait for audio to be processed sf.ui.proTools.waitForNoModals(); //Click Spot Button revoice.buttons.whoseTitle.is('Render').first.elementClick();
Updated with Comments :-)
- MMike Avenaim @Mike_Avenaim
Haha... you Wizard. Let me try it now!
- In reply toKitch⬆:MMike Avenaim @Mike_Avenaim
Totally working!
The only down side I see is if the "dub" is slightly longer of a waveform at the start and end and doesnt line up kinda almost exactly like the guide, it cuts off a bit off the start and end. Does that make sense? This is a really useful script, I waste so much time doing this everyday.
Kitch Membery @Kitch2020-10-25 23:20:59.240Z
Hmmm... I'm not sure why that happens. would having it as two scripts, one to capture the Guide & one to capture the Dub fix this? I ask only because I don't use or have the plugin I literally just downloaded the Trial 10 mins ago. Works a treat!
BTW the way you wrote the question was great.. It made it so easy to build the script. :-)
- MMike Avenaim @Mike_Avenaim
Ah, thanks man! Killer.
Let me have a think about it. Ill make you a little short video too that shows exactly what i mean. It will make it a lot easier to understand i think.
Thanks so much.
Kitch Membery @Kitch2020-10-25 23:35:08.770Z
I just updated the script with comments so you can understand what each part does. :-)
Hope it helps!
Kitch Membery @Kitch2020-11-02 08:33:44.781Z2020-11-02 08:54:19.541Z
Here is a new version for you...
-
Make sure you have "Link Track and Edit Selection" turned on.
-
Select more than one track you want to process (ie a stack of backing vocals), with the track you want to use as a guide track at the top.
-
Trigger the script!
The script then;
- Captures the guide track.
- Select the next track.
- Captures it as the Dub track.
- Processes the track.
- Repeats for each selected track.
Sit back and relax. :-)
Rock on!sf.ui.proTools.appActivateMainWindow(); sf.ui.proTools.mainWindow.invalidate(); const revoice = sf.ui.proTools.windows.whoseTitle.is('Audio Suite: Revoice Pro APT').first; const tracks = sf.ui.proTools.selectedTracks.names; const guideTrack = tracks[0]; const oldSelection = sf.ui.proTools.selectionGet(); sf.app.launch({ path: "/Applications/Revoice Pro.app", }); sf.ui.app('com.synchroarts.Revoice-Pro').appWaitForActive({ timeout: 3000 }, `Could not activate Revoice Pro app`); sf.ui.proTools.audioSuiteOpenPlugin({ category: "Synchro Arts", name: "Revoice Pro APT", }); if (sf.ui.proTools.selectedTracks.count < 2) { throw (`Please select 2 or more tracks`); } let repetitions = 0; sf.ui.proTools.selectedTrackHeaders.map(track => { track.elementClick(); sf.ui.proTools.trackSelectByName({ names: [guideTrack], deselectOthers: true, }); revoice.mouseClickElement({ relativePosition: { "x": 145, "y": 132 }, }); revoice.buttons.whoseTitle.is('Analyze').first.elementClick(); sf.ui.proTools.waitForNoModals(); if (repetitions !== 0) { sf.ui.proTools.trackSelectByName({ names: [track.normalizedTrackName], deselectOthers: true, }); revoice.mouseClickElement({ relativePosition: { "x": 145, "y": 157 }, }); revoice.buttons.whoseTitle.is('Analyze').first.elementClick(); sf.ui.proTools.waitForNoModals(); revoice.buttons.whoseTitle.is('Render').first.elementClick(); sf.ui.proTools.waitForNoModals(); sf.ui.proTools.selectionSet({ selectionStart: oldSelection.selectionStart, selectionLength: oldSelection.selectionLength, }); } repetitions++ });
Here it is in action...
Kitch Membery @Kitch2020-11-03 07:09:34.846Z
Just got a message from the forum email server saying you replied via email. Be sure to respond on the forum rather than to the email as we don't receive the emails directly.
Enjoy that script! :-)
- MMike Avenaim @Mike_Avenaim
Awesome man. Sorry. I was just saying I can’t wait to try it.
Kitch Membery @Kitch2020-11-03 07:30:59.852Z
No worries at all mate! Did you watch the video? Massive time saver for vocal alignment :-)
Landon Bailey @LandonBailey
Hey there @Kitch I'm really excited about this script, but I can't seem to get it working. Do you have any ideas? Here is the lastest log the last time I tried:
06.11.2020 12:54:41.18 [Backend]: #StreamDeck: KeyDown (3,1) -> Revoice APT
06.11.2020 12:54:41.18 [Backend]: >> Command: Revoice APT [user:ckh5cgame0003yv10y1anx3et:ckh6iukqt0006k010jtiu6px2]
06.11.2020 12:54:41.26 [Backend]: Clicking with mouse here: 72, 30
06.11.2020 12:54:41.58 [Backend]: Clicking with mouse here: 72, 30
06.11.2020 12:54:41.58 [Backend]: #App: Activate "com.avid.ProTools" -> PROTOOLS [ckh2h78y100094h10vh1qp1u0]
06.11.2020 12:54:41.76 [Backend]: Logging unknown error in action (02) AudioSuiteOpenPluginAction: Object reference not set to an instance of an object.
06.11.2020 12:54:41.76 [Backend]: !! Command Error: Revoice APT [user:ckh5cgame0003yv10y1anx3et:ckh6iukqt0006k010jtiu6px2]:
Object reference not set to an instance of an object. (Revoice APT: Line 13)
System.NullReferenceException: Object reference not set to an instance of an object.
at SoundFlow.Shortcuts.Automation.Actions.AudioSuiteOpenPluginAction.GetMenuItemToPress() + 0x77
at SoundFlow.Shortcuts.Automation.Actions.AudioSuiteOpenPluginAction.d__22.MoveNext() + 0x225
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + 0x1c
at sfbackend!+0x178b40b
at sfbackend!+0x178b346
at SoundFlow.Shortcuts.Automation.AutoAction`1.d__20.MoveNext() + 0x317<< Command: Revoice APT [user:ckh5cgame0003yv10y1anx3et:ckh6iukqt0006k010jtiu6px2]
06.11.2020 12:54:41.95 [Backend]: Showing Deck "PROTOOLS" on Device "LB Stream Deck " (We were called with device "LB Stream Deck ")
[StreamDeck] Device 'LB Stream Deck ' instantiating deck 'PROTOOLS'Kitch Membery @Kitch2020-11-06 20:27:13.558Z
Hi @LandonBailey,
I'll have to take a look at this next week. Till then, have you tried restarting SoundFlow.
@Mike_Avenaim, Have you had a chance to try it yet?
Landon Bailey @LandonBailey
I did try that, as well as ProTools. Tried a few different stacks, and I'm getting the same error, specifically "Object reference not set to an instance of an object."
Kitch Membery @Kitch2020-11-06 21:15:22.307Z
Cool. Thanks for trying, I'll take a look at it when I get a moment.
- MMike Avenaim @Mike_Avenaim
I havent actually had a chance to test the updated version... did you get a chance to look it it again?
Kitch Membery @Kitch2020-11-11 02:30:39.016Z
Not since I got it working as seen in the video and unfortunately and my trial license expired... Such a slick program!
When you get a chance to test it let me know how it goes.
BTW lets chat later in the week re the other script Idea you had. :-)
- In reply toLandonBailey⬆:
Landon Bailey @LandonBailey
@chrscheuer Can you help with this?
I'm not understanding "Object reference not set to an instance of an object."
Am I missing a setting in PT or Revoice? Cheers!Christian Scheuer @chrscheuer2020-11-11 17:22:05.660Z
Hi Landon,
I'll need an updated version of the script together with complete logs to help with this. Please file a script help report for your script (step 1 in the link):
Christian Scheuer @chrscheuer2020-11-11 17:23:39.998Z
My first guess would be to ensure that Pro Tools has focus before you open the AudioSuite plugin
Insert this:
sf.ui.proTools.appActivateMainWindow();
Before your call to:
sf.ui.proTools.audioSuiteOpenPlugin({ category: "Synchro Arts", name: "Revoice Pro APT", });
Assuming this is the most recent version of your script:
https://forum.soundflow.org/-3215#post-8Landon Bailey @LandonBailey
I tried filing a script help report, but it won't let me. I'm getting this message: Error No parentWindowld
Landon Bailey @LandonBailey
Also, update: I did discover that the script will not open AudioSuite properly unless plugin display menu is set to "Category and Manufacturer".
Kitch Membery @Kitch2020-11-12 00:00:29.219Z
Hi Landon,
To resolve the "Category and Manufacturer" issue change this section of code;
sf.ui.proTools.audioSuiteOpenPlugin({ category: "Synchro Arts", name: "Revoice Pro APT", });
to
sf.ui.proTools.audioSuiteOpenPlugin({ category: "Other", name: "Revoice Pro APT", });
Once this is fixed... It may be best if you create a screen capture of what is happening when you run the script so we can see how it fails.
Landon Bailey @LandonBailey
Here is the screen capture of the script in action. I have the script on my ProTools deck, but for the video's sake I ran the command from SF.
Kitch Membery @Kitch2020-11-12 17:49:55.187Z
This is great @LandonBailey, I’m out of the studio this morning but will take a look at it later today. I think I can see what the problem is though.
Landon Bailey @LandonBailey
Sounds great, thanks!
- In reply toLandonBailey⬆:
Kitch Membery @Kitch2020-11-13 00:07:42.091Z
Hi @LandonBailey,
From your video, it seems your standalone version of the Revoice pro app is running some process as it starts up. Have you changed any of Revoice Pro App Settings?
Landon Bailey @LandonBailey
I have not, but I did go through and try a few different settings with no luck.
Do you have a set of recommended settings in Revoice Pro standalone or Audiosuite?Kitch Membery @Kitch2020-11-13 22:29:40.459Z
Have you tried performing the workflow manually. It might bring to light what the problem is.
Here are the steps;
- Open the Revoice Pro standalone application to a new session
- Go to audiosuite > synchro arts > revoice pro apt
- Select the area you want to analyze as the "capture guide"
- Hit the capture button (wait for capture to complete)
- Select the area i want to analyze as the "capture dub"
- Hit the capture dub button (wait for capture to complete)
- hit the spot button
Landon Bailey @LandonBailey
This does work just fine. So weird! Now when I try the APT script I get this error:
14.11.2020 15:29:18.06 [Backend]: Showing Deck "PROTOOLS" on Device "LB Stream Deck " (We were called with device "LB Stream Deck ")
[StreamDeck] Device 'LB Stream Deck ' instantiating deck 'PROTOOLS'14.11.2020 15:29:53.43 [Backend]: #StreamDeck: KeyDown (3,1) -> Revoice APT
14.11.2020 15:29:53.43 [Backend]: >> Command: Revoice APT [user:ckh5cgame0003yv10y1anx3et:ckh6iukqt0006k010jtiu6px2]
14.11.2020 15:29:53.52 [Backend]: Clicking with mouse here: 72, 30
14.11.2020 15:29:54.16 [Backend]: Clicking with mouse here: 72, 30
14.11.2020 15:29:54.16 [Backend]: #App: Activate "com.avid.ProTools" -> PROTOOLS [ckh2h78y100094h10vh1qp1u0]
14.11.2020 15:29:56.36 [Backend]: Clicking with mouse here: 667, 211
14.11.2020 15:29:56.81 [Backend]: Clicking with mouse here: 667, 211
14.11.2020 15:29:57.17 [Backend]: Clicking with mouse here: 667, 236
14.11.2020 15:29:58.00 [Backend]: Clicking with mouse here: 773, 86
14.11.2020 15:29:58.78 [Backend]: Clicking with mouse here: 773, 62
14.11.2020 15:29:59.05 [Backend]: Clicking with mouse here: 773, 86
14.11.2020 15:29:59.85 [Backend]: Clicking with mouse here: 773, 62
14.11.2020 15:30:00.06 [Backend]: Clicking with mouse here: 773, 86
14.11.2020 15:30:00.84 [Backend]: Clicking with mouse here: 773, 62
14.11.2020 15:30:01.06 [Backend]: Clicking with mouse here: 773, 86
14.11.2020 15:30:01.86 [Backend]: Clicking with mouse here: 773, 62
14.11.2020 15:30:02.16 [Backend]: Clicking with mouse here: 773, 86
14.11.2020 15:30:02.92 [Backend]: Logging error in action (01) SetSelectionAction: Could not set selection start to: 61| 4| 495. Value found: 81| 1| 000
14.11.2020 15:30:02.92 [Backend]: !! Command Error: Revoice APT [user:ckh5cgame0003yv10y1anx3et:ckh6iukqt0006k010jtiu6px2]:
Could not set selection start to: 61| 4| 495. Value found: 81| 1| 000 (Revoice APT: Line 58)<< Command: Revoice APT [user:ckh5cgame0003yv10y1anx3et:ckh6iukqt0006k010jtiu6px2]
14.11.2020 15:30:03.13 [Backend]: Showing Deck "PROTOOLS" on Device "LB Stream Deck " (We were called with device "LB Stream Deck ")
[StreamDeck] Device 'LB Stream Deck ' instantiating deck 'PROTOOLS'Kitch Membery @Kitch2020-11-14 22:40:56.413Z
Ahhh... I see... Could you try swapping the main counter to samples and running it again? If that fixes it Then I'll know what to change.
I wish I still had the trial running.
Landon Bailey @LandonBailey
Switching the main counter to samples worked!!!
Kitch Membery @Kitch2020-11-18 16:55:46.321Z
Fantastic I’ll fix the script today :-)
Landon Bailey @LandonBailey
Sweet! Thank you
Kitch Membery @Kitch2020-11-19 21:38:41.979Z
Hi @LandonBailey,
I don't have a way to test it, but I believe this script should fix the two issues you were having with the script.
The script now...
•Swaps to Samples for the duration of the script.
•Tries finding the "Revoice Pro APT" AudioSuite Plugin in the "Synchro Arts" sub-menu and if that fails, looks for it in the "Other" sub-menu.Let me know if it works for you, fingers crossed :-)
function main() { sf.ui.proTools.appActivateMainWindow(); sf.ui.proTools.mainWindow.invalidate(); const revoice = sf.ui.proTools.windows.whoseTitle.is('Audio Suite: Revoice Pro APT').first; const tracks = sf.ui.proTools.selectedTracks.names; const guideTrack = tracks[0]; const oldSelection = sf.ui.proTools.selectionGet(); sf.app.launch({ path: "/Applications/Revoice Pro.app", }); sf.ui.app('com.synchroarts.Revoice-Pro').appWaitForActive({ timeout: 3000, onError: 'ThrowError', }, `Could not activate Revoice Pro app`); try { sf.ui.proTools.audioSuiteOpenPlugin({ category: "Synchro Arts", name: "Revoice Pro APT", }); } catch (err) { sf.ui.proTools.audioSuiteOpenPlugin({ category: "Other", name: "Revoice Pro APT", }); } if (sf.ui.proTools.selectedTracks.count < 2) { throw (`Please select 2 or more tracks`); } let repetitions = 0; sf.ui.proTools.selectedTrackHeaders.map(track => { track.elementClick(); sf.ui.proTools.trackSelectByName({ names: [guideTrack], deselectOthers: true, }); revoice.mouseClickElement({ relativePosition: { "x": 145, "y": 132 }, }); revoice.buttons.whoseTitle.is('Analyze').first.elementClick(); sf.ui.proTools.waitForNoModals(); if (repetitions !== 0) { sf.ui.proTools.trackSelectByName({ names: [track.normalizedTrackName], deselectOthers: true, }); revoice.mouseClickElement({ relativePosition: { "x": 145, "y": 157 }, }); revoice.buttons.whoseTitle.is('Analyze').first.elementClick(); sf.ui.proTools.waitForNoModals(); revoice.buttons.whoseTitle.is('Render').first.elementClick(); sf.ui.proTools.waitForNoModals(); sf.ui.proTools.selectionSet({ selectionStart: oldSelection.selectionStart, selectionLength: oldSelection.selectionLength, }); } repetitions++ }); } //Switch Main Counter to samples for duration of script. sf.ui.proTools.mainCounterDoWithValue({ targetValue: 'Samples', action: main, });
Landon Bailey @LandonBailey
This worked! Thank you for the help with this. Seriously - it's an amazing script!
Landon Bailey @LandonBailey
Side note, not sure if you meant for this to happen, but the counter does target samples for the script, but it always changes back to whatever setting was there previously. Super rad.
Kitch Membery @Kitch2020-11-21 22:33:36.173Z
So glad it's working for you. Sorry it took me so long to sort out.
Regarding the side note... Yeah that was intensional. It's super powerful to be able to recall past settings. :-)
Rock on!
- In reply toLandonBailey⬆:
Kitch Membery @Kitch2020-11-13 22:31:14.912Z
To answer your questions, no I don't have particular settings I had just left them as default.
- In reply toLandonBailey⬆:
Christian Scheuer @chrscheuer2020-11-11 23:52:45.484Z
Thank you for reporting this, that sounds like a bug we should definitely get fixed.
- In reply toKitch⬆:
Brandon Metcalf @Brandon_Metcalf
you are a wizard. soundflow blows my mind every day. thank you @Kitch for the script, and to @Mike_Avenaim for asking this - i came to the forum hoping to find this exact script and voila!
Kitch Membery @Kitch2020-11-05 11:11:52.545Z
My pleasure Brandon. :-)
-
- In reply toMike_Avenaim⬆:illicit tsuboi @illicit_tsuboi
it's great script & always use it till Revoice Pro 4.2.
but The GUI has changed from 4.3, and the existing scripts can no longer be used.
If I could have a script with the same content that I could use in 4.3, I would like.Someone please solve this problem....
Brandon Metcalf @Brandon_Metcalf
I just installed the latest version of Revoice on my new computer and realized this brilliant time-saving script no longer works (Revoice 4.3). I came to the forum to see if anyone else had run into the same issue and saw your message.
I made a few changes to the previous script to try and get it working again. I'm not the coding genius that Kitch is so there may be a better/cleaner way to do this, but it's at least working on my system! You're welcome to give it a shot. Hope it helps!
function main() { sf.ui.proTools.appActivateMainWindow(); sf.ui.proTools.mainWindow.invalidate(); const revoice = sf.ui.proTools.windows.whoseTitle.is('Audio Suite: Revoice Pro Quick APT').first; const tracks = sf.ui.proTools.selectedTracks.names; const guideTrack = tracks[0]; const oldSelection = sf.ui.proTools.selectionGet(); sf.app.launch({ path: "/Applications/Revoice Pro.app", }); sf.ui.app('com.synchroarts.Revoice-Pro').appWaitForActive({ timeout: 3000, onError: 'ThrowError', }, `Could not activate Revoice Pro app`); try { sf.ui.proTools.audioSuiteOpenPlugin({ category: "Synchro Arts", name: "Revoice Pro Quick APT", }); } catch (err) { sf.ui.proTools.audioSuiteOpenPlugin({ category: "Other", name: "Revoice Pro Quick APT", }); } if (sf.ui.proTools.selectedTracks.count < 2) { throw (`Please select 2 or more tracks`); } let repetitions = 0; sf.ui.proTools.selectedTrackHeaders.map(track => { track.elementClick(); sf.ui.proTools.trackSelectByName({ names: [guideTrack], deselectOthers: true, }); revoice.mouseClickElement({ relativePosition: { "x": 375, "y": 210 }, }); sf.wait({ intervalMs: 100, }); sf.ui.proTools.waitForNoModals(); if (repetitions !== 0) { sf.ui.proTools.trackSelectByName({ names: [track.normalizedTrackName], deselectOthers: true, }); revoice.mouseClickElement({ relativePosition: { "x": 375, "y": 239 }, }); sf.wait({ intervalMs: 100, }); sf.ui.proTools.waitForNoModals(); revoice.mouseClickElement({ relativePosition: { "x": 375, "y": 285 }, }); sf.wait({ intervalMs: 100, }); sf.ui.proTools.waitForNoModals(); sf.ui.proTools.selectionSet({ selectionStart: oldSelection.selectionStart, selectionLength: oldSelection.selectionLength, }); } repetitions++ }); } //Switch Main Counter to samples for duration of script. sf.ui.proTools.mainCounterDoWithValue({ targetValue: 'Samples', action: main, });
illicit tsuboi @illicit_tsuboi
Sometimes it malfunctions depending on how the plug-in screen appears, but it worked perfectly!!!
thank you!!!
- In reply toBrandon_Metcalf⬆:OOwen Granich-Young @Owen_Granich_Young
This saved me at least 10,000 clicks today. Thanks @Brandon_Metcalf and @Kitch !