My first song part recall the Rackspace variation when coming back to a song

Hi everyone,
I’m facing a curious behavior in Gig performer, setlist view:
Even if I capture the variation into my first song part, I play and change song parts until the end of the song, when I hit next song button, but If I come back to this same song after (in rehearsal for example), the first song part of which I saved the variation will (after a very short delay) reload the original variation, not the song part that I captured.
I made a short video here: https://www.youtube.com/watch?v=87kBjvdEuqU

Any idea of which option or bug could cause that?

Thanks !

check if your widgets are set to ignore variations, they should not

Hi @pianopaul , thanks for your answer. I checked, none of my widgets ignore variations.
Here is the options linked to the first “bugged” LED (I forgot to tell it’s mapped on a “bypass plugin” from a VSTi ):

I noticed something new: this only happens on song change. Once I got back in the song (so, in bugged state), if I go in another song part and get back to this one, it loads the correct song parts.

Can you upload a small gig file, so I can reproduce the issue?

Ok, while trying to lighten the project, I noticed that, somehow the issue is bound to the global rackspace script (Step player that @schamass created in this topic)
If I remove this script, the behaviour return to normal.
I paste here my whole global rackspace script if it can help.

Var
  lblStatus, btnSkip, btnPlayAndStep, btnResetToOne : Widget

  btnPlayingAP1, btnPlayingAP2, btnPlayingAP3, btnPlayingAP4, btnPlayingAP5, btnPlayingAP6,  btnPlayingAP7, btnPlayingAP8 : widget
  lblReady1, lblReady2, lblReady3, lblReady4, lblReady5, lblReady6, lblReady7, lblReady8 : widget
  lblFile1, lblFile2, lblFile3, lblFile4, lblFile5, lblFile6, lblFile7, lblFile8 : widget
  ledLoaded1, ledLoaded2, ledLoaded3, ledLoaded4, ledLoaded5, ledLoaded6, ledLoaded7, ledLoaded8 : widget
  PlayPos1, PlayPos2, PlayPos3, PlayPos4, PlayPos5, PlayPos6, PlayPos7, PlayPos8 : widget

  ButtonsPlayingArray : widget array = [btnPlayingAP1, btnPlayingAP2, btnPlayingAP3, btnPlayingAP4, btnPlayingAP5, btnPlayingAP6, btnPlayingAP7, btnPlayingAP8]
  LabelsReadyArray : widget array = [lblReady1, lblReady2, lblReady3, lblReady4, lblReady5, lblReady6, lblReady7, lblReady8]
  filesArray : widget array = [lblFile1, lblFile2, lblFile3, lblFile4, lblFile5, lblFile6, lblFile7, lblFile8]
  LoadMarkersArray : widget Array = [ledLoaded1, ledLoaded2, ledLoaded3, ledLoaded4, ledLoaded5, ledLoaded6, ledLoaded7, ledLoaded8]
  PlayPositionsArray : widget array = [PlayPos1, PlayPos2, PlayPos3, PlayPos4, PlayPos5, PlayPos6, PlayPos7, PlayPos8]

  activetrack : integer = 0 //counting starts at 0
  colRed, colYellow, colGreen, colGrey : integer

  //user function to zero playpositions
  function ResetPlayPosition(track : integer) //if track = -1 then Reset all tracks, else reset specific track
  var index : integer
  if track == -1 then
    for index = 0; index < Size(PlayPositionsArray); index = index +1 Do
      SetWidgetValue (PlayPositionsArray[index], 0)
    end
  else
    SetWidgetValue (PlayPositionsArray[track], 0)
  end
 End

//user function to stop playheads
function StopPlayhead(track : integer) //if track = -1 then stop all tracks, else stop specific track
var index : integer
  if track == -1 then
    for index = 0; index < Size(ButtonsPlayingArray); index = index +1 Do
      SetWidgetValue (ButtonsPlayingArray[index], 0)
    end
  else
    SetWidgetValue (ButtonsPlayingArray[track], 0)
  end
End

