What's new

Open Stage Control (Tutorial) - An alternative to Lemur and TouchOSC

I am not 100% sure, but I have a hunch that the MIDI it receives might be outside of the range I use, which might case this error? Working fine over here... Try CC117, value 1 for starters.
 
I am not 100% sure, but I have a hunch that the MIDI it receives might be outside of the range I use, which might case this error? Working fine over here... Try CC117, value 1 for starters.

That's actually what I had when I tested it.
26-04-_2019_14-24-46.png

Do I maybe have to change the name of the midi target somewhere in OSC? Since yours seems to be called "oscIn", while mine is called "OpenStageControl".
 
Yes, that's worth a try.. sorry can't be very helpful here - still very new to OSC and javascript..

For reference - I use 2 ports, because I was getting MIDI feedback with just one.
oscIn is for CC and PC messages going OSC->Cubase
oscOut is for returning messages (CC127, CC117-125) from Cubase. This port is the one that the transformer and the generic remote are sending on.
 
Yes, that's worth a try.. sorry can't be very helpful here - still very new to OSC and javascript..

For reference - I use 2 ports, because I was getting MIDI feedback with just one.
oscIn is for CC and PC messages going OSC->Cubase
oscOut is for returning messages (CC127, CC117-125) from Cubase. This port is the one that the transformer and the generic remote are sending on.
Are you using expression maps? Did you find a discrepancy between o-s-c's program change values and cubase's? (I think cubase numbering starts at 1, and o-s-c at 0...not 100% sure though)
 
Ok, I'm unfortunately still not able to make it work. I'm gonna list all the steps I took here, if someone can spot a mistake in there please let me know!

1) I created 2 ports in loopMidi with the exact same name as Mihkel, to make things easier.
loopMidi.png
2) Created the following Generic Remote
Generic Remote.png
3) Created an empty project with 2 midi tracks for testing purposes, with the following 'Midi Input Transformer' and 'Midi Send' settings (CC117 value 1 for Track 1, CC117 value 2 for Track 2)
Input Transformer.png Midi Send.png

4) In OSC i added the Java Script to the Custom Module and added the 2 midi ports to the "midi" entry.
OSC.png

With all that done, I only get the aforementioned error message in OSC, while in loopMidi I can see some sort of feedback happening which I can't quite figure out the root of.
If anyone has any idea, I'd be very grateful!
 
var buttonGrid = instrument[instrNumber].length

This is undefined. Cubase is not sending the track data correctly to the custom module. If you enable debug in osc, can you see if the cc127 is being sent from cubase on track selection? I think your generic remote is not quite right, but I don't don't time right now to dig deeper...
 
var buttonGrid = instrument[instrNumber].length

This is undefined. Cubase is not sending the track data correctly to the custom module. If you enable debug in osc, can you see if the cc127 is being sent from cubase on track selection? I think your generic remote is not quite right, but I don't don't time right now to dig deeper...

When I disable the Midi Send on the Midi Track I get this: Debug no Midi Send.png

With the Midi Send enabled the console goes completely nuts and it's kinda buggy to scroll through it. Looks like this though:
https://www.dropbox.com/s/ma5dfi9ruf9e39f/26-04-_2019_16-28-31.mp4?dl=0
 
Last edited:
Ok, I'm unfortunately still not able to make it work. I'm gonna list all the steps I took here, if someone can spot a mistake in there please let me know!

You're getting MIDI feedback. Disable oscIn input and oscOut output (sorry for the backwards and confusing naming, I was thinking of Cubase signal flow...)

Mine looks like this: --midi oscIn:-1,3 oscOut:3,-1
So oscIn can only send to Cubase and oscOut can only receive from cubase, value of -1 disables their inputs & outputs.

The only other differences with my setup are as follows:

Generic Remote: "Max Value" = 1
Device: VST Mixer (this should not make any difference)

