Signed byte from -36 to +36?

Hi.

I’m trying to get a sysex parameter value to go from -36 to +36 but I just lack the appropriate geeky knowledge, I’ve got it moving in all sorts of random ways with the signed byte, 2 comp etc, can someone help a guitarist out?

Thanks

You can’tsend negative values. The manufacturer will have provided some conversion to store those negative values somehow. Do you have the documentation about that sysex from the manufacturer?

Hi there, thanks for the reply.

I was under the impression that this was a ‘signed byte’, the 8th bit being the sign according to a youtube vid: (13) Signed and Unsigned Numbers Made Easy! – Bits, Bytes & Binary Numbers - YouTube

Does this help?:

I’m working down this list…

I have had the required parameter displaying positive and negative values, just not a smooth transition as you would like.

Not really. That table won’t give you the answers you seek.

manufacturers were quite creative in how negative numbers are sent. Old Oberheim do it differenlty than recent ones. Korg used to have a very unique way of setting negative numbers in sysEx. It’s better to find out yourself.

What synth or device are we talking about ? Do you have its sysEx manula, you can share?
Is the synth able to send out a sysEx parameter change for this parameter? Are you able to intercept it wiht MIDI-Ox , MIDIview or something similar?
If you could intercept sysEx on values -36, -35, -1, 0, 1 and 36 , then we can derive the rule to set in the parsing.

an example to show you that a format without signs may carry negative values :

this is a modulation amount from the mod matrix on a microQ set to value -64:
image
to value -63:
image
to value -1:
image
to value 0:
image
to value +1:
image
to value +63
image

You can see the actual sysEx value go from 0 to 127, while the meaningful value is obtained by subtracting 64 when displaying the parameter. In this case we will parse and store the value as received (0…127) but change the display value of the parameter to show it as -64…63.

But your system might work differently

Sounds like you are addressing the correct parameter, but not sending the value bytes in the correct format.

Although MIDI transmits values in 8-bit bytes, the eighth bit (or first bit?) is always reserved, meaning in reality it is a 7-bit-per-byte system (hence why, as NewIgnis says, a single byte can only represent 0-127 in decimal).

(idk why the founding fathers of MIDI made it that way, their ways are mysterious. But beware of spreadsheet ‘dec2hex’ functions as they always assume the full 8 bits are available to do the conversion.)

On the synth I’m working on, the parameter values are ‘nibble-ised’ into least significant-most significant (lsb-msb) bytes, which allows values much greater than 0-127 to be parsed by the synth.

For negative values, the 14th bit position (i.e. the least significant bit of the least significant byte) is used to indicate whether the nibbleised value is positive or negative; 0 = positive, 1 = negative (this is standard).

So I would try either the 7th or 14th bit position as being your sign bit, that would seem logical to me.

Hey thanks for that, very useful.

This is one of the ancient artifacts I’m working on:
Akai Z4 & Z8 SysEx Specifications.pdf (1.0 MB)
The question that’s bugging me ATM though is, what exactly is an SBYTE?

Hey EJ, thanks for the reply.

I am addressing the correct parameter it seems but where the knowledge runs out for me ATM is how I represent your suggestions in the sysex visual editor when ‘parameter’ is selected:


Martin showed me a cool dodge whereby it’s split across two instances of the parameter value (nibbles?) but that only worked for another synth I’m working on.

Any tips you can give would be most appreciated.

Martin posted a useful guide to setting the sign bit in this thread that might help you: https://forum.electra.one/t/sysex-fader-set-to-14-bit-2s-complement-signed/2190

From the manual I interpret the thing as follows

  • SBYTE : ‘sign’ , ‘value’ => ±127
  • ‘sign’: 0 = positive, 1 = negative.
    = > ‘value’ should be 0…127

So if I would try the following: always include two values in the sysex for any SBYTE:

  • the first is 0 when the parameter is positive, and 1 when negative . Thus only one bit of the byte is used.
  • the second contains the absolute value of the parameter.

Examples :

  • send 24 as ‘0’,’24’
  • send 0 as ‘0’,’0’
  • send -13 as ‘1’,’13,

Thanks just looking now.

1 Like

Nice one, got it, really appreciate your help! I’m going to be combing through your presets soon, lots to study.

1 Like