//user function to set & color the active lane/track
function SetActiveLane (lane :integer)
var index : integer
  for index = 0; index < Size(LabelsReadyArray); index = index +1 Do
    if lane <> index then
      SetWidgetFillColor(LabelsReadyArray [index], colGrey)
    else
      SetWidgetFillColor(LabelsReadyArray [index], colYellow)
    end
  end
  SetWidgetLabel (lblStatus, “Ready to play Track#” + (lane+1))
End

Initialization
  colRed = RGBToColor(0.8, 0.0, 0.0, 1.0)
  colYellow = RGBToColor(0.8, 0.8, 0.0, 1.0)
  colGreen = RGBToColor(0.0, 0.6, 0.0, 1.0)
  colGrey = -12829636 //default “grey” value, read from a label widget with “GetWidgetFillColor(lblFile1)”

  SetActiveLane (0) //counting starts at 0
  SetWidgetLabel (lblStatus, "Click the large boxes in the middle to open the player and load a file!")

End

        // -----------Previous name : "btnStepOn"

On WidgetValueChanged (bval : double) from btnPlayAndStep
var actualtrack : integer =0
  if bval > 0.6 Then
    if GetWidgetLabel(LoadMarkersArray[0]) == “0.00” then
    SetActiveLane(0)
    SetWidgetLabel (lblStatus, “Track #1 must not be empty! Please load a file in Player1 / Lane 1! Then save and reload your gig.”)
    else
      //Set the regarding play-button to ON
      SetWidgetValue (PlayPositionsArray[activetrack], 0) //reset play position before play
      SetWidgetValue(ButtonsPlayingArray[activetrack],1.0)
      actualtrack = activetrack // store actual track# for status message

        //check if we reached the end of the available track numbers
        //if not switch one further
        if activetrack == Size (LoadMarkersArray)-1 then
            activetrack = 0
        else
            activetrack = activetrack +1
        end

        //check if actual lane is loaded with a file, if not find the next loaded lane
        if GetWidgetLabel(LoadMarkersArray[activetrack]) == "0.00" then
            While activetrack < Size (LoadMarkersArray)-1 and GetWidgetLabel(LoadMarkersArray[activetrack]) == "0.00" Do
              activetrack = activetrack +1
            end
        end
        
        if activetrack == 7 then activetrack =0 end
            
        SetActiveLane(activetrack)
        SetWidgetLabel (lblStatus, "Playing Track #" + (actualtrack+1) + " / Ready to play Track#" + (activetrack+1))
    end
  end
End

        //New Skip button, maybe there are some unescessary code lines

On WidgetValueChanged (bval : double) from btnSkip
var actualtrack : integer =0
  if bval > 0.6 Then
  if GetWidgetLabel(LoadMarkersArray[0]) == “0.00” then
    SetActiveLane(0)
    SetWidgetLabel (lblStatus, “Track #1 must not be empty! Please load a file in Player1 / Lane 1!Then change the rackspace and come back.”)
  else
    //Set the regarding play-button to ON
    SetWidgetValue (PlayPositionsArray[activetrack], 0) //reset play position before play
    actualtrack = activetrack // store actual track# for status message

        //check if we reached the end of the available track numbers
        //if not switch one further
        if activetrack == Size (LoadMarkersArray)-1 then
            activetrack = 0
        else
            activetrack = activetrack +1
        end

        //check if actual lane is loaded with a file, if not find the next loaded lane
        if GetWidgetLabel(LoadMarkersArray[activetrack]) == "0.00" then
            While activetrack < Size (LoadMarkersArray)-1 and GetWidgetLabel(LoadMarkersArray[activetrack]) == "0.00" Do
              activetrack = activetrack +1
            end
        end
        
        if activetrack == 7 then activetrack =0 end
            
        SetActiveLane(activetrack)
        SetWidgetLabel (lblStatus, "Track #" + (actualtrack+1) + " Skipped ! / Ready to play Track#" + (activetrack+1))
    end
  end
End

//pressing the Reset To One button
On WidgetValueChanged (bval : double) from btnResetToOne
  if bval >0.6 Then
    StopPlayhead(-1)//-1 means “all tracks”
    ResetPlayPosition(-1)//-1 means “all tracks”
    activetrack = 0
    SetActiveLane (0)
  end
End

//set label colors according to a track’s play button’s state
On WidgetValueChanged(w : Widget, index: integer, bval : double) from btnPlayingAP1, btnPlayingAP2, btnPlayingAP3, btnPlayingAP4, btnPlayingAP5, btnPlayingAP6, btnPlayingAP7, btnPlayingAP8
  if bval > 0.6 Then
    SetWidgetFillColor(LabelsReadyArray [index], colGreen)
    SetWidgetFillColor(filesArray [index], colGreen)
  else
    ResetPlayPosition(index)
    SetWidgetFillColor(LabelsReadyArray [index], colGrey)
    SetWidgetFillColor(filesArray [index], colGrey)
    if activetrack == 0 Then
      SetWidgetFillColor(LabelsReadyArray [0], colYellow)
    end
    SetWidgetLabel (lblStatus, “Ready to play Track#” + (activetrack+1))
  end
End

Hey Mathiross,

first of all - I have absolutely no idea how to correctly use scripting features in GP - so I cannot solve this behaviour problem you face here, but to me it looks like the script causes the little delay on changing the settings when reload the song.

It seems like GP first works the captured snapshot into the rackspace - then works global script which apparently “reloads” the initial rackspace.

Would it be possible for you to just save the correct setting of the 3 buttons “Faith of Anubis, Plectrum wah, Cosmic Flute” in the rackspace like you have to set them under song-intro?

A little difficult to explain what I mean:
-So go to rackspaces (like in the beginning of your clip)
-Select “Variation 1” and set the buttons like you want it to be on songpart “intro”.
I think you want Faith of Anubis “active”, Plectrum wah “active”, Cosmic Flute “inactive”
-Save the rackspace again

Now as this problem only seems to regard part 1 (intro) of the song I think you can then use your song like the way you wish without “killing” the global script.

Do you perhaps have a OSC/GPScript Name defined for the widget which are not behaving properly for you ? :thinking:

image

I checked this point, no other script names are in the concerned widget, thanks for the help !

I tried that some weeks ago and untill now, it’s how I got around the problem, thanks you @DerBecker

Thanks for your replies guys ! I checked again during a long residency I had with the band. I tried to remove all global script during a half day of rehearsal and I still had some issue with widgets not recalling CCs. I don’t know if it’s related or not. Maybe it already has be treated somewhere else but I could find nothing.
On a lot of song part, I capture widget state, for example my expression pedal at its maximum range, and then, mapped to the VSTi plugin Respiro, for example, to the Overdrive. At the moment I capture widget, I just moved the expression pedal, the widget state + the overdrive of the plugin are synched.
When I come back to the same song part later, the widget has recalled the 100% state of the exp pedal but inside the plugin, the overdrive is still at 0%. As soon I move physically the exp pedal, the widget + the plugin overdrive jump to the real state as expected.
Is there a way to send the CC states of a widget on each song part change?
Or should I create one Rackspace variation per song part? (and in this case, I don’t understand the meaning of the catpure function of the setlist tab)
Concerts are coming up, I would be happy to correct this point that steal a lot of concentration ! :sweat_smile:

Thanks in advance for you help
Mathieu

PS: I never have any issue like that when a widget is mapped to a GP mixing internal plugin

It could be that the plugin is not fully active when GP send it its widget value. Does it happen with any plugin or just a particular one? Which one?

Ok, GP already send widget values. (I don’t have to activate the " Follow hardware" ?)
I use only Respiro from Imoxplus, and Mini-V from Arturia, and actually, It happens only with Respiro.
What can I try?

When you move the widget the parameter in Respiro also changed, right?

Yes, from the widget itself or from its midi assignement. It’s only at the moment I enter a new song part that sometimes, it could be not synchronised with the plugin.

Ok, what means sometimes?
Always or never?

You can try to use this rackspace script
You have to give A as OSC/GPScript Name for your problematic widget
The trick is that the widget is moved to 0 and then to the desired value.
Maybe that helps

var A : Widget
    v : double

// Called when you switch variations
On Variation(oldVariation : integer, newVariation : integer)
 v = A.GetWidgetValue()
 A.SetWidgetValue(0.0)
 A.SetWidgetValue(v)
End

Because it happens on some other song part too. I get mad since long, capturing variation for nothing. always the impression it can’t recall all the time properly.
I can use your script, thanks but I would be happy to see it working the normal way.
I’ll try to create additional rackspace variation, one for each song part, maybe it help?
I’m in contact with Rudy, the creator of Respiro, what should I ask him? What’s the technical reason of this issue?

That only can be answered by the developers.

Does this only happen with captured widgets in the song parts or does that happen with rackspace variations also?

Difficult to say, my assumption is that it happens when you switch from a rackspace to another and not from a variation to another one within the same rackspace. Can you confirm this? In this situation I suppose that the Respiro plugin is not completely awake when the GP widget sends it a new parameter value. You could make a simple gig file to verify this theory, if it verifies that explain it to the Respiro Dev, if not, we have to think to something else… :thinking: