# Need help with Behringer UB-Xa sysex

**URL:** <https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080>\
**Category:** General discussion\
**Created:** [July 11, 2024, 5:31pm UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080 "2024-07-11T17:31:13Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Electrolove](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/electrolove/32/2440_2.png) [@Electrolove](https://forum.electra.one/u/Electrolove)\
**Post date:** [July 11, 2024, 5:31pm UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/1 "2024-07-11T17:31:13Z")

</div>

I need help reading the names of UB-Xa patches. When triggering a dump from the panel, the UB-Xa dumps 8 sysex dumps for each sound. All in all 1024 sysex dumps for each bank. (8x128=1024). When I read the documentation that I uploaded here, it looks like the names are in positions 78-93, 16 characters. I can also read that each parameter contains two 7 bit characters for a 16 character patch name. Can someone explain to me how I can see the names as ASCII? The first name in Bank A should be Brass Ensemb… something. The display do not show all 16 characters.

[Bank A.syx](https://forum.electra.one/uploads/short-url/j5PlfnhtGV7RvfCPKyQztD3KwJK.syx) (110.6 KB)  
[Bank B.syx](https://forum.electra.one/uploads/short-url/tqR2ZdZYNyH4aTjc0oXyFZFfiIs.syx) (110.6 KB)  
[Bank C.syx](https://forum.electra.one/uploads/short-url/bzGOWbzjA3EQVS9k44D1UPEinqn.syx) (110.6 KB)  
[Bank D.syx](https://forum.electra.one/uploads/short-url/eWlBqZK16jLW7QH60pJEW5AnTH3.syx) (110.6 KB)

[Sysex Guide\_BE\_0722-AAF\_UB-Xa\_UB-Xa D.pdf](https://forum.electra.one/uploads/short-url/tfffs4nrH9KvsRDqSIU7VgqkIE8.pdf) (439.6 KB)

---

<div class="post-metadata">

**Author:** ![NewIgnis](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/newignis/32/767_2.png) [@NewIgnis](https://forum.electra.one/u/NewIgnis)\
**Post date:** [October 17, 2024, 7:14pm UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/2 "2024-10-17T19:14:38Z")

</div>

Are you on the latest firmware? There are some changes to the name length in it , I believe.

Here’s how to convert a number to a character. That’s the first step. After that you concatenate all received characters and then label a pad with it.

```auto
function displayChar (valueObject, value)
  return string.char(value)
end

```

---

<div class="post-metadata">

**Author:** ![Electrolove](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/electrolove/32/2440_2.png) [@Electrolove](https://forum.electra.one/u/Electrolove)\
**Post date:** [August 30, 2025, 5:55pm UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/3 "2025-08-30T17:55:35Z")

</div>

I just tried to search for the name Arpeggiotron in this .syx file but I do not find it. Need help.

[UB-Xa - Arpeggiotron.syx](https://forum.electra.one/uploads/short-url/xZSQiWX6FgllOort0TjFfWlCHQp.syx) (999 Bytes)

---

<div class="post-metadata">

**Author:** ![llamamusic.com](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/llamamusic.com/32/3212_2.png) [@llamamusic.com](https://forum.electra.one/u/llamamusic.com)\
**Post date:** [August 31, 2025, 5:18pm UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/4 "2025-08-31T17:18:45Z")

</div>

I posted a request trying to decipher UB-Xa Patch names over at the Gearspace forum _(Behringer UB-Xa - Owners Discussion)_. I received a reply but it looks I need a Computer Science degree to figure out the answer. Still no luck.

- 

“Posted by **Mr\_Mojo\_Risin**  
Any new details available about your solution for decoding ASCII Patch Names?\*

- 

Posted by **Willx** :  
Briefly, each pair of characters (where ascii is 7-bits normally stored in a byte of 8 bits) is bit-packed together into 14 bits, but then that is ordered little-endian (least significant byte first). So there’s a bit-shift (to shift the first byte into the second byte) and then a byte-swap (to put the second byte first). Thus the “every other byte matching” that I was seeing (from the byte swap) plus the “some bytes match if you do a bit-shift”.

The useful clue was in the sysex pdf where it says each pair of characters in the patch name has “value range” of “0,16383”. Two normal bytes would be a value range of 0-65535 (or 0-32767 if you ignored the high bit on the first ascii byte). But this said 16383 which is ie 2^14. So 14 bits, which requires the first byte to be bit-shifted into the second to get the 14-bits. But the pdf does \*not\* make it clear that the 2 bytes of 14-bit data are then little-endian (LSB) so ie that made things less apparent.

And note this is \*separate\* from the normal conversion of 7-bit midi data to 8-bit patch data. So ie 2 decodes (7-bit to 8-bit for the sysex data as a whole, and then unswap/unshift each pair of bytes in the patchname to get the ascii chars).

I’ve no idea \*why\* they use that particular encoding (the bit-packing doesn’t end up saving any space). Maybe it’s how the hardware expects it, so it’s easier to send it that way rather than converting for it. Maybe it’s what the original OBXA hardware did and they reproduced it exactly? No idea.”\*

---

<div class="post-metadata">

**Author:** ![oldgearguy](https://avatars.discourse-cdn.com/v4/letter/o/f4b2a3/32.png) [@oldgearguy](https://forum.electra.one/u/oldgearguy)\
**Post date:** [August 31, 2025, 6:02pm UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/5 "2025-08-31T18:02:21Z")

</div>

That’s a ‘standard’ encoding method for 2 bytes of sysex info. Lexicon’s PCM 80/81, others have this type of double compression. If no one posts an algorithm to decode it, I’ll put something up Monday. I’ve done this for other sysex implementations, so shouldn’t be too bad.

---

<div class="post-metadata">

**Author:** ![Electrolove](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/electrolove/32/2440_2.png) [@Electrolove](https://forum.electra.one/u/Electrolove)\
**Post date:** [September 1, 2025, 6:22am UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/6 "2025-09-01T06:22:32Z")

</div>

@oldgearguy, I look forward to your code example. It would make things a lot easier. Thanks in advance 😀

---

<div class="post-metadata">

**Author:** ![Electrolove](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/electrolove/32/2440_2.png) [@Electrolove](https://forum.electra.one/u/Electrolove)\
**Post date:** [September 1, 2025, 7:00am UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/7 "2025-09-01T07:00:33Z")

</div>

@llamamusic.com, very interesting information. Thanks for sharing.

---

<div class="post-metadata">

**Author:** ![NewIgnis](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/newignis/32/767_2.png) [@NewIgnis](https://forum.electra.one/u/NewIgnis)\
**Post date:** [September 1, 2025, 8:04am UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/8 "2025-09-01T08:04:24Z")

</div>

Looking forward too to your examples.

---

<div class="post-metadata">

**Author:** ![NewIgnis](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/newignis/32/767_2.png) [@NewIgnis](https://forum.electra.one/u/NewIgnis)\
**Post date:** [September 1, 2025, 8:05am UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/9 "2025-09-01T08:05:46Z")

</div>

And I’m looking forward to your sysex parsing of the UB-Xa. Will you use standard parsing methods from the E1, or will you write your own parsing logic in lua?

---

<div class="post-metadata">

**Author:** ![oldgearguy](https://avatars.discourse-cdn.com/v4/letter/o/f4b2a3/32.png) [@oldgearguy](https://forum.electra.one/u/oldgearguy)\
**Post date:** [September 2, 2025, 12:00am UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/10 "2025-09-02T00:00:08Z")

</div>

There was a holiday here and we had family over, so I had less time than planned.

Looking at the dump, I noticed that each packet is a separate sysex transmission. So they’re a lot of 0xF0 … 0xF7 blocks. That was throwing me off at first. No idea how the E1 will handle all these separate packets since each one has the same header. Code will be needed to deal with that I would think.

In any case, I’ll keep working on the parsing aspect of it.

---

<div class="post-metadata">

**Author:** ![Electrolove](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/electrolove/32/2440_2.png) [@Electrolove](https://forum.electra.one/u/Electrolove)\
**Post date:** [September 2, 2025, 5:00am UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/11 "2025-09-02T05:00:14Z")

</div>

Here are some things I’ve discovered. According to Behringer, they use the File Dump Standard.

 ![Screenshot 2025-09-02 at 06.53.36](https://europe1.discourse-cdn.com/flex017/uploads/electraone/original/2X/3/354164b2f5ab3053fc8f60fa0bc0664cb96e26b5.png)

Read more about how it works here, page 41.

[MIDI\_1-0\_Detailed\_Specification\_96-1-4.pdf](https://forum.electra.one/uploads/short-url/1HGTvGKPuJKuXokm8MGedVW27l6.pdf) (537.9 KB)

I’ve done a little analysis of a dump.

 ![Screenshot 2025-09-02 at 06.55.58](https://europe1.discourse-cdn.com/flex017/uploads/electraone/original/2X/f/fb251b2ddb7367bbd9d0f06b9758bce0fba929df.png)

If you look at the numbers marked in yellow, you can see that the header (01) and 7 packets (02) have different numbers (00-06). It could be used to distinguish the different dumps.

Then the dump should be unpacked and finally some magic with the patch name.

[UB-Xa - Xpress Brass.syx](https://forum.electra.one/uploads/short-url/hpuzntl6lFiOV6QgSxu9255u0Id.syx) (999 Bytes)

---

<div class="post-metadata">

**Author:** ![Electrolove](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/electrolove/32/2440_2.png) [@Electrolove](https://forum.electra.one/u/Electrolove)\
**Post date:** [September 2, 2025, 7:10am UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/12 "2025-09-02T07:10:30Z")

</div>

After looking a little more at File Dump Standard, I have come to the following conclusion.

Yellow = One-byte packet count (00 in this example)

Orange = One-byte packet size: number of encoded data bytes minus one (7F in this example)

Blue = The data (128 bytes in this example)

Green = One-byte checksum (XOR of all bytes which follow F0 up to the checksum byte)  
Can someone please calculate if checksum 07 is correct?

 ![Screenshot 2025-09-02 at 09.03.32](https://europe1.discourse-cdn.com/flex017/uploads/electraone/original/2X/7/7b0831a7af38c9cdb83c96b50d3603c2a8bee3b6.png)

---

<div class="post-metadata">

**Author:** ![Electrolove](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/electrolove/32/2440_2.png) [@Electrolove](https://forum.electra.one/u/Electrolove)\
**Post date:** [September 2, 2025, 11:22am UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/15 "2025-09-02T11:22:29Z")

</div>

AI helped me make a php script that calculates the checksum.

 ![php script](https://europe1.discourse-cdn.com/flex017/uploads/electraone/original/2X/a/a2f5d414a64a2d230e5f4e26c11b86ab9279f7bb.png)

It seems that the numbers that are highlighted are the numbers that should be used in the checksum calculation. If that is correct, **Behringer has not followed the File Dump standard**  **100%**. The standard says that all bytes except F0, Checksum and F7 should be included. The checksum in this example is 07 and that is what the php script also calculates.

 ![checksum](https://europe1.discourse-cdn.com/flex017/uploads/electraone/original/2X/9/958b7ce64a627b1c988ef19200b35063ad9ef143.png)

---

<div class="post-metadata">

**Author:** ![oldgearguy](https://avatars.discourse-cdn.com/v4/letter/o/f4b2a3/32.png) [@oldgearguy](https://forum.electra.one/u/oldgearguy)\
**Post date:** [September 2, 2025, 11:55am UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/16 "2025-09-02T11:55:02Z")

</div>

For sysex messages the checksum is for the receiver to verify the data is unchanged. The manufacturer ID, model, etc in the header is never included, only the data portion.

---

<div class="post-metadata">

**Author:** ![Electrolove](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/electrolove/32/2440_2.png) [@Electrolove](https://forum.electra.one/u/Electrolove)\
**Post date:** [September 2, 2025, 12:01pm UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/17 "2025-09-02T12:01:13Z")

</div>

I started from what was in the File Dump Standard. Ok, how do we proceed with the patch name?

 ![Screenshot 2025-09-02 at 13.59.11](https://europe1.discourse-cdn.com/flex017/uploads/electraone/original/2X/c/c2e86be75e231b99c4600b8cc160a8b2833c2b72.png)

---

<div class="post-metadata">

**Author:** ![Electrolove](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/electrolove/32/2440_2.png) [@Electrolove](https://forum.electra.one/u/Electrolove)\
**Post date:** [September 2, 2025, 12:29pm UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/18 "2025-09-02T12:29:21Z")

</div>

**Packed data from packet 0**

70 00 00 00 0C 40 27 10  
5E 10 40 7F 7F 7F 70 1A  
40 00 00 10 00 10 38 50  
32 43 40 5A 20 49 40 63  
30 00 00 00 00 50 7F 70  
01 3F 00 00 10 00 00 00  
1C 40 00 7F 7F 20 63 00  
33 00 20 63 00 00 70 09  
0C 10 00 60 7F 10 00 00  
50 58 00 62 00 41 00 0F  
28 00 74 00 00 00 00 00  
21 3C 70 2C 65 39 73 39  
10 42 10 61 39 73 39 20  
00 10 20 10 00 01 10 00  
03 7F 3B 00 00 03 00 03  
00 00 00 00 00 0C 01 01

**Unpacked data from packet 0**

00 00 00 0C C0 A7 90 10  
C0 FF FF FF 70 9A 00 00  
10 00 10 38 D0 43 C0 5A  
20 C9 C0 63 00 00 00 00  
D0 FF 70 BF 00 00 10 00  
00 00 40 00 FF FF A0 63  
00 80 A0 63 00 80 F0 09  
10 00 E0 FF 10 00 00 58  
00 62 00 C1 00 8F 00 74  
00 80 00 80 00 BC 70 2C  
65 39 F3 39 42 10 61 39  
F3 39 20 10 20 10 00 01  
10 00 FF BB 00 00 03 00  
03 00 00 00 00 0C 01 01

**Patchname** , this is where I do not understand, please help me @oldgearguy I don’t even know which packet number (0-6) the name is in? The UB-Xa manual says offset 78.

Please correct me if the unpacked data is not correct.

---

<div class="post-metadata">

**Author:** ![oldgearguy](https://avatars.discourse-cdn.com/v4/letter/o/f4b2a3/32.png) [@oldgearguy](https://forum.electra.one/u/oldgearguy)\
**Post date:** [September 6, 2025, 3:01pm UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/19 "2025-09-06T15:01:23Z")

</div>

@martin - is there any way for the E1 to accept an arbitrary stream of bytes to process?

I know the patch.onRequest() and patch.onResponse() starts a communication and the expected data is a single 0xF0 … 0xF7 response.

What if the device sends a series of sysex messages? Is there some way to process all of them in a single pass?

---

<div class="post-metadata">

**Author:** ![Electrolove](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/electrolove/32/2440_2.png) [@Electrolove](https://forum.electra.one/u/Electrolove)\
**Post date:** [September 9, 2025, 12:07pm UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/20 "2025-09-09T12:07:53Z")

</div>

I don’t really know how to solve it right now. You can see which of the 6 dumps is coming into Electra with the help of packet count. So you should be able to use the standard parsing method.

---

<div class="post-metadata">

**Author:** ![martin](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.electra.one/martin/32/145_2.png) [@martin](https://forum.electra.one/u/martin)\
**Post date:** [September 9, 2025, 1:26pm UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/21 "2025-09-09T13:26:03Z")

</div>

> [@oldgearguy](#):
>
> I know the patch.onRequest() and patch.onResponse() starts a communication and the expected data is a single 0xF0 … 0xF7 response.
> 
> What if the device sends a series of sysex messages? Is there some way to process all of them in a single pass?

The request and response are not tightly coupled. A preset may have many responses defined. Electra will pick and process all of them. Also, sending the request is not mandatory for processing the responses.

If the data is transferred as multiple packets, the common header bytes should be defined to detect them and Lua used to assemble the complete message.

---

<div class="post-metadata">

**Author:** ![oldgearguy](https://avatars.discourse-cdn.com/v4/letter/o/f4b2a3/32.png) [@oldgearguy](https://forum.electra.one/u/oldgearguy)\
**Post date:** [September 9, 2025, 4:52pm UTC](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080/22 "2025-09-09T16:52:34Z")

</div>

So I could request a patch dump and if the synth sent back 7 sysex messages (all with the same 0xF0 .. header .. data .. 0xF7 format) the Electra One would process all of them and strip the F0/F7 and concatenate the messages?

Or - I would need to use Lua to understand I’m seeing message 1 of 7, 2 of 7, etc?

(I think option B, but just want to make sure)

[Next page](https://forum.electra.one/t/need-help-with-behringer-ub-xa-sysex/3080.md?page=2)
