Bits & Bytes

5-polige DIN MIDI plugZie ook: binair en hex

Midi is een taal. Een computertaal om precies te zijn. De miditaal kent bytes als woorden en bits als letters. Het is niet erg gangbaar dat een gebruiker van digitale produkten zich bezighoudt met die bits en bytes. Wie een tekst maakt met een tekstverwerker en daarna print op papier zal zich er niet echt druk om kunnen maken wat er precies door de computer naar de printer wordt gestuurd. Zolang de tekst maar op papier verschijnt. De computercodes die naar de printer gaan, hoef je niet te snappen om met de apparatuur te werken.

Zo kun je ook met midi werken. Je kunt midi gebruiken zonder te weten wat er nou allemaal precies voor data door de midikabels gaan. Als je een synthesizer aansluit op een soundmodule, is het ook absoluut niet nodig om te weten dat er bijvoorbeeld een verschil is tussen note-off en note-on met velocity 0.

Zodra je echter met midisoftware gaat werken, kan het ineens wel belangrijk worden om wat meer over de inhoud en opbouw van midi te weten. Zeker als je gaat editen in een sequencer. Spelenderwijs zul je tijdens edit-operaties meer leren over het wezen van de diverse midi-commando's. In een Event List van een sequencer kun je zien dat bijvoorbeeld een note-commando bestaat uit drie bytes en dat een program change commando bestaat uit twee bytes. Is dat belangrijk? Dat kan heel belangrijk zijn ja.



SERIEEL
Mididata worden serieel verstuurd. Dat betekent dat de midicommando's na elkaar door de kabel gaan. Als je een vijfstemmig akkoord speelt op je midiklavier, worden de vijf note-on commando's na elkaar verstuurd. Dat gaat zo razendsnel dat jouw oren het helemaal niet zullen merken dat de noten na elkaar komen. Je hoort het akkoord gewoon, goed getimed uit je soundmodule komen. Als één klinkend geheel en niet als een arpeggio.

Als je naar een film kijkt, zie je vloeiende bewegingen terwijl je eigenlijk naar allemaal afzonderlijke beeldjes zit te kijken. Maar die beeldjes volgen elkaar zo snel op dat je ogen het onderscheid daartussen niet meer kunnen maken.
We mogen ook niet uit het oor verliezen dat mensen vaak horen wat ze willen horen of denken te horen. Timing en gelijkheid zijn absoluut te meten maar de menselijke interpretatie kan de harde cijfers toch heel anders ervaren.


DE BITS
Midicommando's bestaan uit bytes. Een byte is een 'woord' dat is opgebouwd uit acht bits (bij midi). Een bit is een getalletje dat twee verschillende waarden kan hebben: 0 of 1. Met acht verschillende bits (een byte dus) zijn 256 variaties van nullen en enen mogelijk.
Zoals wij 1, 2, 3, 4, 5 tellen, doet midi dat op de volgende manier met bytes:
(0) 00000000
(1) 00000001
(2) 00000010
(3) 00000011
(4) 00000100
(5) 00000101
Dat gaat door tot en met de byte: 11111111. Die acht enen staat voor het getal 255. Omdat midi begint te tellen bij 0 (mensen beginnen altijd bij 1) zijn er dus 256 verschillende waarden mogelijk.

De bytes kom je zelden tegen in deze vorm met enen en nullen. Zeker niet als je gewoon met midi werkt. Dit is de manier zoals midi door de kabels wordt verstuurd. Je kunt het zien als een soort morse. Er gaan allemaal stroompjes door de kabel. Nul is wel een stroompje en 1 is geen stroompje. Als het getal 5 wordt verstuurd, wordt er dus razendsnel achter elkaar stroom-stroom-stroom-stroom-stroom-geenstroom-stroom-geenstroom gegeven. Zie ook de MIDI calculator!


BINAIR EN HEXADECIMAAL
Deze manier van tellen in nullen en enen heet: binair. In het dagelijks gebruik van midi kom je deze bit-notatie vrijwel nooit tegen. Het is wel gangbaar in een Midi Data List van synthesizers. Meestal wordt de binaire vorm weergegeven in hexadecimale getallen. In plaats van 00000000 hebben we het dan over $00. Hexadecimaal loopt in dit geval van $00 tot en met $FF (=255).


STATUSBYTES EN VALUEBYTES
Het is leuk dat je met die bytes 256 verschillende combinaties kunt maken, maar het zomaar willekeurig doorsturen van die enen en nullen haalt natuurlijk niets uit. Er zijn afspraken gemaakt over de betekenis van de verschillende getallen. Zo is 10010000 ($90) bijvoorbeeld gedefinieerd als note-on commando op midikanaal 1. Omdat een note-commando op zestien verschillende midikanalen doorgestuurd moet kunnen worden zijn er zestien verschillende note-on-commando's. De volgende is 10010001 ($91) voor een note-on op midikanaal 2. Dat gaat door tot 10011111 ($9F) voor een note-on op midikanaal 16.
Merk op dat de laatste vier bits van dit commando het midikanaalnummer bepalen. De eerste vier bits geven aan wat voor soort commando het is: note-on in dit geval.
Het commando voor een note-off op midikanaal 1 is: 10000000 ($80). Het verschil tussen een note-on en een note-off is dus maar 1 bitje.

Dat note-on commando op zich is nog niet compleet. In deze byte is namelijk nog niet vastgelegd WELKE noot aan moet en ook niet met welke velocitywaarde die noot aan moet. Daar zijn twee extra bytes voor nodig. Een compleet note-on commando bestaat uit drie bytes.
De eerste byte bevat twee gegevens: wat voor soort commando het is (note-on in dit geval) en het midikanaalnummer.
De tweede byte vertelt welk nootnummer (toets, toon) het is.
De derde byte geeft de velocitywaarde van de noot aan.

Als je een middelste C-toets op een midikeyboard indrukt, worden via midi de volgende bits verstuurd: 10010000 00111100 01010000. Er worden nog wat meer bits verstuurd omdat midi met een startbit en een stopbit werkt maar dat is nu niet relevant. In hexadecimalen ziet het er alsvolgt uit: $90 $3C $50. Vertaald in gewoon nederlands staat hier: er is een note-on op midikanaal 1, het is de noot C3 en de aanslagsnelheid is 80.

De eerste byte van deze serie van drie heet Statusbyte. De twee overige bytes heten Valuebytes. De statusbyte geeft aan wat voor soort midicommando het betreft; note, pitchbend, program change etc. De valuebytes geven alleen maar waarden aan. Er is geen verschil tussen een valuebyte voor een note en een valuebyte voor bijvoorbeeld pitchbend of aftertouch. De statusbyte die voorafgaat aan een valuebyte bepaalt de betekenis van die valuebyte.

Een statusbyte begint altijd met een 1 als eerste bit. Een valuebyte heeft altijd een 0 als eerste bit. Als je 00110110 ziet staan, weet je dat het een valuebyte is, want hij begint met een 0. Omdat de eerste bit wordt gebruikt om de toestand van een byte aan te geven blijven er zeven bits over om verschillende waarden mee te maken. Dat levert 128 verschillende mogelijkheden op. Vandaar dat velocitywaarden van 0 tot 127 gaan en dat er ook 128 nootnummers zijn.


CHANNEL EN SYSTEM
Niet alle midi-commando's worden via een midikanaalnummer verstuurd. Er zijn een aantal commando's die zonder kanaalspecificatie worden verzonden. Dat zijn de zogenaamde System Messages. Commando's die wel een midikanaalnummer bevatten heten: Channel Messages.

Overzicht van MIDI data:

