Behringer X-Touch Scribble Strip Color is possible in Reason (sort of)

Want to talk about music hardware or software that doesn't include Reason?
Post Reply
User avatar
RFX
Posts: 38
Joined: 06 Apr 2015
Location: Germany
Contact:

08 Apr 2025

Hi, I've just created a proof of concept for X-Touch scribble strip colors in Reason 13.

Apparently at some point Behringer added a SysEx command that can be used to set the scribble strip color, even in MCU mode. However, the issue is that Reason does not seem to expose the channel color in the remote system, so I don't have a great way to set it automatically. However, if this feature were to be implemented, it would be entirely possible to use the scribble strip color in Reason.

I mean, it's still technically possible with some workarounds. Here is a little video to demonstrate so you know I'm not just making stuff up:



So to summarize the current issues:
  • Channel colors must be set manually
  • 2 out of 7 characters on the display are wasted by doing so
Perhaps if enough people are interested in using their X-Touch like this Reason Studios might consider exposing the channel color in the remote system? I'm not sure how much work it would be for them, but I would certainly like to see it.

It's not exactly practical in its current state and I honestly don't have much of an idea on how to make this any better without access to the actual channel color.

In case you're interested in how I did it, the code looks something like this:

Code: Select all

function split_string(inputstr, sep)
	if sep == nil then
	  sep = "%s"
	end
	local t = {}
	for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
	  table.insert(t, str)
	end
	return t
  end

function build_color_message(model_type, start_channel)
	local color_bytes = {0,0,0,0,0,0,0,0}
	local row = 2

	for channel=start_channel,g_num_channels do
		local port_no = get_port_for_channel(channel)
		if g_lcd_channel_enabled_states[row][channel]==true then
			if string.find(g_lcd_channel_states[row][channel], "*") then
				split_table = split_string(g_lcd_channel_states[row][channel], "*")
				color_bytes[channel - start_channel + 1] = tonumber(string.sub(split_table[2], 1, 1))
			elseif g_lcd_channel_states[row][channel] ~= "" then
				color_bytes[channel - start_channel + 1] = 7
			end
		end
	end
	local model_byte=GetModelByte(model_type)
	local event = { 0xF0, 0x00, 0x00, 0x66, model_byte, 0x72 }
	for color=1,8 do
		table.insert(event, color_bytes[color])
	end
	table.insert(event, 0xF7)
	return event
end

User avatar
dioxide
Posts: 1875
Joined: 15 Jul 2015

09 Apr 2025

This is very cool. Is it possible to use HSB colours or is the X-Touch limited to a fixed palette of colours? Also did you find a way to access the inverted text blocks?

User avatar
RFX
Posts: 38
Joined: 06 Apr 2015
Location: Germany
Contact:

09 Apr 2025

dioxide wrote:
09 Apr 2025
Is it possible to use HSB colours or is the X-Touch limited to a fixed palette of colours?
Unfortunately, what I showed are all the colors that can be used. The numbers are no coincidence either, if you convert them to binary it becomes pretty apparent what the issue is:

Code: Select all

BGR
000 - Black / Backlight off
001 - Red
010 - Green
011 - Yellow
100 - Blue
101 - Magenta
110 - Teal
111 - White
So yeah, the individual colors don't have adjustable brightness. They can either be on or off. That's where the color palette comes from.

If I did have access to the channel colors from Reason, I would clamp them to the closest color I can display on the X-Touch. Not perfect by any means, but I think it would still be a big help, especially when navigating a project with lots of channels. I've certainly had projects in the past that had something like 50 channels where it was quite the pain to find one specific channel on the X-Touch. If I had even just a few colors it would've been a massive help.
dioxide wrote:
09 Apr 2025
Also did you find a way to access the inverted text blocks?
I've only seen features to access them in the documentation for MIDI Control mode. So unless this feature was available on the original Mackie control, I doubt they exposed it in MCU mode. Though who knows, maybe there are some undocumented SysEx commands. After all, the way I found out about the command I've used for my proof of concept was by reverse engineering an Ableton Codec for the X-Touch that had this feature implemented. Documentation for the SysEx commands of the X-Touch is extremely sparse. I wonder how the person who wrote those Ableton scripts found out about them.

