What's new

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

MauroPantin

I engrave little black dots
Hey DJN...I am presuming you are using the touchscreen as the controller. If so you don't need to have OST on that machine at all...just a browser to act as the client. Am I missing something?
@DJN

This is correct. If both devices are in the same LAN network there's no need to have it installed on both, you just access it with IP and port number through a regular browser. It is also easier to manage in terms of MIDI ports and other misc. stuff if you are not planning on using the touchscreen standalone for anything. So if Cubase list the ports and it works there, you're good to go. Just take note of the address that OSC spits out in the console when it starts running, something like:

(INFO) Server started, app available at
http://172.30.24.101:12388
http://192.168.1.150:12388

Those are similar to my personal ones, I changed the numbers a bit just for the sake of safety. You have to take the second one (the one that starts with 192) and plug that as it is on a web browser in your tablet and then you should be golden.
 

DJN

New Member
Hey DJN...I am presuming you are using the touchscreen as the controller. If so you don't need to have OST on that machine at all...just a browser to act as the client. Am I missing something?
Thank for your reply! Yes, you are correct. I am successful running osc on a browser on the touchscreen as you suggested, and that works perfect. I am hoping to find a way to run osc completely on the touchscreen alone and only have it send/receive midi to the main PC. It's just a preference, I feel better not running additional processing on the same machine as my DAW if I can.
 

pbuckingham

New Member
Thank for your reply! Yes, you are correct. I am successful running osc on a browser on the touchscreen as you suggested, and that works perfect. I am hoping to find a way to run osc completely on the touchscreen alone and only have it send/receive midi to the main PC. It's just a preference, I feel better not running additional processing on the same machine as my DAW if I can.
As far as I know, I don't think that is possible. You need to have the host running on the machine that Cubase is on. It uses next to zero resources, so I wouldn't worry about that.
 

DJN

New Member
@pbuckingham / @MauroPantin
Thank you both for your help! After installing a clean Windows 10 on the touchscreen, I just finished updating all the drivers via the Dell website. Now OSC is working perfectly on the touchscreen without the midi error and now shows available ports from the "List MIDI Devices." Yes, it seems possible (so far) to have it only running on the touchscreen, sending midi via rtpMIDI. I just made a quick test with one button sent from the touchscreen pc to the cubase pc, works as expected! Maybe this isn't the best way to set it up, but I'll continue down this path and see what happens!
 

mackmusic

New Member
If anyone is like me and a bit nervous about getting into Open Stage Control a YouTuber called Mack Music has started some tutorials on it that might be useful. He welcomes any requests for areas to cover, including any technical ones as he is also a programmer (he also has started doing videos on JUCE as well).



Hi everyone. Thank you very much for the referral Mark! I'm by no means an expert but I'm really loving Open Stage Control so far and I hope to get quite deep into it as my skill and confidence level increases.

I just joined the forum firstly to say thank you directly Mark it's much appreciated, secondly to add anything I can to other discussions and finally, as you mentioned in the comments, there are others here who are doing pretty advanced stuff, so I will check that out as soon as I can.

In the mean time, if you do see anything you like on my YouTube or you want any more direct guidance then please let me know, and as Mark said, I will do my best to respond.

Thanks,
Mack Music
 

jononotbono

Luke Johnson
Hey everyone,

I'm trying to create a display window that shows Timecode. When I have OSC running on my main computer (using OSX and two IAC ports for input and output) I can see timecode in a text label when using /mtc

That all works fine.

However, I have OSC on a Mac Mini with my touch screen connected and I have this computer networked to my main computer. Everything is working fine except for displaying timecode. I'm just wondering if there are any known problems with doing this?

I have 2 IAC ports on the Mac Mini (named the same as the Main computer) but for my commands to work in Cubase I am using Apple's Midi Network Setup and within Cubase I am selecting Midi input and output to be the networked midi ports. Whatever I try, I just can't get the timecode to show on a text label.

In the debugger I can see a wall of data constantly streaming when I hit play or record in Cubase. So I'm not sure what I'm doing wrong. Timecode just does not display in the text box. Really odd.

I also have another question about Timecode.

When I had it working with OSC running natively on the main computer, I noticed that Timecode would display in a Text label but only when playing or recording. If I used the mouse and clicked anywhere, the Timecode values would not update. And this basically renders this functionality as useless because the whole point of having a TC display is so when you stop/scrub/nudge to find exact points for editing, you can have an exact measurement. And a lot of this kind of work involves clicking and moving the cursor manually. I'm hoping it's just something I'm not doing right as I would love a Time Display (and Bars and Beats) on my OSC controller .

