Best way to setup two individual keyboards

Hello,
an absolute GP newbie here.

I have two keyboards and some VST plugins (Omnisphere, Keyscapes, some Kontakt Libraries). The music I’m playing is highly improvised, and I need to be able to control the keyboards independently. Basically I just need have cca 15 sounds loaded for each of the keyboards, and switch between these independently.

I’m currently using Ableton with some custom scripting and the Lemur app for this, but the setup is getting too complicated. What would be the ideal way to setup this with GP? Rack for each of the sounds and two separate instances of GP for the two keyboards? Any more streamlined way?

Thanks for help!
Vaclav

In the Rig Manager in the left side you should see your Midi Devices - the 2 keyboards.
This 2 devices you can use in your rack spaces.

1 device for piano (for example on the lower keyboard) and 1 device for strings.
You would use different midi ins in your rackspace and connect your plugins with the
desired midi in.

Thanks, but as far as I understand, that won’t allow me to switch the sounds for each of my keyboards separately, right? As said, I need to be able to control each of the keyboards without affecting the other.

I do not understand: switch the sounds for each keyboard?
…control each of the keyboards…

In my case the keyboards control GigPerformer and not vice versa.

If you want to control what each keyboard does completely independently of other keyboards, then you could certainly use a separate instance for each keyboard. I assume for example that you want to be able to do things like have keyboard A do strings, then later do organ, then later do piano, while keyboard B (for example) is tied to the same synth sound and then vice versa.

Yup, I need exactly what @david said. Should each sound be as separate rack, or is there a better way to do this? I saw there are rack variations, there might be something else… Any ideas?

Depends completely on what are your sounds? For example, if you have a Rhodes piano and you sometimes want flanging, other times you want phasing, then you might have a single rackspace with your piano and both those effects and then use different variations to turn them on or off.
On the other hand, if your sounds are completely different, then it makes more sense to use different rackspaces.
There is no right (or wrong) way to do this and you’re going to want to experiment to find what works best for your particular environment.

Nothing like try it for your self @vaclavgreif :wink: and if any though just leave a comment!
Demo here:
https://www.gigperformer.com/downloads.html

Yup, gonna try the demo. One more question though - what about multichannel plugins like Kontakt or Omnisphere - is there any preferred way to setup these to save some CPU?

Thanks!

No preferred way. As mentioned before, it totally depends on how you need to use plugins. For example, plugins in rackspaces other than the one in use don’t use any CPU (except momentarily if you’re using Patch Persist) and Kontakt has very little overhead. Omnisphere tends to use a lot more CPU than does Kontakt and in fact I’ve often sampled the notes of a sound I like in Omnisphere and then just pulled them into Kontakt so that I don’t have to use Omnisphere live. NB I was doing that long before Gig Performer was around.

Thanks david.

OK, I have two instances of GP, each loaded with few sounds for one keyboard. So far it works great.

Now, I need to be able to switch the racks from my tablet, using Lemur (the interface is really simple as in the screenshot, just buttons for switching the sounds). I used to switch the sounds by sending MIDI Program changes, but I can see GP supports OSC messages. There is even a command for switching the rack, /GigRack/SwitchToRack [index].

Now, I need to switch sounds on two instances of GP. Is there a way to set this up using OSC, MIDI Program Changes or other method?

Thanks

You can do either or both. Each GP instance has a separate OSC listening port so your Lemur can send separate commands to each instance.
Same goes with MIDI. You would go into Options->MIDI settings and make sure that one instance listens for program changes from one set of devices and another one from the second set of devices. This could be as simple as your keyboard A and B. So when you send a PC message from a certain device - only that instance of GP will react.

Very cool. Any tutorial on how to setup that? I found the https://www.gigperformer.com/using-lemur-with-gig-performer, which is not really specific on the setup.

You can find the OSC related documentation starting around page 78 of our user guide which can be found here https://www.gigperformer.com/downloads/docs/GigPerformerUserGuide2_4.pdf

Hello,
thanks, almost there. I am sucessfully able to switch the racks using the tablet, using these settings

It does not seem to be possible to se the address as “/GigPerformer/SwitchToRack 1”, as Lemur strips the space. When I set the scale to “Rack no. minus one”, it started to work.

Some more questions:

  • how can I capture the button status? I want to have the button highlighted when the respective rack is selected
  • how can I send the instrument (rack) name to the Lemur?
  • how should I pass the variation from Lemur?

These are the last points to address before switching from Ableton to Gig Performer - the workflow in GP is way more streamlined and easier to setup…:slight_smile:

Thanks!
V.

Try to use this Lemur Template.
With this 4 buttons I can locate rackspaces in GigPerformer (This is the content of the Lemur File, that can be used in the Lemur Editor).
In the OSC Setup of GigPerformer you have to check “Lemur style string format”

