Switching racks no plugin sound

Randomly, when switching rack spaces, my Bias Fx2 plugin produces no sound until I open the plugin and go to another patch and back, then it works fine. It goes to the right preset, so its not a matter of calling up the wrong preset, but doesn’t load it properly until I manually go up/down to another preset and back.

Another similar symptom is loading the wrong “scene” sound. In Bias Fx2 there are 4 different scenes that can be saved within each preset. Same idea as variations in GP. In my case, The first variation in the rack is scene 1, second var is scene 2 etc… So when switching to var 1 from another rack space, it might call scene 2 instead of scene 1.

Its totally random, but makes me very nervous using it live. I have 11 rack spaces in total and I yet to be able to go through all of them without one of the above issues. Any idea what it could be and I could do differently to avoid this? Thanks!

How to you recall scenes in Bias Fx2 by switching to different variations?

You can set CC’s in Bias to switch to different scenes. I use a widget in GP to send those CC’s. I can usually get through switching 4-5 rack spaces and it all works flawlessly. Then randomly I go to a rack space and I experience those issues. If then I go to Bias Fx and go out and back into the preset, it works fine again. I go out of that rack space and back again and it works. But at some point it wont… Basically the settings don’t get loaded properly at times…

OK, when you include the midi monitor after the Midi In plugin connected to Bias FX2,
do you see the correct CC Messages?

And when you switch variations within your rackspace, what does Bias do?
Is the switching of scenes correct?

Are you using predicitve Load?

I think your last question might be the key. I just switched predictive loading off, reloaded GP and went through all the racks, variations/scenes without a glitch. Hm… It makes sense since it did seem to be a loading issue. I’ll keep testing to make sure I can reproduce it faithfully. What is different when loading everything all at once at startup vs predictive loading during use? Other than the obvious, that only a number of racks get loaded at once. Why would it not load properly during predictive loading?

Maybe a timing issue?
Maybe some plugins do not like to be loaded/initialized then unloaded and loaded again.

I am pretty certain it was the predictive loading feature. Ever since I turned it off, all racks are loading fine. On one hand its too bad b/c I really liked that feature. On the other hand I feel much better knowing what it was and what I need to do about it to trust the reliability of the system live. I much prefer loading gig files with fewer racks than having no sound when playing live!!! :slight_smile:

I use BIAS FX2 also, and have found that widgets are not a good way to change scenes. A cleaner, more reliable method is through scripting.

Var
   SceneBlock : MidiInBlock
   a : ControlChangeMessage
   b : ControlChangeMessage
   c : ControlChangeMessage
   d : ControlChangeMessage

// Set CC messages
initialization
 a = MakeControlChangeMessage(20, 127)
 b = MakeControlChangeMessage(21, 127)
 c = MakeControlChangeMessage(22, 127)
 d = MakeControlChangeMessage(23, 127)
end
// Called when you switch variations
On Variation(oldVariation : integer, newVariation : integer)
If newVariation == 0 then
SendNow(SceneBlock,a)
elsif newVariation == 1 then
SendNow(SceneBlock,b)
elsif newVariation == 2 then
SendNow(SceneBlock,c)
elsif newVariation == 3 then
SendNow(SceneBlock,d)
End
End

In the example above, I have created a MIDI IN block (SceneBlock) and connected it to the BIAS FX2 plugin block. In FX2 I set up scene 1 for CC20, scene 2 for CC21, scene 3 for CC22, and scene 4 for CC23.

There are 4 different variations, and upon each one being activated, the corresponding CC number is sent to the MIDI In Block attached to FX2.

2 Likes

That’s really cool! I’m assuming your SceneBlock is a virtual midi in port?

The way I’m doing it now is I created a virtual midi in block connected to a midi filter block going to Bias. I have a button widget always ON sending CC#3 (could by any CC) then another knob widget controlling the filter block, routing those CC#3’s to the corresponding scene CC#'s (in your case it would be 20-23). For each variation the knob is turned as needed. So far, with predictive loading OFF it’s been working fine, but I’ll all about reliability, so I appreciate the script!

