OSC support for MIDI Remote Mapping (for example passing track names to a controller)

Hello everybody,

I have a request or, worst case scenario, a question for the developing team (if we didn’t scare you all away already).

Is it possible to have some OSC functionality implemented in the MIDI Remote Mapping Assistant?

I know - this is a revamp of an old topic, but there’s good ground for it, based on two points:

  1. OSC applications like TouchOSC do an amazing job as MIDI controllers, however I’d love to see the name of the “Selected Track” in my templates. OSC seems to be a good way to do that.

  2. Cubase Pro and Nuendo can already pass strings like the track name to Cubase iC Pro, via the SKI Remote, so it’s doable to say the least.

  3. Nuendo has got some OSC support for position-tracking devices - proof enough that OSC support is already present in some form and does not have to be built from the grounds up

  4. OSC is not flatlining as some people thought, even here, in previous posts, and is extensively supported by some of the competition (Logic, Reaper to name a few).

Thank you very much!

Fabio

1 Like

Hi @FabioTBS, there is a way to send track names and colors via sysex. But I don’t know if there is a way to convert a sysex-message to OSC without creating another pair of virtual ports and running a translation “mallory” process :thinking:

Hi @Jochen_Trappe,
Thanks for your reply.
I thought as much. I could build a Sysex message with the track name in ASCII between F0 and F7.
But how do you pull the track name from Cubase?
And TouchOSC has some little scripting in Lua now so I could look into converting a Sysex directly in a string without OSC. What I’m really missing is the first part: reading the name of the track from Cubase and converting it in a Sysex message.

Only available since 12.0.51 (but 12.0.51 has a crash issue with switching MIDI Remote mapping pages via hardware, will be fixed within few days)

page.mHostAccess.mTrackSelection.mMixerChannel.mOnTitleChange = function (activeDevice, activeMapping, title) {
    var msg = [0xF0 /*, more initial bytes ...*/];
    for (var i = 0, len = title.length; i < len; ++i)
      msg.push(title.charCodeAt(i))
    msg.push(0xF7)
    midiOutput.sendMidi(activeDevice, msg)
  }
2 Likes

@Jochen_Trappe
Oooh this is actually cool stuff!
I’ll give it a go.
Thank you very much.
This means I should brush up my code skills!

definitely :+1:

1 Like

@Jochen_Trappe

4 Likes

Great Scott are you fast learning that remote s***tuff, cheers!

image

1 Like

I’m just a glorified 40 y.o. script kid haha - learnt programming when TurboPascal was still a thing :grimacing:
On the TouchOSC side I had to make a function to find a SYSEX message by checking if the first byte and last byte are F0 and F7, and convert what’s between them back into a string.
Seems to be working so far.
Crashed Nuendo a couple of times but then I rewrote something super simple.
I’m enjoying the MIDI Remote API so far!

1 Like

Sorry there’s been a lot of edits to this answer - lots of bits that I solved during the day.

So - I wanted to do the same with Colors.

I had to take somewhat a sinuous path to convert a number in Java to a 24-bit color (8bit per channel as that’s what TouchOSC accepts) There’s a rounding discrepancy between the 0…1 scale of the RGB float numbers output in the mOnColorChange function, and the 0…255 output scale: mine ends at 254. Close enough.

I did an extra bit of code so that the 4 bytes after the initial 0xF0 are either the hex for “NAME” (for a name change) or “COLR” (for a color change):

page.mHostAccess.mTrackSelection.mMixerChannel.mOnColorChange = function(activeDevice, activeMapping, r, g, b, a, isActive) {
    var msg = [0xF0, 0x43, 0x4F, 0x4C, 0x52 /*, more initial bytes ...*/];

    r = Math.round(r*256)
    g = Math.round(g*256)
    b = Math.round(b*256)

    var hexString_R = r.toString()
    var hexString_G = g.toString()
    var hexString_B = b.toString()
    
    console.log(hexString_R)
    console.log(hexString_G)
    console.log(hexString_B)

    msg.push(r)
    msg.push(g)
    msg.push(b)
    msg.push(0xF7)
    
    midiOutput.sendMidi(activeDevice, msg)


}

Any clue as to the rounding number @Jochen_Trappe ? It seems that “Full Green” (0, 255, 0) sits at 0.98xxxxx (very close to 1, but not 1) - hence the rounding error.

Ok, so - this is how my pet project looks like.

On the MIDI Remote side:
handling of both color and text is done by converting them into SysEx

  • Labels have to be in ASCII
  • Colors are scaled into 0…255 intervals

On the TouchOSC side

  • a Lua script is on the global level handling both label and color propagation
  • the text and color is propagated to all the children equipped with a “Delegate_NC” tag for simplicity - so the blue box in the centre doesn’t have that tag, quite simply
  • alpha channel is not propagated, so alphas set directly on the TouchOSC controls are untouched (you can see that in the radial and encoder controls on the bottom right)

How am I doing? :wink:

3 Likes

I take the RGB values from the Track Coloring System. Those colors are fine tuned and they do not compare to numbers like “red => #ff0000”, “green => #00ff00” and so on.

1 Like

You’re kicking it! :nerd_face: :+1:

1 Like

@Jochen_Trappe I just changed from Math.round to Math.ceil - this way it gives me an output between 00…FF for each channel.

  • One more thing I noticed when testing is that mOnColorChange doesn’t seem to apply when you are changing color of the selected track. It works only if you’re selecting another track and the call “detects” a change of both track selection and color.
  • Also, if you’re in one of the lanes of a MIDI track, the color is… pretty dark (at least on my project as lanes are in a very dark grey).
1 Like

is a known issue

1 Like

You probably have to implement a color mapping algo to fit your desired scheme :exploding_head:

@Jochen_Trappe I thought about it - but I’d love to have something more “universal”, like: if you select a lane, the colour taken is the one of the MIDI track, and not the lane itself.
Doable?

reasonable :wink:

1 Like

@Jochen_Trappe I’m here again for some help.

Is there a way that I can still use the JS code above, but use the “other” binding system in Nuendo (meaning: I want to program the faders and knobs via “Learn” rather than hard-code them)?

I tried, but so far, they seem to be mutually excluding each other.

Any way around it?

Fabio, can you share you TouchOSC project file from this so I can learn from it? I would love to get track name labels into my template!

1 Like