MIDI persist causing issues with hardware synth processing

My hardware synth goes through some global processing, then goes to the song rackspaces for song-specific effects, before coming back to the global rackspace for master processing. (I’m also using plugin synths, but they aren’t relevant to the issue)

The issue is that a couple of my rackspaces have midi persist enabled, and they continue processing the hardware synth even when I switch to a different rackspace. So I’m thinking of adding a gain plugin to each problem rackspace, with a widget that mutes the hardware synth when I deactivate that rackspace. Is this possible in GP essentials? Is there a better way of doing it?

I’ve been using GP for a few months now and never had a problem with MIDI patch persist until today. I think it’s because we changed the set order somehow?

What you’re describing actually sounds consistent with how MIDI Patch Persist works in Gig Performer.

When MIDI Patch Persist is enabled, the old rackspace doesn’t completely “let go” when you switch away from it. It keeps processing the held notes until the notes are released.

Your chain is:
Hardware SynthGlobal rackspace → (Song) RackspaceGlobal rackspace

The persisted rackspace continues affecting that hardware synth signal even after you’ve moved to another rackspace.

Yes, I realize this is probably intended behaviour, although it seems to continue processing long after sound has stopped. Is there a way to add a widget that will mute within the rackspace when I switch away from the rackspace?

Another option: Does the audio input block continue to function on a deselected rackspace? I could simply duplicate my global processing to the local rackspace for songs that require patch persist.

If I may provide feedback on this feature, it seems to me that patch persist should allow note off messages, and continue processing audio, but disable note on messages and audio input to a deselected rackspace.

Uhm, that’s exactly what it does. But it’s designed to handle persist for plugins in the old rackspace when switching to the new one.

It doesn’t seem to mute the audio in the “from global rackspace” block though. Which is what I’m suggesting it should do.

That block is relaying signal(s) from the Global rackspace, and as the manual states:
…While MIDI Patch Persist will work with multiple plugins when switching between two (possibly complex) rackspaces, plugins in the Global rackspace, however, cannot participate in the patch persist mechanism.

If you’re only sending audio signals from Global to local rackspaces, then MIDI Patch Persist isn’t going to do anything anyway. The Input Muting and Output Fading controls of each local rackspace handle the audio spillover from one local rackspace to another. You might experiment with some different routing schemes to accomplish what you’re looking to do.

Ok. It’s now working as I initially intended (with no changes), which has made me realize that I was actually experiencing a bug, and not a feature that I misunderstood.

Here is what I expected, based on my experience before I changed the order of the songs last week:

I play song A (rackspace A, patch persist enabled, includes audio processing of my hardware synth).

I play song B (rackspace B) Song B only has plugin synths, patch persist mutes rackspace A as soon as audio has stopped.

I play songs C, D, & E, all with their own rackspaces, patch persist varyingly enabled and disabled.

I play song F, which includes my hardware synth. Hardware synth should be processed by rackspace F and global rackspace only.

What actually happened yesterday, which I can’t recreate now, and have never experienced before:

I play song A.

I play songs B-E with no issue.

I play song F. Hardware synth is being processed by both rackspace A and F (as well as global). Extensive troubleshooting, muting and unmuting, nothing stops rackspace A from processing except disabling patch persist.

It’s fixed now so… :man_shrugging:

I get that blocks in the global rackspace can’t participate in patch persist, but the “from global rackspace” block is in the local rackspace, so I assumed it followed local rackspace rules.

It would be nice to have a “mute on rackspace deactivation” option on both the “from global rackspace” and “Audio in [interface]” blocks. It would be both a safety net against whatever I experienced yesterday, and could also address situations like the mic muting issue that was discussed last week.

I get exactly what issue you’re facing - I have experienced the same continuing audio throughput in long left rackspaces in the past. No, it could not be solved with the input muting and output fading controls.

My personal workaround has been the same ever since: a widget in each rackspace that mutes the from global audio input (using a gain block for up to two channels or a mixer block for more) when I leave the rackspace.

I have created an automated solution that only needs one global script which I’ve already described here somewhere. Will look for it when I’m at my PC,

This is what I was referencing to: Issue with audio from global rackspace
Here, user @JdP also faced this issue.

There are two solutions. What you need is a widget in each rackspace that mutes, for example, a gain block in the audio path to the rackspace.

  1. Script in each rackspace (more work) that mutes when you leave the rackspace:
    Issue with audio from global rackspace - #15 by Florian
  2. Only one script in the global rackspace (less work):
    In the global rackspace you need to add a short script that sets this widget to “mute” each time you leave a rackspace.
    The important part is that the muting widget is always given the same handle, like MUTE.
var ew : ExternalWidget

On Rackspace(oldRackspaceIndex : integer, newRackspaceIndex : integer)                 // When we switch to a new rackspace we check
    If BindExternalWidget(ew, "MUTE", GetRackspaceNameAtIndex(oldRackspaceIndex)) then // if the old rackspace included a widget with the handle "MUTE" and we
        SetExternalWidgetValue(ew,1)                                                   // set it to mute
    End
End

Here is a demo gig file:
AudioMute.gig (34.7 KB)

@Rowan_H

The reason that rackspace A is still processing is probably because at least one note still being held - note-on without a note-off or without a sustain-off CC, so this is probably a bug.

In that rackspace, are you doing any special MIDI processing, like a MIDI arpeggiator or customized filtered MIDI events?

@Florian

Are you able to reproduce the issue reported here? I ask as you wrote a workaround for it.

I’m blocking note on messages but allowing note off messages for one synth. When I switch away my foot is on the sustain pedal, but patch persist should handle that just fine.

There’s a long reverb tail at the end of the song, is it possible that the reverb plugin (TAL reverb 2 VST3) is remaining active?

As you may guess, it belongs in the category “cannot be reproduced reliably”. Had I been able to reproduce the issue, I probably would have looked for a solution, not a workaround.
But since this workaround works so smoothly, I have never bothered to fix it since 2023 (GP4).

Predictive loading was off, that I know for sure.
But your little technical insight that even the audio input muting waits for a note-off which it may have never received is helpful, too, and could be a possible explanation!

Good point, I will check it.
Is that reverb plugin at the local rackspace or at the global one?

It’s in the local rackspace.

Can you please try to temporary disable that reverb and see if the issue reproduces?
If the issue is not reproducing, then please try to set a reverb tail that fades out completely after few seconds and check again.

The issue hasn’t recurred, but if it ever does I’ll try disabling the reverb as my first course of action.