Hoe wordt de checksum berekend?

Enzo.F

vrijwillig lid
Lid sinds
31 mei 2010
Berichten
1.663
Locatie
a forest
Een specifieke sysex midi byte is de checksum. Dit is een getal tussen de 0 en 127. De midi implementatie zegt hierover:
Checksum, being the exclusive OR of the previous 120 bytes.
Dit geeft mij de indruk dat het een berekening is van de voorgaande 120 12bit bytes. Maar hoe...
Anyone has a clue?
 
Er is info te vinden in boeken over midi, In de oudere roland docs staat ook goeie into, met een voorbeeld,
Zelf waag ik het niet om dat uit te leggen, laat staan programmeren is één of andere taal of script
 
Heb je Google geprobeerd voordat je hier een vraag stelde? "midi sysex checksum" -> eerste hit heeft rekenvoorbeelden.
 
Laatst gewijzigd:
Er is info te vinden in boeken over midi, In de oudere roland docs staat ook goeie into, met een voorbeeld,
Zelf waag ik het niet om dat uit te leggen, laat staan programmeren is één of andere taal of script

Thanks, Google geeft uitleg. Is wel complexer dan ik verwacht had.
 
Sysex checksum wordt zo berekend:

converteer eerst alle bytes die meetellen van hex naar dec.
tel die bij elkaar op.
doe de uitkomst daarvan modulo 128.
trek die uitkomst van 128 af.

Als voorbeeld:

stel je som van al je bytes is 5683 (zomaar een random getal)

5683/128=44.39xxxx....


Dan weet je dat je in ieder geval 44x128 uit 5683 kunt halen.

44*128=5632
5683-5632=51

51 is je uitomst.

nu doe je 128-51=77

77 is je checksum in dec.
in hex is dat 4D.
 
ik wil dat wel eens zien in code vorm,,,

ik ben zelf beperkt tot basic, wat nog vrij overzichtelijk is,
maar ik krijg het ook nog altijd niet voor alles perfect werkend,

mijn manier van programeren tot nu toe,, is de sysex vergelijken met een andere editor
 
Ik heb even een max/msp visualisatie gemaakt van de berekening, wellicht helpt dat je.
 

Attachments

  • Screen Shot 2017-07-25 at 22.39.20.jpg
    Screen Shot 2017-07-25 at 22.39.20.jpg
    27 KB · Bekeken: 105
okey merci,

roland gebruikt de laatste jaren ook extra bytes voor de data begint
da's ook iets lastig,, vanaf welke byte begint de checksum te tellen ?
da's geen vaste waarde, jammer genoeg,,,
 
tja, ik weet dat het ni simpel is om het voor alle fabricanten te laten werken,

als mijn gebruikte procedures nu niet werken, dan geef ik een correctiewaarde mee,
en da's plak werk off course,, niet the real thing, maar da's ingenieurs niveau denk ik,,
 
Sysex checksum wordt zo berekend:

converteer eerst alle bytes die meetellen van hex naar dec.
tel die bij elkaar op.
doe de uitkomst daarvan modulo 128.
trek die uitkomst van 128 af.

Als voorbeeld:

stel je som van al je bytes is 5683 (zomaar een random getal)

5683/128=44.39xxxx....


Dan weet je dat je in ieder geval 44x128 uit 5683 kunt halen.

44*128=5632
5683-5632=51

51 is je uitomst.

nu doe je 128-51=77

77 is je checksum in dec.
in hex is dat 4D.

Dit is geweldig, plaatsgenoot! Thanks!
 
Even ter correctie: een byte is altijd 8 bits.

you are right! de handleiding zegt over de bytes die de sample blocks definiëren:
Code:
SW represents a 12 bit value transmitted as two MIDI bytes:
first byte:	0	d11	d10	d9	d8	d7	d6	d5
second byte:	0	d4	d3	d2	d1	d0	0	0
Coding is offset binary, zero is sent as 40H 0

en het gaat niet om 120 bytes maar om 60 double bytes, zoals de midi-implementatie aangeeft, dat had ik eerder ook nog niet helder. Thanks voor de scherpte, Dreamer!
 
you are right! de handleiding zegt over de bytes die de sample blocks definiëren:
Code:
SW represents a 12 bit value transmitted as two MIDI bytes:
first byte:	0	d11	d10	d9	d8	d7	d6	d5
second byte:	0	d4	d3	d2	d1	d0	0	0
Coding is offset binary, zero is sent as 40H 0

en het gaat niet om 120 bytes maar om 60 double bytes, zoals de midi-implementatie aangeeft, dat had ik eerder ook nog niet helder. Thanks voor de scherpte, Dreamer!
Er klopt iets niet in je schrijfwijze n.m.i. Een byte in hexadecimale vorm kan maximaal bestaan uit twee cijfers.
Met maximale waarde FF. Hexadecimale schrijfwaarden zijn 0 t.e.m. 9 en A B C D E F. De H of 0x tekens worden soms toegevoegd enkel om aan te geven dat de weergave hexadecimaal is, die hebben verder geen nut. (Dus d10 en d11 ???? Dat lijkt me gewoon een rang aanduiding.)
De AD-convertie van je samples gebeurt zws met 12 bit (zo bestaan er ook 8 en 16 bit AD convertors). D.w.z. dat de maximale grootte van 1 sample-waarde 2^12 kan zijn = 4096. Dat is al groter dan 1 byte of 2^8 =256.
Bij 16 bit AD-convertie wordt dat 2^16 = 65536. Om zulke grote getallen te stokeren heb je minimum twee bytes nodig.
 
(Dus d10 en d11 ???? Dat lijkt me gewoon een rang aanduiding.)
Inderdaad een placeholder om de volgorde en positionering van de data in de byte aan te geven.

audiocollage:1969935 schreef:
De AD-convertie van je samples gebeurt zws met 12 bit (zo bestaan er ook 8 en 16 bit AD convertors). D.w.z. dat de maximale grootte van 1 sample-waarde 2^12 kan zijn = 4096. Dat is al groter dan 1 byte of 2^8 =256.
Bij 16 bit AD-convertie wordt dat 2^16 = 65536. Om zulke grote getallen te stokeren heb je minimum twee bytes nodig.
Dit is fijne info! Super waardevol en interessant! Stukje bij beetje leer ik het verder te doorgronden!

Thanks!
 
Back
Top