User avatar
Catblack
Posts: 1036
Joined: 15 Apr 2016
Contact:

09 Apr 2025

You could set the color in the track name and set it that way.

Though is there a remoteable item for the color? I assume you've checked?
If you ain't hip to the rare Housequake, shut up already.

Damn.

User avatar
turbopage
Competition Winner
Posts: 120
Joined: 06 Jul 2015
Location: Milano
Contact:

09 Apr 2025

I'm following the discussion with great interest.
Music Will Save Us

User avatar
RFX
Posts: 38
Joined: 06 Apr 2015
Location: Germany
Contact:

09 Apr 2025

Catblack wrote:
09 Apr 2025
You could set the color in the track name and set it that way.
That's what I did. The problem is that I can't seem to access the full track name, only the first 7 characters, which means with my current method you'd be wasting precious space on the scribble strips.
Catblack wrote:
09 Apr 2025
Though is there a remoteable item for the color? I assume you've checked?
I did look at the documentation included with the Remote SDK. No such parameter was listed for the Reason mixer channel (Reason Remote Support.pdf Page 71/72/73). Though the document was last updated for Reason 6, and I find it somewhat hard to believe that nothing remotable has been added since. I'll message their support just to be safe.

User avatar
turbopage
Competition Winner
Posts: 120
Joined: 06 Jul 2015
Location: Milano
Contact:

10 Apr 2025

I speak without knowing anything about coding, if I wanted to use the code you posted how could I do it? In which file could I integrate it and how? thanks!
Music Will Save Us

User avatar
RFX
Posts: 38
Joined: 06 Apr 2015
Location: Germany
Contact:

10 Apr 2025

turbopage wrote:
10 Apr 2025
I speak without knowing anything about coding, if I wanted to use the code you posted how could I do it? In which file could I integrate it and how? thanks!
That'd be a bit hard to explain, since what I posted is just a function that still needs to be called from somewhere. The codec I have right now is basically just for demonstrating the concept. I'll try to put together a proper codec based on the Mixer Jaexx map this weekend. I'll post it here once it's done.

Also, you might want to preemptively update your X-Touch and Extender units firmware. According to what I've seen some people say, the SysEx command I'm using for this was added in Firmware 1.22, so make sure you have the latest version installed.

User avatar
RFX
Posts: 38
Joined: 06 Apr 2015
Location: Germany
Contact:

10 Apr 2025

RFX wrote:
09 Apr 2025
I'll message their support just to be safe.
I have a response from their support now:
The channel/track color isn't a remoteable, so it doesn't have any output.
So yeah, seems like my research was correct and this is indeed not possible with the current version of Reason. At least Reason Studios is aware of it now. Though since this is a niche feature, if they're going to implement this at all, I wouldn't expect it to be a high priority.

Though I have thought of something that might be possible, but it would be a horrifically hacky solution. It would essentially involve writing a program to hook into the Reason process, read its memory, extract the channel colors from that and then use that information to send the MIDI messages to set matching scribble strip colors.

Keep in mind this is just a theoretical idea and DRM could make this near impossible. It might also require some kind of MIDI loopback construct to allow both Reason and an external program to send MIDI to the X-Touch at the same time. There's also the issue that I have zero experience with hacking into applications like that.

Figured it might be worth throwing that idea out there in case anyone is crazy enough to attempt it.

User avatar
turbopage
Competition Winner
Posts: 120
Joined: 06 Jul 2015
Location: Milano
Contact:

10 Apr 2025