I’m just curious, what was your old widget setup that wasn’t reliable? Similar to mine, or? Thanks!

That could be the root cause:
As all widget calls are asynchronous you can not trust that one or the other comes in a specific fixed order.
Therefore the scriping is the best solution.

Just because I am curious, can you test if this gig would work?
BiasCC.gig (8.2 KB)

@ztones I never actually completed a reliable widget setup for the scenes. I knew that ultimately it would involve some sort of ‘always on’ widget like you created, and felt I could probably find a better solution with scripting and variation activation. It’s great that your method is working for you—kudos on that—and of course if it becomes an issue you can refer to my script. As to your question, yes—my SceneBlock is a virtual MIDI In block.

@pianopaul I initially tried the method employed in your gig file listed above. The problem with BIAS Fx2 is that it treats CC events the same regardless of the value. Turn a widget on, it activates the event. Turn the widget off, it activates the same event. Since, as you stated, widget calls are asynchronous, it leads to a host of issues when trying to activate one CC event while changing other widget states that are tied to other CC events.

So the problem with your solution in the gig file with regards to Bias, as @edm11 pointed it out, Bias doesn’t need a 0 value sent out when you switch variations. I had this discussion in an earlier thread, but all Bias is looking for is a single CC of 127 value for the scene you want it to switch to. If at the same time it receives a CC of 0 value for the previous scene, it would be a crapshoot where it would end up.

In other words, in your example, when switching from var 1 to var 2, It sends CC#20 0 and CC#21 127. But all Bias wants is the CC#21 127, or more precisely, any value on CC#21, but no value on CC#20.

My widget solution to this is to have a button that’s always ON in every variation, sending CC#X. Then a rotary knob filtering those CC#X messages to the correct CC# for Bias. This way, GP only sends out a single CC#, not two. That’s the key.

As far as my original post/problem is concerned, it was loading related. My scenes work perfectly now with predictive loading turned off. I will try, perhaps with the script it might work even with predictive loading turned on.

@edm11, I decided to give your script a go (in place of my widget solution). However, I a getting an error by the compiler.

@pianopaul @edm11 interestingly, the scripts I have in this rack was written/came from each of you. I am now getting a “Semantic error: Line 65, Col 1: Initialization block already defined” I don’t yet know enough about scripting to figure this out . Here are the scripts. Any help would be appreciated!

var A : Widget
EA : ExternalWidget
B : Widget
EB : ExternalWidget
C : Widget
EC : ExternalWidget

va : double
vb : double
vc : double

initialization
va = A.GetWidgetValue()
vb = B.GetWidgetValue()
vc = C.GetWidgetValue()
end

on Activate
if BindExternalWidget(EA, “A”, “Control”) then
A.SetWidgetValue(GetExternalWidgetValue(EA))
end

if BindExternalWidget(EB, “B”, “Control”) then
Print(“On Activate B”)
B.SetWidgetValue(GetExternalWidgetValue(EB))
end

if BindExternalWidget(EC, “C”, “Control”) then
Print(“On Activate C”)
C.SetWidgetValue(GetExternalWidgetValue(EC))
end
End

// Called when a widget value has changed
On WidgetValueChanged(newValue : double) from A
if newValue <> va then
SetExternalWidgetValue(EA, newValue)
va = newValue
end
End

On WidgetValueChanged(newValue : double) from B
if newValue <> vb then
SetExternalWidgetValue(EB, newValue)
vb = newValue
end
End

On WidgetValueChanged(newValue : double) from C
if newValue <> vc then
SetExternalWidgetValue(EC, newValue)
vc = newValue
end
End

//******************Bias Scene Selection
Var
SceneBlock : MidiInBlock
a : ControlChangeMessage
b : ControlChangeMessage
c : ControlChangeMessage
d : ControlChangeMessage
// Set CC messages
initialization
a = MakeControlChangeMessage(11, 127)
b = MakeControlChangeMessage(12, 127)
c = MakeControlChangeMessage(13, 127)
d = MakeControlChangeMessage(14, 127)
end