Any help would be amazing. And many thanks

Jono
 

Loïc D

Monkeying with libraries
Do you see any TC data in OSC debugger when you do one of the following actions ?

Besides, I’ve made great progress in my template.
And also managed a reliable solution for changing articulations of selected notes in LPX. Huge time saver.

EDIT: when things cool down and my template is less a WIP, I plan to make a video explaining the whole process around LPX/Osculator/O-S-C/Keyboard Maestro.
 

mackmusic

New Member
Hey everyone,

I'm trying to create a display window that shows Timecode. When I have OSC running on my main computer (using OSX and two IAC ports for input and output) I can see timecode in a text label when using /mtc

That all works fine.

However, I have OSC on a Mac Mini with my touch screen connected and I have this computer networked to my main computer. Everything is working fine except for displaying timecode. I'm just wondering if there are any known problems with doing this?

I have 2 IAC ports on the Mac Mini (named the same as the Main computer) but for my commands to work in Cubase I am using Apple's Midi Network Setup and within Cubase I am selecting Midi input and output to be the networked midi ports. Whatever I try, I just can't get the timecode to show on a text label.

In the debugger I can see a wall of data constantly streaming when I hit play or record in Cubase. So I'm not sure what I'm doing wrong. Timecode just does not display in the text box. Really odd.

I also have another question about Timecode.

When I had it working with OSC running natively on the main computer, I noticed that Timecode would display in a Text label but only when playing or recording. If I used the mouse and clicked anywhere, the Timecode values would not update. And this basically renders this functionality as useless because the whole point of having a TC display is so when you stop/scrub/nudge to find exact points for editing, you can have an exact measurement. And a lot of this kind of work involves clicking and moving the cursor manually. I'm hoping it's just something I'm not doing right as I would love a Time Display (and Bars and Beats) on my OSC controller .

Any help would be amazing. And many thanks

Jono
So, I've been thinking about this today. You should only ever need OSC server installed and running the machine that runs your DAW (Cubase) and any client (Mac Mini with touchscreen say) on the same network should access your OSC instance via a browser (e.g. Safari, preferably in full screen mode) and everything should be fine. There should be no reason to "network" any midi messages, as far as I can tell, as the OSC server is the only bit that interfaces with IAC. Did you try this already?

Also, I downloaded a Cubase Elements trial and I got MTC data appearing in a text widget with the /mtc address no problem. I was able to access this OSC page from my phone and the timecode was updating while the transport was playing or while you scrub through or click on a clip the timeline. All I did was set it up as below (OSC is the name of my loopMidi device in Windows)

1623185117552.png

Hopefully this helps and I'm not missing the point massively here!
 

DJN

New Member
Scripting Question:
I have created a panel with multiple tabs, I would like to be able to switch to a specific tab on the panel when it receives a specific midi input sent from the DAW. Is this possible? I could achieve this is Lemur with selecttab(Panel, 1); (with the midi addresses set on the tab MIDI_ARGS).

I'm still learning basic scripting in OSC, so any help will be greatly appreciated!
 

mackmusic

New Member
Sure. This wasn't quite as easy as I thought it should be!

Essentially you need to send/set the 'value' of your tab container to be the index of the tab you want active. So, in this example, I have a panel widget that has 3 tabs with the id of 'panel_maintabs', a script widget somewhere with the OSC target set to my MPK mini keyboard and it's listening to '/note' events. If the note is middle C then tab 0 is selected, if it's C#4 the it's tab 1 and if it's D4 then tab 2 is selected.

1623316454199.png

You could of course change this to listen to the '/control' address if you wanted to (rather than note events!) and then parse out the element of the CC message you want to use to set the appropriate tab. Use console.log here to see what the data looks like so you can pull out the element you need.

FYI: noteOn messages looks like this [1,62,53] if you debug them in the console. This is an array of 3 numbers [channel, note number, velocity]. So, as this object uses zero-based indexing, value[1] means the value at index 1, which is actually the second item in the value object (0,1,2). This is the note number and this is what I wanted to use to decide the tab index for this example. You will also notice the tab index uses zero-based indexing set('panel_maintabs',0) as well, as do most things in JavaScript! And my apologies if this is all well known to you already, but sometimes it isn't obvious to non-programmers :)