RFX wrote:
10 Apr 2025
turbopage wrote:
10 Apr 2025
I speak without knowing anything about coding, if I wanted to use the code you posted how could I do it? In which file could I integrate it and how? thanks!
That'd be a bit hard to explain, since what I posted is just a function that still needs to be called from somewhere. The codec I have right now is basically just for demonstrating the concept. I'll try to put together a proper codec based on the Mixer Jaexx map this weekend. I'll post it here once it's done.

Also, you might want to preemptively update your X-Touch and Extender units firmware. According to what I've seen some people say, the SysEx command I'm using for this was added in Firmware 1.22, so make sure you have the latest version installed.
Thanks RFX!
Music Will Save Us

User avatar
jam-s
Posts: 3373
Joined: 17 Apr 2015
Location: Aachen, Germany
Contact:

10 Apr 2025

If it would be possible to differentiate between bus and normal channels in the codec, you might be able to automatically color those red. For the other colors prefixing a letter to the channel name could be a workaround.

Maybe Behringer could also add a full rgb mode as sysex command (in case the displays actually support this) via another firmware update.

User avatar
dioxide
Posts: 1875
Joined: 15 Jul 2015

10 Apr 2025

Just thinking what else could be mapped to this value. I have an RGB pad controller that I use with DirectRE and I have the rotaries mapped to HSB Hue. This means I can adjust the colour of my controller pads using the device controls.

If you're able to somehow map the various Sysex commands as if they were a single parameter, then you could map it to a 0-127 control. This would allow you to move the on-screen Rotary to set the LCD colour.

So choose something that you'd be willing to sacrifice on the mixer channel to use for the colour control.The Mixer Channel still has Combinator Insert control so you could map it to one of the Rotaries. Or maybe sacrifice something else like Send Level 8.

Code: Select all

Rotary 4	0	127	Value	ValueOutput
FX8 Send Level	0	127	Value	ValueOutput

User avatar
RFX
Posts: 38
Joined: 06 Apr 2015
Location: Germany
Contact:

10 Apr 2025

jam-s wrote:
10 Apr 2025
If it would be possible to differentiate between bus and normal channels in the codec, you might be able to automatically color those red.
Not that I'm aware of. Regular channels, Bus channels and Parallel channels all seem to be pretty much identical and the documentation didn't contain any parameters that would allow you to differentiate between them. I did also ask Reason Studios support if there's any more up to date documentation available, to which they didn't say anything, so I'll assume that this Reason 6 documentation is the latest they have and anything else is just documented in device specific manuals.
jam-s wrote:
10 Apr 2025
Maybe Behringer could also add a full rgb mode as sysex command (in case the displays actually support this) via another firmware update.
While I would love to see it, I kinda doubt they will. They didn't even document the new SysEx command in the release notes for 1.22 (or their MIDI documentation for that matter). In fact, the release notes are pretty much just empty. So even if they could, I kinda doubt they'd actually do it.

Though, again, a dedicated enough person could very likely modify the X-Touch hardware to add a separate RGB controller which operates on a separate MIDI port to receive actual RGB values and control the backlight LEDs via PWM. I've done some crazy hardware mods in the past myself, but I don't really want to perform experimental mods like this on something expensive like my X-Touch setup. Just know that it should technically be possible with enough insanity and willpower.
jam-s wrote:
10 Apr 2025
For the other colors prefixing a letter to the channel name could be a workaround.
I do like the idea, but I'm not a fan of using a letter to notate channel color, as that might make it harder to read the text on the displays at a glance. I'd maybe try using special characters instead, for example (with white being the default):

Code: Select all

- Red
_ Lime
. Yellow
: Blue
, Magenta
; Teal
This way, I think the channel names would remain more readable. Though I haven't put much thought in the actual symbols so far, I've just picked what's convenient to reach on a german keyboard. It wouldn't be difficult to make this customizable, so that anyone can set this up however they want with practically zero coding skills.
dioxide wrote:
10 Apr 2025
If you're able to somehow map the various Sysex commands as if they were a single parameter, then you could map it to a 0-127 control. This would allow you to move the on-screen Rotary to set the LCD colour.

So choose something that you'd be willing to sacrifice on the mixer channel to use for the colour control.The Mixer Channel still has Combinator Insert control so you could map it to one of the Rotaries. Or maybe sacrifice something else like Send Level 8.

Code: Select all

Rotary 4	0	127	Value	ValueOutput
FX8 Send Level	0	127	Value	ValueOutput
Is Rotary 4 still a thing in Reason 13? Last time I checked that dial wasn't there anymore. I think Send 8 is a reasonable choice though. I've never used all 8 sends throughout hundreds of projects, but then again, that's just my way of working. It should be possible though, I just need to define some control to receive the value (I think). Either way, it's certainly an option worth exploring since it doesn't waste any of the very limited space on the scribble strips.

Honestly, I like both of your suggestions and I think both are far better than what I came up with when I decided to spend an evening making this proof of concept. I'm honestly tempted to just implement both of them and have a configuration parameter in the lua script to switch between them. This way, people can just pick whichever option they prefer to use.

Basically, a line somewhere near the top of the lua script that can be set like this:

Code: Select all

-- Use leading character to set color
g_color_selector_mode = "LEAD"
Or like this:

Code: Select all

-- Use FX Send 8 knob to set color
g_color_selector_mode = "SEND8"

User avatar
dioxide
Posts: 1875
Joined: 15 Jul 2015

10 Apr 2025

I forgot to add that the Rotary option would require having a Combinator in the Insert FX slot. So not perfect either and maybe worse than losing Send 8.

User avatar
Catblack
Posts: 1036
Joined: 15 Apr 2016
Contact:

12 Apr 2025

You are only getting 7 characters for "Track Name" in the Reason Document scope? You are getting the shortened name (I've never used it, but there's something about this in teh sdk...)

Here's how I'm using it
https://github.com/KittenVillage/Kitten ... .remotemap
line 33

https://github.com/KittenVillage/Kitten ... ck/lpp.lua
line 1558

and Lines 2910 - 2926

See I'm using get_item_text_value() instead of the other functions... never had a problem getting the whole track name this way.
If you ain't hip to the rare Housequake, shut up already.

Damn.

User avatar
dioxide
Posts: 1875
Joined: 15 Jul 2015

13 Apr 2025

Catblack wrote:
12 Apr 2025
You are only getting 7 characters for "Track Name" in the Reason Document scope? You are getting the shortened name (I've never used it, but there's something about this in teh sdk...)

Here's how I'm using it
https://github.com/KittenVillage/Kitten ... .remotemap
line 33

https://github.com/KittenVillage/Kitten ... ck/lpp.lua
line 1558

and Lines 2910 - 2926

See I'm using get_item_text_value() instead of the other functions... never had a problem getting the whole track name this way.
Isn’t this Sequencer Track Name rather that Mixer track name?

User avatar
Catblack
Posts: 1036
Joined: 15 Apr 2016
Contact:

Yesterday

dioxide wrote:
13 Apr 2025
Catblack wrote:
12 Apr 2025
You are only getting 7 characters for "Track Name" in the Reason Document scope? You are getting the shortened name (I've never used it, but there's something about this in teh sdk...)

Here's how I'm using it
https://github.com/KittenVillage/Kitten ... .remotemap
line 33

https://github.com/KittenVillage/Kitten ... ck/lpp.lua
line 1558

and Lines 2910 - 2926

See I'm using get_item_text_value() instead of the other functions... never had a problem getting the whole track name this way.
Isn’t this Sequencer Track Name rather that Mixer track name?
read the code. Reason Document scope.
If you ain't hip to the rare Housequake, shut up already.

Damn.

Post Reply
  • Information
  • Who is online

    Users browsing this forum: No registered users and 1 guest