// Called when you switch variations
On Variation(oldVariation : integer, newVariation : integer)
If newVariation == 0 then
SendNow(SceneBlock,a)
elsif newVariation == 1 then
SendNow(SceneBlock,b)
elsif newVariation == 2 then
SendNow(SceneBlock,c)
elsif newVariation == 3 then
SendNow(SceneBlock,d)
End
End

There can only be one initialization instance in a script. Since you combined 2 different scripts, there were two references to initialization. I also moved all the Variable declarations from the second script up top to the first.
Try this:

var A : Widget
EA : ExternalWidget
B : Widget
EB : ExternalWidget
C : Widget
EC : ExternalWidget

va : double
vb : double
vc : double

SceneBlock : MidiInBlock
a : ControlChangeMessage
b : ControlChangeMessage
c : ControlChangeMessage
d : ControlChangeMessage

initialization
va = A.GetWidgetValue()
vb = B.GetWidgetValue()
vc = C.GetWidgetValue()
a = MakeControlChangeMessage(11, 127)
b = MakeControlChangeMessage(12, 127)
c = MakeControlChangeMessage(13, 127)
d = MakeControlChangeMessage(14, 127)
end

on Activate
if BindExternalWidget(EA, “A”, “Control”) then
A.SetWidgetValue(GetExternalWidgetValue(EA))
end

if BindExternalWidget(EB, “B”, “Control”) then
Print(“On Activate B”)
B.SetWidgetValue(GetExternalWidgetValue(EB))
end

if BindExternalWidget(EC, “C”, “Control”) then
Print(“On Activate C”)
C.SetWidgetValue(GetExternalWidgetValue(EC))
end
End

// Called when a widget value has changed
On WidgetValueChanged(newValue : double) from A
if newValue <> va then
SetExternalWidgetValue(EA, newValue)
va = newValue
end
End

On WidgetValueChanged(newValue : double) from B
if newValue <> vb then
SetExternalWidgetValue(EB, newValue)
vb = newValue
end
End

On WidgetValueChanged(newValue : double) from C
if newValue <> vc then
SetExternalWidgetValue(EC, newValue)
vc = newValue
end
End

//******************Bias Scene Selection

// Called when you switch variations
On Variation(oldVariation : integer, newVariation : integer)
If newVariation == 0 then
SendNow(SceneBlock,a)
elsif newVariation == 1 then
SendNow(SceneBlock,b)
elsif newVariation == 2 then
SendNow(SceneBlock,c)
elsif newVariation == 3 then
SendNow(SceneBlock,d)
End
End

Thanks for the super quick response! Awesome, I see what you needed to do. Learning!
Now I am getting this message:
Syntax Error: Line 29, Col 27: Unexpected or unrecognized token:
Token recognition error at: ‘“’

This is Line 29:
if BindExternalWidget(EA, “A”, “Control”) then

Odd since this syntax was just copied over and it was fine before…

Nevermind… I just copied and pasted that entire part of the original script into its place and now its working. Somehow between the copy and paste’s back and forths the characters got messed up??? I did notice that when I type the quote symbol " (which was the 27th character) it looks slightly different in the script editor than the original quote. Also, when I paste here in the forum, the formatting of the " changes to look like what I can type. So seems like the formatting changed???

Is the new script working for you now?

Not yet. I put a midi monitor block after the virtual midi in block and its not getting anything. Here is what I did. I created a virtual midi in block, named the handle SceneBlock and checked “use in script”. What else do I need to do?

OK, its working…not sure what happened, but getting the CC messages in midi monitor. Is there a way to send them on channel 10 instead of 1? I had Bias set to ch10, but I just changed it to receive on all channels and its working beautifully! Great! Although it was working much better, I was still getting an occasional sound/loading issue with Bias, hoping this will eliminate it. As an extra bonus, I can get rid of couple of widgets!

Thank you for providing this script! :slight_smile:

1 Like

BTW, slightly off topic, but I just tried to use the midi in block’s own routering setup to change incoming ch 1 to ch 10, but it doesn’t allow that. If it can’t be re-routed, then not sure what the purpose of the “destination channels (click to change)” is?