Message Hex Decimal Data byte count
data 00-7F 0-127 na
Channel messages
Note off 8n 128+n 2
Note on 9n 144+n 2
Polyphonic key pressure An 160+n 2
Control/Mode change Bn 176+n 2
Program change Cn 192+n 1
Monophonic channel pressure Dn 208+n 1
Pitch bend change En 224+n 2
System exclusive
System exclusive status F0 240 variable
System common
MIDI Time Code (MTC) F1 241 1
Song position pointer F2 242 2
Song select F3 243 1
(Undefined) F4 244 0
Cable select* F5 245 1
Tune request F6 246 0
End of exclusive (EOX) F7 247 0
System real-time
Timing clock F8 248 0
(Undefined) F9 249 0
Start FA 250 0
Continue FB 251 0
Stop FC 252 0
(Undefined) FD 253 0
Active sense FE 254 0
System reset FF 255 0

Note: n is the channel number - 1 (0 is channel 1, 1 is channel 2, ...).

* Though officially undefined, some MIDI interfaces use this message to control cable access; a single data byte that follows designates the cable number on which subsequent MIDI messages are routed.

MIDI Controller Numbers

The table below presents a summary of the MIDI Standard Controller codes
in decimal and hexadecimal (h) form.
Decimal Hex Controller Name
0 00h Bank Select (Controller # 32 more commonly used)
1 01h Modulation Wheel
2 02h Breath Contoller
3 03h Undefined
4 04h Foot Controller
5 05h Portamento Time
6 06h Data Entry MSB
7 07h Main Volume
8 08h Balance
9 09h Undefined
10 0Ah Pan
11 0Bh 0Ch
12 0Ch Effect Control 1
13 0Dh Effect Control 2
14-15 0E-0Fh Undefined
16-19 10-13h General Purpose Controllers (Nos. 1-4)
20-31 14-1Fh Undefined
32-63 20-3Fh LSB for Controllers 0-31 (rarely implemented)
64 40h Damper Pedal (Sustain) [Data Byte of 0-63=0ff, 64-127=On]
65 41h Portamento
66 42h Sostenuto
67 43h Soft Pedal
68 44h Legato Footswitch
69 45h Hold 2
70 46h Sound Controller 1 (default: Sound Variation)
71 47h Sound Controller 2 (default: Timbre/Harmonic Content)
72 48h Sound Controller 3 (default: Release Time)
73 49h Sound Controller 4 (default: Attack Time)
74 4Ah Sound Controller 5 (default: Brightness)
75-79 4B-4Fh Sound Controller 6-10 (no defaults)
80-83 50-53h General Purpose Controllers (Nos. 5-8)
84 54h Portamento Control
85-90 55-5Ah Undefined
91 5Bh Effects 1 Depth (previously External Effects Depth)
92 5Ch Effects 2 Depth (previously Tremolo Depth)
93 5Dh Effects 3 Depth (previously Chorus Depth)
94 5Eh Effects 4 Depth (previously Detune Depth)
95 5Fh Effects 5 Depth (previously Phaser Depth)
96 60h Data Increment
97 61h Data Decrement
98 62h Non-Registered Parameter Number LSB
99 63h Non-Registered Parameter Number LSB
100 64h Registered Parameter Number LSB
101 65h Registered Parameter Number MSB
102-120 66-78h Undefined

Channel Mode Messages

121 79h Reset All Controllers
122 7Ah Local Control
123 7Bh All Notes Off
124 7Ch Omni Off
125 7Dh Omni On
126 7Eh Mono On (Poly Off)
127 7Fh Poly On (Mono Off)

* Met dank aan MOPRO.nl

Links

Donatie

Dit is een gratis site, die al sinds 2003 voortdurend wordt uitgebreid en geactualiseerd. Als jij ook wilt dat dat zo blijft, doe dan een donatie aan Popschool Maastricht >>

QR code https://www.popschoolmaastricht.nl:443/college_midi_bitsenbytes.php

Bijgewerkt op: 28 Februari, 2024