Midi Input Transformer is not necessary, get rid of it.
Only use a Transformer in MIDI Send, set it to these settings (Function - Insert Inclusive)
Screenshot 2019-04-26 17.31.30.png

At that point your setup should be identical to mine - and I just tested once more to make sure - I am not seeing any errors...
 
Great, seems to be almost there now, no more errors and feedback! Only problem left is that in the actual OSC project nothing changes when selecting a track

This is what I get in the debug console when selecting a track, that would correspond to a CSS patch. It seems to receive all the necessary info, but doesn't process it to change the names of the articulation buttons in OSC?

Code:
 OSC received: { address: '/control', args: [ 1, 127, 0 ] } From : midi:oscOut
MIDI received:
MIDI sent:
OSC received: { address: '/control', args: [ 1, 127, 1 ] } From : midi:oscOut
MIDI received:
MIDI sent:
OSC received: { address: '/b1/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b1/label', args: 'Sustain' } From : undefined:undefined
OSC received: { address: '/b2/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b2/label', args: 'Tremolo' } From : undefined:undefined
OSC received: { address: '/b3/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b3/label', args: 'Measured tremolo' } From : undefined:undefined
OSC received: { address: '/b4/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b4/label', args: 'Trills' } From : undefined:undefined
OSC received: { address: '/b5/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b5/label', args: 'Harmonic' } From : undefined:undefined
OSC received: { address: '/b6/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b6/label', args: 'Staccato Sfz' } From : undefined:undefined
OSC received: { address: '/b7/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b7/label', args: 'Staccato' } From : undefined:undefined
OSC received: { address: '/b8/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b8/label', args: 'Staccatissimo' } From : undefined:undefined
OSC received: { address: '/b9/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b9/label', args: 'Spiccato' } From : undefined:undefined
OSC received: { address: '/b10/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b10/label', args: 'Marcato' } From : undefined:undefined
OSC received: { address: '/b11/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b11/label', args: 'Marcato spicc' } From : undefined:undefined
OSC received: { address: '/b12/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b12/label', args: 'Col Legno' } From : undefined:undefined
OSC received: { address: '/b13/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b13/label', args: 'Bartok pizz' } From : undefined:undefined
OSC received: { address: '/b14/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b14/label', args: 'Pizzicato' } From : undefined:undefined
OSC received: { address: '/b15/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b15/label', args: 'Legato On' } From : undefined:undefined
OSC received: { address: '/b16/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b16/label', args: 'Legato Off' } From : undefined:undefined
OSC received: { address: '/b17/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b17/label', args: 'Con Sordino On' } From : undefined:undefined
OSC received: { address: '/b18/show', args: 1 } From : undefined:undefined
OSC received: { address: '/b18/label', args: 'Con Sordino Off' } From : undefined:undefined
OSC received: { address: '/b19/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b20/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b21/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b22/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b23/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b24/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b25/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b26/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b27/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b28/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b29/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b30/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b31/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b32/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b33/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b34/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b35/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b36/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b37/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b38/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b39/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b40/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b41/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b42/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b43/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b44/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b45/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b46/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b47/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b48/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b49/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b50/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b51/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b52/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b53/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b54/show', args: 0 } From : undefined:undefined
OSC received: { address: '/b55/show', args: 0 } From : undefined:undefined
OSC received: { address: '/control', args: [ 1, 117, 0 ] } From : midi:oscOut
MIDI received:

Thanks again for all of your help Mihkel, I owe you a beer (actually a lot of beer by now :grin:)!
 
Great, seems to be almost there now, no more errors and feedback! Only problem left is that in the actual OSC project nothing changes when selecting a track

Hmmm.. Yes - that is the exact incoming data that I see.

Just curious - when you load my OSC project, is the left side completely blank or does it have a grid of 55 empty buttons?

Also what version of OSC are you running? The project was created on 0.45.5 or 0.45.6.
 
