I would like to know if there is a tips to drive cursor on markers up to nine. I want to assign command on midi controller by using the remote tool to assign command to my foot midi controller.
I use Cubase pro 13 for live sessions to launch sequences by song. I already assigned 9 markers by assign shortcuts commands, using the midi remote interface. but only 9 shortcuts are available. to try to assign more markers, I tried to use the command “go to Marker X” but it need keyboard entry to tape markeur numbers up to 9. I tried to create macro command by assign “go to marker x” but I don’t see option to code additionnal combination to enter text directly in the macro. is there a solution to memorize marker number inside macro? if not, is there another way to assign markers up to 9 on midi remote system? assign script?
Hi and welcome to the forum,
Your observation is totally correct.
You would need a computer keyboard to insert the number. You cannot insert it via MIDI Remote.
Thanks for the answer, but It’s not a good news…i can’t imagine to type on the keyboard during the show…is there a solution to create other shortcurts by using API? If yes where can find tutoriel to do it?
Hi,
What exactly is your use case, please?
What about to use Project Logical Presets?
I have another Idea, it’s seems we can export the java script of my current settings able to drive markers 0 to nine. By edit the java script, check the command program codes for the existing shortcut, copy them and change marker numbers, save it and re-import in midi remote control…do you think it will work?
On my cubase project, I have all songs sequences. Each song start point are identified by markers. By the midi remote control I assigned each markets on a midi controller switch (FcB1010). I have also 2 switch assigned to start and stop songs. With this i can decide to launch the song I want in different order. With my footswich controller, also flexible during rehersal
How many markers are we talking about?
Hi,
For Marker 10, you can create a Macro:
- Marker 9
- Next Marker
For Marker 11, you can create a Macro:
- Macro Marker 10
- Next Marker
etc.
Then you can assign the macros to the commands.
Unfortunaly not because sometimes the set list changes with different songs.
Song 3, song 1, song 9, song 11 …not often but sometimes it changes.
For the moments 11 songs so 11 markers.
But it will increase later..
For the moment the only solution I found is to open the midi controller script made automatically by cubase with visual studio. I opened it to try to identify codes lines already assigned for markers from 1 to 9, in objective of copy same group of codes and modify to assign other markers and save it. It’s seems it will work but for the moment I’m not enough expert in Javascript…I must learn correspondance of cubase commands codes to identify them.
From what I see, your controller supports around 10 buttons. How are you planning to assign to more than, say, 10 markers? Or perhaps you want to assign your 10 buttons to specific markers?
It won’t. Cubase has dedicated commands for the first 9 markers.
A workaround would be to create more than one marker tracks, and have your controller trigger 1-9 markers, after you select another marker track.
Another option would be to take advantage of the internal feature of Cubase to handle 15 markers. This needs midi remote scripting. For more than that, you would either need an external utility executing a combi of CB commands and type writing, or try @Martin.Jirsak 's macro suggestion or use midi remote to memorise more markers and recall when needed. But then again, I don’t quite understand how you plan to do this, with this 10-buttons controller.
No the FCB1010 berhingrer has several bank pages.
Page 1: 1 to 10
Page 2: 1 to 10
Etc…
Cubase midi remote recognize notes signal from the controller.
I assigned note 0 to switch 1 (bank 0)
Note 1 to switch 2 (bank 0) etc..
Note 11 to switch 1 (bank 1)
Note 12 to switch 2 (bank 1) etc..
On the bank 0, the switch 9 and 10 are used to command play and stop.
It’s works. The only think little tricky is when I select song 11, i must back to page 0 (bank 0) to do play. I will probably invest in another controler with only 2 switches for separate play and stop.
It’s 10 physic buttons but with the pages (banks) it 10+ 10 + 10…
Yes you rights, Cubase made marker commands for markers 1 to 9. But these commands are for shortcuts. The script under them is composed of several sub commands “go to marker” + marker ID.
I asked ChatGPT and I see the command script under it. The thing not easy to compare the script from cubase remote control is because the codes inside are the short cuts commands, not the detailed command under. So I think I will try the chatgpt script code separately, and test only this. If it’s works, i will add this code fragement in the complete one. And see…
No, they’re commands, not necessarily meant to be triggered by shortcuts.
Alkistis (ChatGPT) is hallucinating.
If you really want to get into scripting, give this snippet a shot:
var midiremote_api = require('midiremote_api_v1')
var deviceDriver = midiremote_api.makeDeviceDriver('Test', 'Markers Extender', 'm.c')
var midiInput = deviceDriver.mPorts.makeMidiInput("midiInput")
var midiOutput = deviceDriver.mPorts.makeMidiOutput("midiOutput")
deviceDriver.makeDetectionUnit().detectPortPair(midiInput, midiOutput)
.expectInputNameEquals('Bome MIDI Translator 1')
.expectOutputNameEquals('Bome MIDI Translator 1')
var surface=deviceDriver.mSurface
//We press this button to start scanning for markers. Project start will always be set as the first marker even if it isn't, and project end will be set as the last marker
var scanMarkersButton=surface.makeButton(0,0,0,0)
scanMarkersButton.mSurfaceValue.mMidiBinding
.setInputPort(midiInput)
.bindToControlChange(0,21)
var scanLabel=surface.makeLabelField(0,0,5,1)
var markerButtons=[]
var markerLabels=[]
//buttons assigned to our markers
var maxNumOfMarkers=50
var columnsPerRow=10
for(var i=0;i<maxNumOfMarkers;i++){
var markerButton=surface.makeButton(0,0,0,0)
markerButton.mSurfaceValue.mMidiBinding
.setInputPort(midiInput)
.bindToControlChange(0,21+i)
markerButtons.push(markerButton)
var label=surface.makeLabelField(5*(i % columnsPerRow),Math.floor(i/columnsPerRow)+2,5,1)
markerLabels.push(label)
}
var customStop=surface.makeCustomValueVariable("customStop")
var customGoToStart=surface.makeCustomValueVariable("customVarGoToStart")
var customGoToEnd=surface.makeCustomValueVariable("customGoToEnd")
var customMarkerNext=surface.makeCustomValueVariable("customMarkerNext")
var customDelay=surface.makeCustomValueVariable("customDelay")
var customRestoreCursor=surface.makeCustomValueVariable("customRestoreCursor")
var mapping=deviceDriver.mMapping
var page=mapping.makePage("page")
var markers=[]
var scanning=0
var restoreCursorPoint=""
var projectEnd=""
scanMarkersButton.mSurfaceValue.mOnProcessValueChange=function(activeDevice,value,diff){
if(value==1){
//we begin scanning by first stopping the song if playing
customStop.setProcessValue(activeDevice,1)
}
}
page.makeCommandBinding(customStop,'Transport', 'Stop').mOnValueChange=function(activeDevice,activeMapping,value,diff){
if(value==1){
//after stopping playing, we move the cursor to the start of our project
customStop.setProcessValue(activeDevice,0)
scanning=2
customGoToEnd.setProcessValue(activeDevice,1)
}
}
page.makeCommandBinding(customGoToEnd,'Transport', 'Goto End').mOnValueChange=function(activeDevice,activeMapping,value,diff){
if(value==1){
customGoToEnd.setProcessValue(activeDevice,0)
customGoToStart.setProcessValue(activeDevice,1)
}
}
page.makeCommandBinding(customGoToStart,'Transport', 'Return to Zero').mOnValueChange=function(activeDevice,activeMapping,value,diff){
if(value==1){
customGoToStart.setProcessValue(activeDevice,0)
scanning=1
markers=[]
//once we are at the beginning of our project we begin scanning for markers, by using the command Transport->Locate Next Marker
beginScanning(activeDevice)
}
}
page.makeCommandBinding(customMarkerNext,'Transport', 'Locate Next Marker')
function beginScanning(activeDevice){
//we're adding a delay in order to prevent accidental jumps between markers without getting them in time
customDelay.setProcessValue(activeDevice,1)
}
customDelay.mOnProcessValueChange=function(activeDevice,value,diff){
value--
if(value>0){
customDelay.setProcessValue(activeDevice,value)
return
} else {
customMarkerNext.setProcessValue(activeDevice,1)
}
}
page.mHostAccess.mTransport.mTimeDisplay.mPrimary.mTransportLocator.mOnChange=function(activeDevice,activeMapping,newTime,unit){
//This event is raised whenever the cursor position changes
if(scanning==2){
projectEnd=newTime
} else if(scanning==1){
//since we're in scanning mode, we're adding the new position to our markers array
markers.push(newTime)
if (newTime==projectEnd){
scanning=0
customRestoreCursor.setProcessValue(activeDevice,1)
} else {
customDelay.setProcessValue(activeDevice,1)
}
} else {
//when we toggle scanning, we restore the cursor position before scanning
restoreCursorPoint=newTime
}
}
var customRestoreCursorHost=page.mCustom.makeHostValueVariable("customRestoreCursorHost")
page.makeValueBinding(customRestoreCursor,customRestoreCursorHost).mOnValueChange=function(activeDevice,activeMapping,value,diff){
if(value==1){
//The restore is done here
page.mHostAccess.mTransport.mTimeDisplay.mPrimary.mTransportLocator.setTime(activeMapping,restoreCursorPoint)
customRestoreCursor.setProcessValue(activeDevice,0)
}
}
page.setLabelFieldText(scanLabel,"CC 20 Scan")
for(var i=0;i<maxNumOfMarkers;i++){
page.setLabelFieldText(markerLabels[i],"CC "+(21+i)+" Marker "+(i+1))
//here we're assigning our buttons to the found markers
var customHostMarker=page.mCustom.makeHostValueVariable("customHostMarker"+i)
page.makeValueBinding(markerButtons[i].mSurfaceValue,customHostMarker).mOnValueChange=function(activeDevice,activeMapping,value,diff){
if(value==1 && markers.length>this.i+1){
page.mHostAccess.mTransport.mTimeDisplay.mPrimary.mTransportLocator.setTime(activeMapping,markers[this.i+1])
}
}.bind({i})
}
ChatGPT may be of help here, explaining the steps taken ![]()
Have you tried yo just use cycle markers that have the same start and end time? You can recall an additional 9 cycle markers just like regular markers.
Alternatively, you can define each song as an arranger event and trigger playback of 20 arranger events from keyboard shortcut or MIDI Remote.
Wow the script i found was so much smaller
// Initialisation de l’API
var deviceDriver = midiRemote.createDeviceDriver(“VotreMarque”, “ControlleurMarqueur”, “1.0”);
// Configuration des ports MIDI
var midiInput = deviceDriver.mPorts.makeMidiInput();
var midiOutput = deviceDriver.mPorts.makeMidiOutput();
deviceDriver.makeDetectionUnit().detectPortPair(midiInput, midiOutput)
.expectInputNameContains(“NomEntréeMIDI”)
.expectOutputNameContains(“NomSortieMIDI”);
// Configuration de la surface MIDI
var surface = deviceDriver.mSurface;
var markerButtons = ;
// Création de 4 boutons pour contrôler les marqueurs
for (let i = 0; i < 4; i++) {
markerButtons[i] = surface.makeButton(0, i, 1, 1);
}
// Assignation des boutons aux commandes “Aller au marqueur”
deviceDriver.mMapping.makeCommandBinding(markerButtons[0].mSurfaceValue, ‘Transport’, ‘Locate Marker 1’);
deviceDriver.mMapping.makeCommandBinding(markerButtons[1].mSurfaceValue, ‘Transport’, ‘Locate Marker 3’);
deviceDriver.mMapping.makeCommandBinding(markerButtons[2].mSurfaceValue, ‘Transport’, ‘Locate Marker 4’);
deviceDriver.mMapping.makeCommandBinding(markerButtons[3].mSurfaceValue, ‘Transport’, ‘Locate Marker 2’);
// Messages MIDI assignés aux boutons
midiInput.bindToControlChange(0, 10).connect(markerButtons[0].mSurfaceValue); // Bouton 1 → Marqueur 1
midiInput.bindToControlChange(0, 11).connect(markerButtons[1].mSurfaceValue); // Bouton 2 → Marqueur 3
midiInput.bindToControlChange(0, 12).connect(markerButtons[2].mSurfaceValue); // Bouton 3 → Marqueur 4
midiInput.bindToControlChange(0, 13).connect(markerButtons[3].mSurfaceValue); // Bouton 4 → Marqueur 2
// Description pour l’interface utilisateur
deviceDriver.setDeviceDescription(“Script permettant de contrôler 4 marqueurs avec un contrôleur MIDI.”);
Interesting, i never tried that. I will check your suggestion…