Is there a way to bulk copy song part actions across 100 songs? Maybe an extension or some sort of script approach. I assume the .gig file is not editable by hand.
I have 100+ songs I’m migrating from an Axe FX3. Every song has 5+ variations. I’m using a Polychrome HyperTune as a virtual capo because I have 8 different tunings I use throughout a single gig.
My initial approach was to create a local rackspace for each tuning by adjusting the HyperTune transpose widgets in each variation but this is going to become a maintenance nightmare whenever I need to make changes because I would have to replicate those across all rackspaces and variations.
One option is to use just one rackspace and have variations for each tuning. Once again, a maintenance nightmare because I would the have over 40 variations. Another option is to use MIDI or Song Part Actions to change the tuning directly on a single rack. That would only require one local rackspace and a minimum set of variations since I would be changing the transpose widget on the fly.
I chose Song Part Actions over MIDI to accomplish that simply because this communication is happening within my Mac mini so no need to transmit more MIDI than required.
Now the problem, I’m going to have to set a Song Part Action on over 500 times (100+ songs with 5+ song parts each). To make matter worse the Actions setting is two menus deep within each Song Part. I know there’s a copy/paste option there but it’s the amount of clicking into properties that’s going to be time consuming. A centralized property page set up like a spreadsheet would be ideal to see all my Song Parts and their settings.
I’m open to a better approach. I’ve considered GPScript but it doesn’t support multidimensional arrays or JSON so I don’t want to deal with maintaining long single dimension arrays because it easy to accidentally get them out of sync. I’m also a developer who hasn’t dabbled in C++ in a while but I would consider writing an extension to do this “bulk edit” of song part action properties if the SDK exposes this functionality.
Let me explain using the four songs below as examples and how I envisioned setting it up. This has been tremendously simplified to convey my use case.
In this example each song part will map to one of the three variations. If I decide to change my Overdrive variation settings in the future then I can change it in one place and that one change now propagates to all my songs. Keep in mind I have over 100 songs so this is important to me.
The challenge I have is that I use HyperDrive to change my guitar tuning across different songs. I’ve created widgets in my global rackspace and my local rackspace to control the tuning parameter of HyperTune. In order to minimize the number of local rackspaces and variations I thought it would be efficient to maintain just one local rackspace and each song part would simply modify the HyperTune widget to change the tuning. So technically two songs could have the same exact song parts however they only differ in th HyperTune widget tuning value.
I’m open to a more effective and efficient way to do this. I’m new to Gig Performer and my plan is to migrate off my Fractal Axe FX3 and use GP moving forward.
I solved the problem by writing an extension that parses the song part name and the song name. If they contain values in parenthesis like (-2) or (+1) or (-5) it will automatically adjust the widget to the proper tuning. If a song part does not have these parenthesis it will look up one level to the song title. If the song title doesn’t have it either it will just use the default tuning. This approach makes it very easy for me to update the tunings across 100 songs and be able to visually confirm it without going into property pages. Nice SDK BTW!
As mentioned in facebook (would be better to JUST post here, by the way )you do not need to write an extension to do this, GPScript is sufficent.
Below is (a) a function that takes a string, looks for left and right parentheses and extracts what’s inside them and then tries to convert to a number.
Below that function is a standard callback that triggers whenever you change song parts. You can just get the name of that song part, retrieve the value and then do whatever you need to a widget in the global rackspace
// Look for an integer inside parentheses and return it if there
Function ExtractIntegerFromParentheses(s : String) Returns Integer
var val : String
var left : integer
var right: integer
result = -9999 // An invalid number just for testing
left = IndexOfSubstring(s, "(", false)
if (left > -1)
then
right = IndexOfSubstring(s, ")", false)
if right > left + 1
then
result = StringToInt(CopySubstring(s, left+1, right - left -1))
end
end
End
// Called when you switch to another songpart
On Songpart(oldSongpartIndex : integer, newSongpartIndex : integer)
var i : integer = ExtractIntegerFromParentheses(GetSongPartName(newSongpartIndex))
Print(i)
End
This is great. So I can drop this in the global rackspace editor and extract the songpart name and the song name then parse each and then send the widget on the global rackspace the new tuning value?
BTW, I’ve been using Introduction to GPScript for Gig Performer for reference. I searched for IndexOfSubstring and StringToInt but nothing is found. Is there a more up-to-date reference that I should be using?
Thanks for all the help. I got the GPScript working where it first looks for the value in the song part name, then it looks at the song name and finally resorts to a default value if not found in either. Now I know how to implement this both ways: GPScript and C++. I’m loving this platform.