Yes, that finally did it!! I was still on 0.41.7, now that I updated to 0.45.7 it works! :) Thanks again!
Now all that's left is to make this whole thing work with Instrument Tracks instead of just Midi Tracks. I remember something about using plugins to do this from your Lemur Template thread, I'll give that a try tomorrow after a good night's sleep! :)
 
Yes, that finally did it!! I was still on 0.41.7, now that I updated to 0.45.7 it works! :) Thanks again!
Now all that's left is to make this whole thing work with Instrument Tracks instead of just Midi Tracks. I remember something about using plugins to do this from your Lemur Template thread, I'll give that a try tomorrow after a good night's sleep! :)

Great! Yeah, using a basic MIDI plugin like was suggested in the Lemur thread should work just fine on instrument tracks.
 
Nice, got it working pretty much immediately! :2thumbs:
Now I just gotta find a plugin with lots of dials and that basically doesn't use any resources whatsoever. The Cubase Tremolo has only 4 knobs which would result in 'only' 512 possible articulation sets. Should be enough, but I'd like to be future proof.

Also I wonder how hard it would be to make a bespoke plugin for this? You'd basically only need a VST with a bunch of knobs, that don't even really have to do anything, no? Mhh...
 
Well, I (of course) spoke too soon. Sorry, but I have to annoy you all again. :rolleyes:

First off, I didn't really get how using the tremolo plugin like @pilgrim explained would work for more than 128 articulations. If you'd use each of the 4 knobs in the tremolo plugin for CC117, CC118, CC119 and CC120 respectively, Cubase would have no way to know which of the 4 CC's is the relevant one, or am I wrong? So it would just do CC117 first, then 118, 119 and finally 120, so you'd always end up with 120 if it goes through all the knobs one by one. That's why I thought about having a plugin in a different insert slot for every CC, so that it's easy for Cubase to differentiate.

Now my plan was like this: I wanted to use a simple gain plugin with just one fader (the freebie 'DeeGain') and have it in a different insert slot for each CC. The Generic Remote looks like this:
Generic Remote.png
In Cubase I set up 4 tracks like this:
Cubase Tracks & Mixer.png

Moving the DeeGain faders works just as expected. The fader on Track CC117 scrolls through all the strings articulations, the fader on Track CC118 scrolls through all of Mihkel's brass articulations, etc. The problem however is that whatever I dialed in doesn't get remembered, as soon as the track gets deselected and reselected OSC defaults back to one specific articulation setup (the one that corresponds to CC120, value 1 ('Harmonium ARK2')).
I also tried to set the correct gain value with automation, but that also doesn't seem to work.

If anyone has any smart ideas left that would be great, I've been at this for hours but no luck. Maybe I completely misunderstood how this is supposed to work?

Edit: I also just had the idea of using the level of a Send to a dummie FX track as the 'trigger' instead of a plugin, which I'd find even better. But that also doesn't work, as soon as I reselect the track it doesn't recall the setting. So the problem definitely lies somewhere in Cubase communicating to OSC on track selection.
 
Last edited:
Another update: it works fine if I have just a single entry in the Generic Remote. Like this:
Generic Remote - only 1 entry.png
But as soon as I add another entry for CC118, CC117 stops working while CC118 now works. So it's always the last entry in that list, that works. I guess that's working as intended but how to circumvent it? I tried creating a separate Generic Remote for every CC, but no luck there.
 
@Mihkel Zilmer I tried a sample of your code with my method (I do not disable any tracks in my case).
Works very nicely! I improved the json to add section name, color, background color, and 3 categories of articulations. I like having specific articulations in a specific area.

It does look like this:

{'name':'SSB Horns a2','color':'ff8a01','background':'201d1b',
'articulationsLong':['Legato','Long','Long Cuivre','Long Stopped','Multitongued'],
'articulationsShort':['Marcato','Tenuto','Staccato','BU Stacc','BU Quaver','BU Crotchet'],
'articulationsDeco':['Trill Minor 2nd','Trill Major 2nd','Rip','Fall']
}

Very cool!
 
Last edited:
Top Bottom