<JZML>
<PROJECT version="5200" width="1024" height="724" osc_target="-1" midi_target="-1" kbmouse_target="-1" skin="Pixel"/>
<WINDOW class="JAZZINTERFACE" text="Default" x="0" y="0" width="1024" height="724" state="1" group="0" font="tahoma,11,0" >
<WINDOW class="Pads" text="Pads" x="75" y="56" width="60" height="60" state="1" group="0" font="tahoma,10,0" send="1" osc_target="-2" midi_target="-2" kbmouse_target="-2" capture="1" color="865343,1596013" column="1" label="0" multicolor="0" multilabel="0" row="1">
<PARAM name="x=" value="0.000000" send="29" osc_target="1" osc_trigger="2" osc_message="/GigPerformer/SwitchToRack" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" osc_scale="0.000000,0.000000" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="attack=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads/attack" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="decay=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads/decay" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="sustain=1" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads/sustain" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="release=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads/release" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="hold=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads/hold" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="light=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads/light" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
</WINDOW>
<WINDOW class="Pads" text="Pads2" x="156" y="56" width="60" height="60" id="1" state="1" group="0" font="tahoma,10,0" send="1" osc_target="-2" midi_target="-2" kbmouse_target="-2" capture="1" color="865343,1596013" column="1" label="0" multicolor="0" multilabel="0" row="1">
<PARAM name="x=" value="0.000000" send="29" osc_target="1" osc_trigger="2" osc_message="/GigPerformer/SwitchToRack" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" osc_scale="0.000000,1.000000" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="attack=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads2/attack" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="decay=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads2/decay" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="sustain=1" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads2/sustain" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="release=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads2/release" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="hold=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads2/hold" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="light=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads2/light" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
</WINDOW>
<WINDOW class="Pads" text="Pads3" x="237" y="56" width="60" height="60" id="2" state="1" group="0" font="tahoma,10,0" send="1" osc_target="-2" midi_target="-2" kbmouse_target="-2" capture="1" color="865343,1596013" column="1" label="0" multicolor="0" multilabel="0" row="1">
<PARAM name="x=" value="0.000000" send="29" osc_target="1" osc_trigger="2" osc_message="/GigPerformer/SwitchToRack" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" osc_scale="0.000000,2.000000" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="attack=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads3/attack" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="decay=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads3/decay" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="sustain=1" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads3/sustain" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="release=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads3/release" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="hold=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads3/hold" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="light=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads3/light" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
</WINDOW>
<WINDOW class="Pads" text="Pads4" x="322" y="56" width="60" height="60" id="3" state="1" group="0" font="tahoma,10,0" send="1" osc_target="-2" midi_target="-2" kbmouse_target="-2" capture="1" color="865343,1596013" column="1" label="0" multicolor="0" multilabel="0" row="1">
<PARAM name="x=" value="0.000000" send="29" osc_target="1" osc_trigger="2" osc_message="/GigPerformer/SwitchToRack" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" osc_scale="0.000000,3.000000" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="attack=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads4/attack" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="decay=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads4/decay" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="sustain=1" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads4/sustain" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="release=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads4/release" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="hold=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads4/hold" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
<VARIABLE name="light=0" send="0" osc_target="0" osc_trigger="1" osc_message="/Pads4/light" midi_target="-1" midi_trigger="1" midi_message="0x90,0x90,0,0" midi_scale="0,16383" kbmouse_target="-1" kbmouse_trigger="1" kbmouse_message="0,0,0" kbmouse_scale="0,1,0,1"/>
</WINDOW>
</WINDOW>
</JZML>

With scripting that should be possible, I tested with a simple one to see what happens when a gig is loaded:

initialization
Print(GetRackspaceName())
end

In the script logger window each rackspace name is shown when the gig is loaded.
So when you use the functions to send OSC strings with you should be able to show
the rackspace names on the buttons in Lemur.

Hello,
thanks so much for help. For the patch switching, it works for me, what does not work is linking the button state to the selected rack.

What I need is:
I press the button, ie. Piano, the rack changes, the button is highlighted (active). I select another patch, ie. Clavinet, the Piano button should return to the initial state and Clavinet button should be highlighted. Of course, I have two keyboards, so always two buttons should be active on the screen.

Any idea how to set this up?

I’ll check the GP scripting, I’m a PHP developer, let’s see where I get with sending the OSC messages…:slight_smile:

That’s very odd, although I must admit that Lemur scripting is rather awkward. Have you checked with the Lemur people about this? Also, is it possible that the argument has to be specified separately from the address?

Note that you don’t have to use program numbers when you use OSC. You can actually use the name of the rack as the OSC argument.

Here is the most recent list of OSC messages that are understood by Gig Performer directly as of version 2.4

If you use GP Script, which is most certainly aimed at advanced users with a programming background, then you can define your own addresses and respond to them and you can also send out arbitrary OSC messages.

Please understand that we don’t provide any official support for programming in GP Script. If we did that, we would have no time to write Gig Performer code itself :slight_smile:

1 Like