Control Surface for Bank and Program Changes

This is probably an FAQ but I haven’t found an optimal solution.
I play gigs where there is a large amount of improvisation. Therefore. I cannot use set list mode and create songs with specific structures tied to rackspaces.
On my old Motif it was easy to changes banks and patches. Buttons A-H for a bank and buttons 1-16 for patch changes within a bank. I’m looking for a control surface that would allow me similar functionality, or perhaps use the controls on my second tier Novation 61 mkiii controller.
Currently I have a knob on my S88 Native Instruments controller that allows me to scroll through all the rackspaces. Another knob scrolls through variations. But this method doesn’t work as well live when trying to pull up a specific rackspace.
Appreciate all suggestions.

In Gig Performer there are no banks and patches, only rackspaces and assigned program change numbers.

I think you could use the buttons on over the S88 display to select a rackspace and with a normal key you could select the variation within the rackspace.

Or you use an iPad with touchOSC then you are total free to design your perfect controller.

Right… no bank changes. I have 64 rackspaces all assigned a program change number.
Currently, two knobs on my S88 controller scrolling through the rackspaces and variations.
Trying to understand the best way of quickly being able to bring up a desired rackspace without having to scroll to reach it.

With the s88 I could imagine,

Press 1 of the 8 buttons and then a key.
This could compose a PC number and then select the rackspace.
So press button 1 and then C-2 => Rackspace 1
press button 1 and then F-2 => Rackspace 6
press button 2 and then D-2 => Rackspace 11

That sounds like a good solution. I think the only changes would be in the S88 template? Have to pull up the template and see if it’s possible to setup the two-step program change where an assigned button initiates it and the keyboard note selects the rackspace. Wonder if the button has a mode for keeping it pressed down while hitting the keyboard note…

This is the gig script used

var Bank : integer = 0
    TW   : MidiInDevice
    nn  : Integer

//Called when a CC message is received at some MidiIn device
On ControlChangeEvent(m : ControlChangeMessage) matching [20..27] from TW
 if GetCCValue(m) == 127 then
  Bank = GetCCNumber(m) - 20
 end 
end

//Called when a NoteOn message is received at some MidiIn device
On NoteOnEvent(m : NoteMessage) matching [C-2..G-2] from TW
 nn = GetNoteNumber(m) - C-2 
 InjectMidiEvent("Local GP Port", MakeProgramChangeMessage(8 * Bank + nn))
End

In Rig Manager you have to define your MIDI Device, in my case it is called TW
And matching [20…27] you can adjust to the CC you defined in your S88 Template
And then adjust the number 20 for the bank calculation accordingly.

In the global MIDI options you have to make sure that PC messages are accepted by the Local GP Port.

I simulated with Ableton Live and it was working OK.

Thank you. I understand scripting. It looks like the S88 controller button would send a CC change, not a program change, and within Gig Performer I would internally set a “bank” value from which to calculate the program change number based on a note event.
If this is true, what I don’t understand is how the script can distinguish between note events associated with a program change and events that are regular note on/off events for playing.
I have all my hardware devices defined in Rig Manager.

That could be handled by a semaphore.
So when a control change message is reached, the next note on message is for changing rackspace.
As soon as the rackspace change is done, the note on message does not change the rackspace but play the note.

Best would be you take a range of note you never use for normal playing.
But then you allways have to press the Button on your S88 followed by a note number.

Another Idea:

Press a button and the bank is remembered
Press the same or another button then PC message is constructed and the rackspace is switched.

This way you can address 8x8 rackspaces, not need for pressing a note number.

With this script only pressing buttons selects the rackspace

var Bank : integer = 0
    TW   : MidiInDevice
    nn  : Integer
    
    Bank_OK : boolean
    
// Called automatically after script is loaded
Initialization
 Bank_OK = false
End

//Called when a CC message is received at some MidiIn device
On ControlChangeEvent(m : ControlChangeMessage) matching [20..27] from TW
 if GetCCValue(m) == 127 then
  if Bank_OK == false then 
   Bank = GetCCNumber(m) - 20
   Bank_OK = true
  else
   nn = GetCCNumber(m) - 20
   InjectMidiEvent("Local GP Port",
                    MakeProgramChangeMessage(8 * Bank + nn))
   Bank_OK = false
  end
 end 
end
1 Like

I like that idea. I will experiment Sunday afternoon.

1 Like

Yes, this works… thanks so much for the script. It saved me a lot of time.
I may switch to using the top Novation SL mkiii controller pads instead since that controller has 16 and therefore could adjust the script to handle 128 rackspaces.
I’ve always had difficulty controlling the button state with the NI S88. I setup the buttons in trigger mode. I expected a button to light briefly when pressed then turn off. However, the buttons stay illuminated.
The other thing NI does is save the template state. So if I power off the unit and turn it back on the buttons and knob values go to the saved state instead of an initial value. I couldn’t find any options in Komplete Kontrol to fix this. Gig Performer has various options for controlling widget state values. NI seems to force last used value.