No internet connection
  1. Home
  2. Ideas

Logic workflows

Hi all,

Let's use this topic as a placeholder for people to discuss workflows that they'd like to be able to automate in Logic.

  • 22 replies

There are 22 replies. Estimated reading time: 23 minutes

  1. D
    Dan Radclyffe @Dan_Radclyffe
      2020-11-10 12:20:32.537Z

      I’ve been experimenting with SF and Logic for a few weeks now. I’ve managed to get everything I need for mix prep sorted (colouring tracks, aligning, tuning, deessing vocals) except for one thing: buss assignments.

      Logic provides no keyboard shortcuts for this unfortunately, so you go track by track, pull up the menus, find the busses and move on.

      Would be beyond great to be able to just select a track and push a button...

      1. Hi Dan,

        Even with what you've already got working - can you elaborate a bit on exactly what these macros do? Aligning, tuning, etc.
        What we are looking for is to build a comprehensive list of macro actions, what kind of input they should need, what they would do and in which context (on the selected track, should they ask the user anything, etc).
        The more specific, the better :)

      2. D
        In reply tochrscheuer:
        Dan Radclyffe @Dan_Radclyffe
          2020-11-10 12:39:27.920Z

          Yes for sure. They do involve Melodyne 5 ARA and Revoice Pro standalone though.

          For deessing: melodyne 5 is opened (Melodyne has to already be displaying the audio, which it would do using ARA), all notes are selected, sibilant balance tool is selected and adjusted to -30%, plugin window is closed,

          For aligning: a region is highlighted, selection-based processing is enabled and the revoice pro link plugin is opened. I have a default template in Revoice Pro with tracks pre-named. Guide, Dub 1, Dub 2 etc. SF searches for the track name in the Revoice Pro Link plugin menu (enabled as default in slot A of selection-based processing) and sends the vocal selection into RVP. Once you have all tracks loaded in you can then align in RVP and reimport back into Logic.

          In fact, my bad I didn't actually make a tuning one. I meant leveling, which you can do in Melodyne 5

          1. Thank you! In which of these workflows did you find yourself having to rely on XY / mouse coordinates?

            1. DDan Radclyffe @Dan_Radclyffe
                2020-11-10 19:23:03.833Z

                All of them. Picking an entire UI element (as in selecting the whole plugin window) has rarely worked for me. However it seemed to recognise the “first window” “close button” every time so I’d plot coordinates in reference to that depending on what I needed to do

                1. I've been working on a melodyne integration as well. Actually did it for Cubase, but it applied to Logic as well just with a different offset.
                  It is much just with mouse clicks, but I found a few things to make it "safer".
                  I'll share soon and you can see if you wanna check it out Dan.

                  1. DDan Radclyffe @Dan_Radclyffe
                      2020-12-09 19:40:14.509Z

                      Sounds good- thanks for all your help!

              • W
                In reply tochrscheuer:
                Wide Blue Sky @Wide_Blue_Sky
                  2021-10-28 22:39:39.402Z

                  It would be amazing to automate stem bouncing similarly to the "Stem Bounce" macro built for Pro Tools ( https://www.youtube.com/watch?v=p6mr6_lZ7NM )

                  Especially if there was a way to choose to make it just bounce out folders vs. all tracks.

                  This way each track/folder/stem goes through the mix bus processing.

                  1. RRyan Hayes @Ryan_Hayes
                      2021-12-21 22:04:00.975Z2021-12-21 23:10:40.334Z

                      Hey guys, I have a simplified version of stem bounce. I can do 1 group of instruments at a time. Also unpack take folders, take selction, sum regions before hand.

                      Ive got the Melodyne ARA script like Pro tools minus taking off 1st plugin and moving others. You would have to move your plugs first.

                      I used the mix window and open pop up menu and select item press keys right+enter, to load mono if on mono track. Stereo if on stereo. Dual mono you would create another command with right + down + enter. All the tracks selected first slot (usaully autotune for me) will replaced with melodyne ARA. Click play then stop after 2 seconds. Tune them then I made the command to go through each track in the main window and bounce them with the right name and dialog checkbox settings. Hard thing is getting SF to recognize the Logic bounce window and make sure the wait for ui element to disipear times are set right before it goes to the next track. Hope this helps you guys. Those were the biggest issues I ran into creating mine.

                    • A
                      In reply tochrscheuer:
                      Alex Oldroyd @Alex_Oldroyd
                        2021-12-29 23:50:20.947Z

                        Are there any of Logic Pro macros available to download? It's difficult to get started without templates to follow and learn from...

                        1. Hi Alex,

                          There's only a couple of packages in the Store right now with Logic content, AFAIK, and they probably aren't very stable. This thread tracks ideas & feature requests for when we will eventually add full Logic support to SF.
                          At the moment, as you said, it's quite hard to get started with Logic & SF, unfortunately.

                        2. B
                          In reply tochrscheuer:
                          Brandon Seliga @Brandon_Seliga
                            2022-01-10 20:21:22.230Z

                            Hey all! I would love to see the ability to select Channel Strips (track presets) through SF.

                            I've already been running a macro to add specific plugins to a track (i.e. Kontakt) through this script:

                            function getInstrumentSelectorListButton() {
                                var inspector = sf.ui.app('com.apple.logic10').mainWindow.groups.whoseDescription.is('Inspector').first;
                                if (!inspector.exists) throw 'Could not find Inspector';
                            
                                var mixer = inspector.children.whoseRole.is("AXList").first.groups.allItems.filter(grp => grp.children.whoseRole.is("AXLayoutArea").whoseDescription.is('Mixer').exists)[0].children.whoseRole.is("AXLayoutArea").whoseDescription.is('Mixer').first;
                                if (!mixer.exists) throw 'Could not find Mixer';
                            
                                var selectedTrackChannelStrip = mixer.children.whoseRole.is("AXLayoutItem").first;
                                if (!selectedTrackChannelStrip.exists) throw 'Could not find selected channel strip';
                            
                                var instrumentSelectorGroup = selectedTrackChannelStrip.groups.allItems.filter(g => {
                                    var gDesc = g.getString("AXDescription");
                                    if (gDesc.match(/^(automation|Bus \d?)$/)) return false;
                                    var neededChildren = ['bypass', 'open', 'list'];
                                    if (!neededChildren.every(n => g.children.whoseDescription.is(n).exists)) return false;
                                    return true;
                                })[0];
                                if (!instrumentSelectorGroup) throw 'Could not find instrument selector';
                            
                                var listButton = instrumentSelectorGroup.children.whoseDescription.is('list').first;
                                return listButton;
                            }
                            
                            getInstrumentSelectorListButton().popupMenuSelect({
                                menuPath: ['AU Instruments', 'Native Instruments', 'Kontakt', 'Stereo']
                            });
                            
                            

                            and combining it with an "add new inst track" command, but we have so many channel strip settings at the studio here that would be amazing to grab instead of instantiating single instances of plugins.

                            Not sure if anyone already has a script for this (that would be AMAZING) but regardless I'd love to see this implemented.

                            1. A2Alex Oldroyd @Alex_Oldroyd8
                                2022-01-11 13:45:31.810Z

                                This looks great. I've just posted in the How To section about how best to select a patch from the library.

                              • W
                                In reply tochrscheuer:
                                Wide Blue Sky @Wide_Blue_Sky
                                  2022-01-20 01:20:34.669Z

                                  2 more tasks that I have that I'd love to be able to do with SF.

                                  1. Bypass Sonarworks (plugin) on the master bus. For context, I'd like to hit one button and have SF bypass sonarworks, bring up the bounce window, wait for the bounce to complete, and then re-enable sonarworks once complete.

                                  2. Import project settings (specifically screen set). I want to hit a macro that will open up "import project settings", select a certain template from finder, and then import just the screen set. I can see this being useful for importing other settings/tracks/etc. from other sessions as well.

                                  I think I can make a dirty version of #2 that'll get what I need done, but it'd only work if the last time I imported a session had the same settings/location as the one I want to macro.

                                  -Brandon Seliga

                                  1. S
                                    In reply tochrscheuer:
                                    SoundFlow Bot @soundflowbot
                                      2024-02-20 18:37:01.316Z

                                      This issue is now tracked internally by SoundFlow as SF-1070

                                      1. In reply tochrscheuer:
                                        Kitch Membery @Kitch2024-03-13 23:19:05.982Z

                                        Hi @Dan_Radclyffe, @Wide_Blue_Sky, @Ryan_Hayes, @Alex_Oldroyd, and @Brandon_Seliga.

                                        I just thought I'd give you a heads up in case you were not aware, recently we added an Official Logic Pro package to SoundFlow that includes, Plugin, Instrument, MIDI FX, and Send loaders + much more. The package is available in the SoundFlow Store and requires Logic Pro 10.8 and above, and SoundFlow 5.7.0.

                                        If you're interested, we'll be holding a webinar tomorrow Thursday 14th March at 11 am PST. If you are interested, be sure to register at the following link:

                                        https://soundflow.org/events/2024-03-logic-pro-webinar

                                        I hope you can attend. :-)

                                        1. J
                                          In reply tochrscheuer:
                                          Jan Christophersen @Jan_Christophersen
                                            2024-03-15 07:38:27.018Z2024-03-15 09:41:45.664Z

                                            Installed the new Logic Package. All good, but I feel it's really just a beginning. Mostly it's about activating commands inside Logic that are already there. The fun begins when we get new ways to do things inside the program. Macro-stuff. Like Stem-bouncing.

                                            I would like to be able to run a logic-command on a selection of tracks or regions. Don't see a way to do that at the moment.

                                            I would love to have a script like "Strip Silence" for Pro Tools that works with the Remove Silence function of logic. Select the tracks, start the macro and boom: Track after track is done with Remove Silence.

                                            Also: I always change my stereo-tracks in Logic from the default Balance Panner to Stereo Panner. That takes a few clicks: Open mixer, selects all tracks, right click on a stereo-balance-panner and change it to stereo-panner. If this could be automated by soundflow with just a click that would be great... (Don't understand why Logic doesn't have an option to change the default behaviour. But that's the way it is with Logic.)

                                            Is there a way to do this?

                                            Cheers
                                            Jan

                                            1. Z
                                              In reply tochrscheuer:
                                              Zvonimir Dusper @Zvonimir_Dusper
                                                2024-12-05 17:47:11.514Z

                                                Hi to everyone. I thought I will be able to solve my big pain with Soundflow but, although it didn't seem that complex, I see now that at the moment it is far from possible.
                                                I produce/mix/master a lot of album artists that always send me organised and correctly named tracks following my instructions so that I can easily import them into project templates that emerge from first mix(es).
                                                So naturally it would be incredible to automate this task:

                                                1. Create new project from template (always the same for a certain artist)
                                                2. Change the tempo
                                                3. Save As new project name to the the parent folder of where multitrack is
                                                4. Import a track from a specified folder and place at the start of projet to a channel with the same name, if it exists.
                                                5. Repeat 4) for all tracks in the specified folder
                                                6. Display a list of tracks that were not imported for manual import

                                                I am also an IT developer so I have no problem with scripting, but all the scripts I tried didn't work...

                                                So I just need to know - is it currently possible? If yes, can anyone give me some examples of how it would be done? I can do the script myself but I don't seem to be able to find any soundflow script reference for Logic Pro (perhaps I am just too old :).
                                                If not, it would be best to know cause I am paying the subscription for nothing and also spending too much time on this.
                                                thx

                                                1. cc @Kitch :) Kitch is the developer of our Logic package, so he's our expert in knowing what's currently possible to automate in Logic.

                                                  1. ZZvonimir Dusper @Zvonimir_Dusper
                                                      2024-12-05 18:12:37.862Z

                                                      wow thx!!! following.

                                                    • In reply toZvonimir_Dusper:
                                                      Kitch Membery @Kitch2024-12-05 19:00:28.155Z

                                                      Hi @Zvonimir_Dusper,

                                                      Thanks for reaching out!

                                                      A lot of the workflows you are trying to achieve here have not yet been implemented in our official Logic Pro package.

                                                      I'll take a look early next week and see what is possible. I can imagine, being able to achieve them with SoundFlow would save quite some time. :-)

                                                      1. In reply toZvonimir_Dusper:
                                                        Kitch Membery @Kitch2024-12-06 03:34:43.740Z

                                                        Hi @Zvonimir_Dusper,

                                                        Obviously, your workflow will be more bespoke, but the following will open a specified template and set the tempo in Logic Pro 11.1, so that's steps 1 and 2 (possibly) sorted. :-)

                                                        More to come in the next few days, along with some questions about the manual steps you'd take to complete the workflow you're after, ie how you'd read the folder, files, tempo, project folder location, and track information for importing into Logic Pro, and how you want to pass this information onto SoundFlow.

                                                        const templateProperties = {
                                                            category: "Project Templates",
                                                            templateName: "Hip Hop",
                                                            tempo: 60,
                                                        };
                                                        
                                                        const logic = sf.ui.logic;
                                                        logic.appActivate();
                                                        logic.invalidate();
                                                        
                                                        const chooseProjectWindow = sf.ui.logic.windows.whoseTitle.is("Choose a Project").first;
                                                        const projectWindowPanel = chooseProjectWindow.splitGroups.first;
                                                        
                                                        
                                                        /**
                                                         * Sets slider value
                                                         */
                                                        function setSliderValue({ slider, targetValue }) {
                                                            const currentValue = slider.value.intValue;
                                                            const delta = Math.abs(currentValue - targetValue);
                                                            const adjustValue = (step) =>
                                                                Array.from({ length: delta }).forEach(() => slider.value.intValue += step);
                                                        
                                                            adjustValue(currentValue > targetValue ? -1 : 1);
                                                        }
                                                        
                                                        /**
                                                         * Opens the "Choose a Project" window.
                                                         */
                                                        function openChooseAProjectWindow() {
                                                            logic.menuClick({ menuPath: ["File", "New from Template…"] });
                                                        
                                                            chooseProjectWindow.elementWaitFor();
                                                        }
                                                        
                                                        /**
                                                         * Selects a template category from the left panel of the "Choose a Project" window
                                                         */
                                                        function selectCategory(category) {
                                                            //Click "Project Tempaltes"
                                                            const leftPanel = projectWindowPanel.scrollAreas.first.children.whoseRole.is("AXOutline").first;
                                                            const categoryRows = leftPanel.children.whoseRole.is("AXRow").slice(1);
                                                            const categoryRow = categoryRows.find(r => r.childrenByRole("AXCell").first.childrenByRole("AXStaticText").first.value.value === category);
                                                            const categoryCell = categoryRow.childrenByRole("AXCell").first;
                                                        
                                                            // Select the Category
                                                            categoryCell.mouseClickElement();
                                                        
                                                            // Invalidate the "Choose a Project" window as elements may have changed
                                                            chooseProjectWindow.invalidate();
                                                        }
                                                        
                                                        /**
                                                         * Selects a template from the right panel of the "Choose a Project" window
                                                         */
                                                        function selectATemplate(templateName) {
                                                            const templateButtonGroups = projectWindowPanel
                                                                .groups.first
                                                                .scrollAreas.first
                                                                .children.whoseRole.is("AXList").first
                                                                .children.whoseRole.is("AXList").first
                                                                .groups;
                                                        
                                                            // Get the template button
                                                            const templateButtonGroup = templateButtonGroups.find(
                                                                btnGrp => btnGrp.children.whoseRole.is("AXStaticText").first.value.value === templateName
                                                            );
                                                        
                                                            // Click the template button
                                                            templateButtonGroup.groups.allItems[1].buttons.first.elementClick();
                                                        }
                                                        
                                                        /**
                                                         * Opens the "Details" panel in the "Choose a Project" window
                                                         */
                                                        function openDetailsPanel() {
                                                            const detailsPanel = projectWindowPanel.groups.first.children.whoseRole.is("AXDisclosureTriangle").first;
                                                            const isDetailsPanelOpen = detailsPanel.isCheckBoxChecked;
                                                        
                                                            // Ensure the "Details" panel is open
                                                            if (!isDetailsPanelOpen) {
                                                                detailsPanel.elementClick();
                                                        
                                                                // Wait for the panel to be open
                                                                sf.waitFor({ callback: () => detailsPanel.invalidate().isCheckBoxChecked, timeout: 2000 }, `The "Details" panel di not open.`);
                                                        
                                                                // Invalidate the "Choose a Project" window as elements may have changed
                                                                chooseProjectWindow.invalidate();
                                                            }
                                                        }
                                                        
                                                        function newProjectFromTemplate(settings) {
                                                            const { category, templateName, tempo } = settings;
                                                        
                                                            // Ensure the "Choose a Project" window is open
                                                            openChooseAProjectWindow();
                                                        
                                                            // Select a category from the left panel of the "Choose a Project" window
                                                            selectCategory(category);
                                                        
                                                            // Select a template from the right panel of the "Choose a Project" window
                                                            selectATemplate(templateName);
                                                        
                                                            // Ensure the "Details" panel is open
                                                            openDetailsPanel();
                                                        
                                                            // Get all Sliders
                                                            const sliders = chooseProjectWindow.splitGroups.first.groups.first.groups.first.sliders;
                                                        
                                                            // Get the "Tempo" slider
                                                            const tempoSlider = sliders.find(slider => slider.getString("AXValueDescription").split(", ").pop() === "Tempo",);
                                                        
                                                            // Set the projects "Tempo" slider
                                                            setSliderValue({
                                                                slider: tempoSlider,
                                                                targetValue: tempo,
                                                            });
                                                        
                                                            // Click "Choose"
                                                            chooseProjectWindow.splitGroups.first.groups.first.buttons.whoseTitle.is("Choose").first.elementClick();
                                                        
                                                            // Wait for the "Choose a Project" window to disappear
                                                            chooseProjectWindow.elementWaitFor({ waitForNoElement: true });
                                                        
                                                            // Wait for the project to be created, by checking the "File"=>"Close Project" menu's enabled state
                                                            sf.waitFor({
                                                                callback: () => logic.invalidate().getMenuItem("File", "Close Project").isEnabled,
                                                                timeout: 4000,
                                                            }, `Failed creating project with the "${templateName}" template.`);
                                                        
                                                            // Testing purposes only
                                                            log("Created");
                                                        }
                                                        
                                                        newProjectFromTemplate(templateProperties);
                                                        

                                                        Also, I'd be happy to jump on a Zoom call with you sometime to give you a walk-through of SoundFlow's Official Logic Pro package. If that's something you'd be interested in please reach out to me via email at support@soundflow.org.

                                                        Rock on! :-)