Select track by name
Hi there
This idea for Logic is to be able to select a track by name. This is based mostly on ease of navigation, especially with hardware controllers.
Usually you have to mouse around to select a track, or bank or scroll through on a hardware controller (like the SSL UF8 or Softube Console 1). Being able to set up a few buttons to select tracks by name would be amazing.
My use case (which I'm sure others do) is I set up folder stacks for groups of instruments (drums, bass, guitars, keys etc). I usually have these plus bus routing set up in a template so the naming convention between sessions is consistent.
If you could setup a button to select these, then the hardware controller would jump to that track and all following the first fader would be in that group.
The knock on effect for this feature would be awesome;
It would allow macros to be setup; select track by name, mute that track, solo etc etc.
One button to solo a reference track for example
One button to solo the vocal bus
etc etc
- SIn reply toMatthew_Brabender⬆:SoundFlow Bot @soundflowbot
This issue is now tracked internally by SoundFlow as SF-1358
- In reply toMatthew_Brabender⬆:Kitch Membery @Kitch2024-07-10 22:31:50.777Z
Thanks for this request. This is something that is on our list of things to "attempt" to implement.
I've logged this internally so you'll be first to know if/when we're able to get the functionality working.
And I agree the knock-on effect would be awesome. :-)
- In reply toMatthew_Brabender⬆:Matthew Brabender @Matthew_Brabender
Hi Kitch (and for anyone that's been searching on how to do this). I stumbled across someone that has done this a while ago ... I tried the script and it works. Hazaahh!
Here's the script:
function selectTrackInLogic({ trackName }) { let originalMousePosition = sf.mouse.getPosition().position const logicApp = sf.ui.app("com.apple.logic10"); function trackToSelect() { const trackHeaders = logicApp.invalidate().mainWindow.groups.whoseDescription.is("Tracks").first.groups.whoseDescription.is("Tracks").allItems[1].splitGroups.first.splitGroups.allItems[1].scrollAreas.first.groups.whoseDescription.is("Tracks header").first.children; const trackToSelect = trackHeaders.filter(x => x.textFields.whoseDescription.is(trackName).first.exists)[0]; return trackToSelect } let mainWindowScreen = logicApp.invalidate().mainWindow.windowGetScreen().screen let ruler = logicApp.mainWindow.groups.whoseDescription.is("Tracks").first.groups.whoseDescription.is("Tracks").allItems[1].splitGroups.first.splitGroups.first.scrollAreas.first.frame; if (!trackToSelect) { log("Track Name Not Found") throw 0; } let frame = trackToSelect().frame let offscreenBottom = ((frame.y + frame.h) > (mainWindowScreen.visibleFrame.y + mainWindowScreen.visibleFrame.h)) if (offscreenBottom) { let arrangeAreaFrame = sf.ui.app("com.apple.logic10").mainWindow.groups.whoseDescription.is("Tracks").first.groups.whoseDescription.is("Tracks").allItems[1].splitGroups.first.splitGroups.allItems[1].scrollAreas.allItems[1].frame sf.mouse.setPosition({ position: { x: arrangeAreaFrame.x + (arrangeAreaFrame.w / 2), y: arrangeAreaFrame.y + (arrangeAreaFrame.h / 2) } }) sf.mouse.scroll({ delta: -(frame.y + frame.h - mainWindowScreen.visibleFrame.y + mainWindowScreen.visibleFrame.h + mainWindowScreen.visibleFrame.h), delta2: 0, unit: "Pixel" }) } let offScreenTop = (frame.y < ruler.y + ruler.h) if (offScreenTop) { let arrangeAreaFrame = sf.ui.app("com.apple.logic10").mainWindow.groups.whoseDescription.is("Tracks").first.groups.whoseDescription.is("Tracks").allItems[1].splitGroups.first.splitGroups.allItems[1].scrollAreas.allItems[1].frame sf.mouse.setPosition({ position: { x: arrangeAreaFrame.x + (arrangeAreaFrame.w / 2), y: arrangeAreaFrame.y + (arrangeAreaFrame.h / 2) } }) sf.mouse.scroll({ delta: ((ruler.y + ruler.h) - frame.y), delta2: 0, unit: "Pixel" }) } trackToSelect().mouseClickElement({ relativePosition: { x: (frame.w / 2), y: 5 } }) sf.mouse.setPosition({position: originalMousePosition}) } const logicApp = sf.ui.app("com.apple.logic10"); logicApp.appActivateMainWindow(); selectTrackInLogic({ trackName: "STEM MASTER" })
The only thing I needed to edit is the track name in the last line of the code.
I've created a few buttons for frequently visited tracks that I have permanently in my template. But it sure does open up possibilities for quick navigation and action .... one button to mute the vocal bus .... one button to solo the reference track ... one button to jump to the drum bus or main vocal ....
Here's the really kicker if you work with a hardware controller (SSL UF8 for me) and use track stacks; you can do things like ... have one button to close all track stacks, select the drum stack and open that stack. All of a sudden your drum tracks are all lined up on the hardware faders.Here's where I found it:
Select a track in Logic Pro X
The script I used was posted by @Matt_Hennessy on Dec 24, 2021Kitch Membery @Kitch2024-10-21 21:29:05.697Z
Great to hear that you've found this script works for you.
Just a heads-up: I'm working on implementing Logic Pro track selection functionality for a future update. The current script relies on the mouseClickElement method, which simulates mouse clicks on the track header. While this works, it’s not the most stable way to control an app in SoundFlow.
There’s still some work to do to make it fully reliable, but I’ll keep you updated. :-)
Matthew Brabender @Matthew_Brabender
Really appreciate to work you put into this. SF has really become an essential part of my workflow now. Love it!
Kitch Membery @Kitch2024-10-21 21:38:01.738Z
Thanks @Matthew_Brabender. :-)
I really appreciate all the feedback you have been giving. It's helping me to make the Logic Pro package even better!