Parameter follow across song parts?

Say I have a bass preset which I use inside song parts - all coming from a single rackspace and modified only by snapshot of the song parts.

Then let’s say I see the volume of my bass (for which I have a widget) is too loud. I modify it accordingly in one song part then I want that modification to apply to all other song parts.

Is this possible? Does it require scripting?

My 2 solutions for now are time consuming:

  1. I either modify the bass volume in every other song part where the bass sound occurs.
  2. I push the changes of the song part to the rackspace variation which then requires me to reassociate each of the song parts to the rackspace variation.

In method 2 I can get undesired results because all other parameters are being pushed to the variation requiring me to perform additional changes to the song part before snapshotting again.

What I envision is a switch which when activated allows the volume of the bass to change in all song parts. When not activated the song part adjustments will be independent of the other song parts.

Is something like this possible?
I ask because copying a song part into another song is currently not supported.

In my current project I have 105 songs each with anywhere between 6 to 16 song parts. So it would be a lot of work to perform a modification like that to every single song part.

I think ‘Ignore Variations’ for this widget in your single rackspace should do this?!

1 Like

As simple as that?
So I can toggle that on and off on an as needed basis?
First ignore the variations
Then make the adjustments
Then when I toggle to not ignore the variation I can just continue my workflow as if nothing happened?

If so that is the exact switch I envisioned. It was in my face the whole time.

If this works as simple as that - again my mind is blown.
Thank you @tripleB

I will report back later if this approach has any issues.
But sounds like exactly the solution.

Yes, please let us know.

All the time I move widgets controlling mixer volume in every song part.

So, if this works, I would start doing this instead.

1 Like

I mean I plan to have them independent.
But just the initial volumes leveling I would do with ignore variations.
Then minor changes for specific songs afterwards only if needed - after turning off ignore variations.
This ignore variation switch made my day.
I never thought of it as using it temporarily.
This is brilliant.
Once again thank you guys for amazing architecture.

I am a bit unclear.

If you ignored variations and adjusted a widget in a song part, it would apply to wherever that widget is located?

So, it would apply to wherever the widget is within a song (every song part)?

But, it would also apply it to widgets assigned to that variation located in other songs too?

I am hoping so because all songs are made of the same rackspace.

I apologize for posting again (I can’t yet edit my post).
But I write with absolute delight and joy. I just tried it.
I am happy to report that “ignore variations” does ignore song parts even in different songs as long as the same widget is there. meaning the widget references the same rackspace block parameter.

Now when we switch off ignore variations, the parameter value will jump back to the value stored in the snapshot before turning on ignore variations.
Unless we specifically go to each song and song part and save the snapshot while ignore variations is turned on.

i am not sure if there would be a way to persist the snapshots in all songs’ song parts recursively in a script, or how else to approach that type of automation.

i tried to create a script that will automatically save all song parts after modifying the parameter set to “ignore variations”
but it is not working. i am not sure why.
it does compile correctly (placed it in the global rackspace script editor) but does not seem to perform the function as i intended.
side question
where can i see print output from the script? i looked into the log window, but nothing gets printed when i press the widget. here is the code:

// GP5 Script: Update/Create Song Part Snapshots
Var updateSongParts : Widget  // Declare updateSongParts as a Widget

// Function to update/create song part snapshots for each song part
Function UpdateSongPartSnapshots()
    Var songIndex : integer
    Var partIndex : integer
    Var songName : String
    Var songPartName : String
    Var partCount : integer
    Var snapshotName : String  
    // Loop through the songs
    For songIndex = 0; songIndex < GetSongCount(); songIndex = songIndex + 1 Do
        // Get the number of song parts for the current song
        partCount := GetSongPartCount()

        // Loop through the song parts
        For partIndex := 0; partIndex < partCount; partIndex := partIndex + 1 Do
            // Construct a snapshot name
            songName := GetSongName(songIndex)
            songPartName := GetSongPartName(partIndex)
            snapshotName := songName + " - " + songPartName

            //Update the current Song Part
            TakeSongPartSnapshot()

            Print("Updated snapshot for: " + snapshotName)
        End
    End
End

// Main script execution triggered by a widget's value change
On WidgetValueChanged (newValue : double) from updateSongParts
    UpdateSongPartSnapshots()
End

I will keep doing what I am doing (making the change in each song part).

In my case, I would not want to affect song parts in other songs anyway.

Jeff

Same for me: if I’m using a rackspace in different Songs/Songparts I create additional Variations to keep them independent. If I ever use snapshots while rehearsal I try not to forget to push them back…

Yep, that might have been a good idea. But now I use the same variation in multiple song parts (I don’t can’t even track where I’ve used them).

It takes a bit longer to repeat the same process in each song part. But not huge deal.

that was a noob mistake. i had my widget in the local rackspace instead of the global rackspace.
the script ran and i saw the print output in the log window.

the bad news was that even though i automated what i didn’t want to do manually, when i switched off ignore variations, the parameter in all song parts still went back to its previous value.
in other words the only saved snapshot was the active one when using the incorrect script automation.
while if i did it manually all snapshots i went through got saved properly.

so the missing piece of the puzzle was selecting the song part in the script before calling the updateSongPartSnapshots() and also advancing to the next song.

it works now.
@jeffn1 yes i like to keep my parameters/widgets different for each song part - however if i need to quickly level one parameter in all song parts, i can now use this script to save me the time of repeating steps manually.

this script only helps because when switching off “ignore variations” values return to their previous snapshot values instead of maintaining the last “ignore variation” values.

the script now allows maintaining those values after switching off ignore variations.
it is not speedy - because without the sleep statement it can skip over saving some snapshots.
but it works for that one time we need it.

i’ll post the script in the next comment for anyone interested to try it.

here is the updated script
i increased the sleep time to 400 ms - might need to be adjusted in the script to allow more time on slower machines. it’s still way faster and less work than i would be able to do it manually.
unless someone can improve this script with some more advanced techniques which would be fantastic.

// GP5 Script: Update/Create Song Part Snapshots
Var updateSongParts : Widget  // Declare updateSongParts as a Widget
Var songCount : integer = GetSongCount()

// Function to update/create song part snapshots for each song part
Function UpdateSongPartSnapshots()
    Var songIndex : integer
    Var partIndex : integer
    Var songName : String
    Var songPartName : String
    Var partCount : integer
    Var snapshotName : String  

    // Loop through the songs
    For songIndex = 0; songIndex < songCount; songIndex = songIndex + 1 Do
        // Get the number of song parts for the current song
        partCount := GetSongPartCount()

        // Loop through the song parts
        For partIndex := 0; partIndex < partCount; partIndex := partIndex + 1 Do
            // Construct a snapshot name
            songName := GetSongName(songIndex)
            songPartName := GetSongPartName(partIndex)
            snapshotName := songName + " - " + songPartName

            SetSongPart(partIndex)
            Sleep(400)

            //Update the current Song Part
            TakeSongPartSnapshot()
            

            Print("Updated snapshot for: " + snapshotName)
        End
    
        //Advance to next song - but only if not the last song
        If songIndex < songCount - 1 Then
            NextSong()
        End
    End
End

// Main script execution triggered by a widget's value change
On WidgetValueChanged (newValue : double) from updateSongParts
    UpdateSongPartSnapshots()
End

one more improvement
i was able to increase the script speed by 10 times by distributing the two Sleep(20) statements instead of the Sleep(400)
One Sleep(20) statement after SetSongPart(partIndex)
Another Sleep(20) statement after TakeSongPartSnapshot()

so now not only does it work - but it works fast.
enjoy! :clinking_glasses:

1 Like