Hope this helps!
 
Last edited:

Drjay

Active Member
Sure. This wasn't quite as easy as I thought it should be!

Essentially you need to send/set the 'value' of your tab container to be the index of the tab you want active. So, in this example, I have a panel widget that has 3 tabs with the id of 'panel_maintabs', a script widget somewhere with the OSC target set to my MPK mini keyboard and it's listening to '/note' events. If the note is middle C then tab 0 is selected, if it's C#4 the it's tab 1 and if it's D4 then tab 2 is selected.

View attachment 51564

You could of course change this to listen to the '/control' address if you wanted to (rather than note events!) and then parse out the element of the CC message you want to use to set the appropriate tab. Use console.log here to see what the data looks like so you can pull out the element you need.

FYI: noteOn messages looks like this [1,62,53] if you debug them in the console. This is an array of 3 numbers [channel, note number, velocity]. So, as this object uses zero-based indexing, value[1] means the value at index 1, which is actually the second item in the value object (0,1,2). This is the note number and this is what I wanted to use to decide the tab index for this example. You will also notice the tab index uses zero-based indexing set('panel_maintabs',0) as well, as do most things in JavaScript! And my apologies if this is all well known to you already, but sometimes it isn't obvious to non-programmers :)

Hope this helps!
In these cases I tend to use code like: set(‚panel_maintabs‘, value[1]-60). But maybe it is just poor man‘s Kernighan Ritchie style :whistling:
 

DJN

New Member
Sure. This wasn't quite as easy as I thought it should be!

Essentially you need to send/set the 'value' of your tab container to be the index of the tab you want active. So, in this example, I have a panel widget that has 3 tabs with the id of 'panel_maintabs', a script widget somewhere with the OSC target set to my MPK mini keyboard and it's listening to '/note' events. If the note is middle C then tab 0 is selected, if it's C#4 the it's tab 1 and if it's D4 then tab 2 is selected.

View attachment 51564

You could of course change this to listen to the '/control' address if you wanted to (rather than note events!) and then parse out the element of the CC message you want to use to set the appropriate tab. Use console.log here to see what the data looks like so you can pull out the element you need.

FYI: noteOn messages looks like this [1,62,53] if you debug them in the console. This is an array of 3 numbers [channel, note number, velocity]. So, as this object uses zero-based indexing, value[1] means the value at index 1, which is actually the second item in the value object (0,1,2). This is the note number and this is what I wanted to use to decide the tab index for this example. You will also notice the tab index uses zero-based indexing set('panel_maintabs',0) as well, as do most things in JavaScript! And my apologies if this is all well known to you already, but sometimes it isn't obvious to non-programmers :)

Hope this helps!
Thank you for your help! As I am a beginner at scripting osc, I really appreciate your clear, step-by-step explanation and example. I am able to successfully recreate your example, now I am trying to plugin "/control" and have it listen for specific midi control messages. Are midi messages represented by [channel,CC#,value] ??
 

jononotbono

Luke Johnson
So, I've been thinking about this today. You should only ever need OSC server installed and running the machine that runs your DAW (Cubase) and any client (Mac Mini with touchscreen say) on the same network should access your OSC instance via a browser (e.g. Safari, preferably in full screen mode) and everything should be fine. There should be no reason to "network" any midi messages, as far as I can tell, as the OSC server is the only bit that interfaces with IAC. Did you try this already?

Also, I downloaded a Cubase Elements trial and I got MTC data appearing in a text widget with the /mtc address no problem. I was able to access this OSC page from my phone and the timecode was updating while the transport was playing or while you scrub through or click on a clip the timeline. All I did was set it up as below (OSC is the name of my loopMidi device in Windows)

View attachment 51487

Hopefully this helps and I'm not missing the point massively here!
Hey man, sorry for the late reply. I've been lost in the OSC underworld.

Ok so I initially has OSC on my main DAW machine. And I have 2 virtual midi ports set up on the main DAW machine. The reason for this is to have an input and an output so it avoids any midi feedback when sending midi (and timecode) to OSC from the DAW). I also don't use OSC in a browser. The reason/s for this are because I have a 27" touch screen and it's so much faster using OSC from, literally, OSC (there's a term for using it in that way in the documentation but can't remember it at the minute).

