You would have to configure your keyboard to send program change messages. Or use an external program like Bohme Midi Translator in betweeen your Keyboard and Cubase. The Midi Remote Tab inside Cubase can’t translate Midi Notes into Program Change Messages.
And then setup your expression map to react on program change messages rather than keyswitches (But the Expression map reacts to either Keyswitches or Program Change you can’t have both)
Help me understand. If you ran out of keyboard keys to use key switches, how is sending program change messages from keyboard keys going to help? You still have the same number of keyboard keys at your disposal, no?
The problem I have is that using the keys as “keys” I run into a problem with the keyboard being filled up with key switches and I want to get away from that. So I want my keyboard to pretend to be a little keyswitch box, and then voila, no more running into my key switches while I’m playing the piano.
It can, but you would need a loopback MIDI port for that. The trick is to send the program change to this MIDI Port, which then will act as an input port for Cubase.
Here’s a snippet translating all notes of channel 0, to program changes, i.e. Note 0 (Vel>0)→PC 0 etc (tested):
var midiremote_api = require('midiremote_api_v1')
var deviceDriver = midiremote_api.makeDeviceDriver("Test","Note to PC","m.c")
var midiInput = deviceDriver.mPorts.makeMidiInput("anInput")
var midiOutput = deviceDriver.mPorts.makeMidiOutput("anOutput")
var detectionUnit=deviceDriver.makeDetectionUnit()
detectionUnit.detectPortPair(midiInput,midiOutput)
.expectInputNameEquals("loopMIDI Port") //NOT to be set in All Inputs, replace with the name of the port of your controller
.expectOutputNameEquals("loopMIDI Port 1") //SHOULD be set in All inputs
var surface=deviceDriver.mSurface
var mapping=deviceDriver.mMapping
for(var i=0;i<128;i++){
var key=surface.makeCustomValueVariable("key"+i)
key.mMidiBinding
.setInputPort(midiInput)
.bindToNote(0,i)
key.mOnProcessValueChange=function(activeDevice,value,diff){
if(value>0){
midiOutput.sendMidi(activeDevice,[0xc0,this.i])
}
}.bind({i})
}
var page=mapping.makePage("Default")
However, I would do this too in BMT, no real reason to add overhead with a remote exclusively for this thing.
That part I understood. I just don’t get how switching the keys from sending key switch commands using Note On messages to Program Change messages is going to free up any keys.
Just an idea: you could consider using multiple MIDI instruments with 8-10 articulations (keyswitches) per instrument. Then create an expression map for each instrument.
Are you programming the parts or performing them with live keyswitching?
If you are performing the parts, consider adding the articulations later.
My 2 cents.
spitfire bass library for example has so many key switches that they bump into the lowest bass note if I’m having key switches with my expression map.
In theory, I could use program changes and not accidentally start triggering key switches while I’m playing notes. Plus I’d have room for way more articulations.
Exactly! I’m performing the parts and composing etc. I want to be able to play every articulation in my library live and then record that.
8-10 fit on there at the bottom of the keyboard but for the lower instruments it doesn’t work. I could move the triggers up higher, but I want to be able to have one button for legato and one for pizz etc consistent across all my instruments, so relocating the key switches doesn’t work so good.
Thank you for clarifying your setup.
Here’s how I understand the issue. You have two MIDI Keyboards, one 61 key dedicated for expression map duties and one 88 key for playing notes on. If you use key switches, both keyboards will trigger key switches in the expression map since both keyboards connect to the same MIDI/Instrument Track. You would like to instead send program changes from the 61 key keyboard instead to avoid this.
The solution is to intercept the MIDI data and translate the MIDI Note On messages to PC messages before it reaches Cubase. You can do this by utilizing 3rd party tools such as BOME MIDI Translator Pro and a virtual MIDI Loopback driver such as loopMIDI.
BOME MIDI Translator Pro is available for purchase for both Windows and MacOS. If you’re on Windows, an alternative could be to use an AutoHotKey script with my MIDI Library. If this route is viable, below is a tested script that translates MIDI Note On messages from a specific MIDI Port and outputs Program Change messages on another.
AHK v2 - Note On to Program Change script
#SingleInstance force
#Requires AutoHotkey >=2.0
Persistent
#include <MIDIv2>
MIDI := MIDIv2()
; Replace "InputPort" and "OutputPort" below with actual port names
MIDI.OpenMidiIn(GetInputDeviceByName("InputPort"))
MIDI.OpenMidiOut(GetOutputDeviceByName("OuputPort"))
; MIDI In
MidiInNoteOn(e) {
MIDI.SendProgramChange(e.NoteNumber)
}
GetOutputDeviceByName(name) {
outputDevices := MIDI.GetMidiOutDevices()
Loop outputDevices.Length
if outputDevices[A_Index] = name
return A_Index - 1
MsgBox("Output device: " name " is not available.")
ExitApp
}
GetInputDeviceByName(name) {
inputDevices := MIDI.GetMidiInDevices()
Loop inputDevices.Length
if inputDevices[A_Index] = name
return A_Index - 1
MsgBox("Input device: " name " is not available.")
ExitApp
}