Once I realised that have a touchscreen plugged in to your main DAW computer is problematic regarding apps going in and out of focus (As soon as you touch the touch screen the DAW goes out of focus and vice versa) I then decided to network a second computer of which my Touch screen is plugged into directly. The networked computer (mac mini) is plugged into my DAW computer (Mac Pro). I set up an input and output Midi port exactly the same way as with the Mac Pro. Using IAC (I know with PC you need something like LoopMidi but luckily with OSX they have this basically built in with IAC.

Right, so, at this point, I have an input and output on both computers. It was here that I was having trouble. All of a sudden my Cubase Generic remotes that were set with the inputs and outputs of the DAW machine weren't connecting with OSC. So I looked into the midi networking options of OSX and once I created a connection, I selected the network midi ports for my Cubase Generic Remotes and hey presto, OSC was sending messages to Cubase. And it works amazingly well...

Until Timecode.

For some reason I can't show timecode. When I initially set this all up on one computer, I could send timecode to a text label in OSC so I know something to do with this network connection is messing things up. In the debugger I am seeing Timecode data constantly stream but it's not changing from 00:00:00:00. Until I activate sysex and mtc in the server. Then, in the debugger I am seeing the timecode data exactly as it is in Cubase and when I stop and click anywhere in Cubase, the Timecode updates. But it still won't show on the text label. Totally puzzled by this. I might film this on my iPhone and post it unlisted just to demonstrate what is happening and hopefully you or anyone else may spot something stupid I have mostly done or forgotten to do.

Yeah, I understand using OSC with a browser if your intention is to use it with an iPad but I don't see the point when you have a larger touch screen running from a computer and you can run it directly from the computer. I stop working on this issue to get the rest of my controller finished as it already sucked a day of my life away and figure time is best used elsewhere right now! 😂

Anyway, thanks for taking the time to help! I'll be sure to mention you in my next YouTube video I make on the controller I'm making! :)
 

mackmusic

New Member

Thank you for your help! As I am a beginner at scripting osc, I really appreciate your clear, step-by-step explanation and example. I am able to successfully recreate your example, now I am trying to plugin "/control" and have it listen for specific midi control messages. Are midi messages represented by [channel,CC#,value] ??
No worries, glad I could help and yes, CC messages are just like you described. When in doubt RTM :) https://openstagecontrol.ammd.net/docs/midi/midi-messages/#control-channel-cc-value. Yeah, I really don't want to be that guy, but the docs are actually pretty good for Open Stage Control. But again, they're obviously written by a developer, so if that's not your background they can appear a little obtuse to the casual observer!
 

DJN

New Member


No worries, glad I could help and yes, CC messages are just like you described. When in doubt RTM :) https://openstagecontrol.ammd.net/docs/midi/midi-messages/#control-channel-cc-value. Yeah, I really don't want to be that guy, but the docs are actually pretty good for Open Stage Control. But again, they're obviously written by a developer, so if that's not your background they can appear a little obtuse to the casual observer!
I appreciate the positive feedback, I'm right with you on always RTM. I'm working my way through it, just need a little help in the beginning translating the coding language. I've got a grip on the nouns, now working on verbs and adjectives :)
 

jononotbono

Luke Johnson
Can someone explain to me why you would use a Clone Container?

Does it save on resources somehow? I'm taking a guess here but instead of duplicating many faders that all do the same thing you create the main fader and then create clones? Or have I got this wrong?

Perhaps you create 1 fader that is assigned to, for example, a CC value. Then if I clone that, can you just change the CC value so OSC then thinks there is only 1 fader but it does multiple things? Just read the documentation but I still don't understand it. No change here then 😂
 

mackmusic

New Member
I did - cough - post a video about this on my YouTube channel :) I think they're great for duplicating collections of widgets together. Let me know if this helps shed any light on them: I use them with variables in the parent to pass on different values for OSC commands etc.
 

jononotbono

Luke Johnson
I did - cough - post a video about this on my YouTube channel :) I think they're great for duplicating collections of widgets together. Let me know if this helps shed any light on them: I use them with variables in the parent to pass on different values for OSC commands etc.
I will check your video out later man for sure! Do you know if it reduces any strain on resources?

I’ve not been designing my controller for iPads but I thought I’d see how it runs via a browser on an iPad earlier and it was laggy. When running on my main touch screen and not in a browser it’s instant which is why it’s got me wondering about performance.
 

Loïc D

Monkeying with libraries
@jononotbono
On Logic through OSCulator, I have no pb sending and seeing SMPTE and beats. At play time and any transport operation.
So, not an OSC issue. Maybe Cubase ?
 
Top Bottom