Midi Introductie
Datum: Sat 05 July 2014
Samenvatting: Midi eenvoudig op byte niveau uitgelegd - een introductie naar een Midi Implementatie.
Het volgende idee is geboren. Laat Midi signalen zien op de RGB Led Matrix Panelen.
In januari 1986 publiseerde het elektronica maandblad Elektuur een artikel over en een Yahama DX7, waarin men op Midi inging en wel op byte-niveau. Dit was mijn eerste kennismaking met Midi.
Het zal ook ongeveer 1986 zijn geweest, toen ik een 5 oktaafs Midi keyboard (Cheeta Mk5) gekocht had. Het was een eenvoudig keyboard, 61 toetsen, een Pitchbend-wiel, een 3-cijferig display, 4 led's en een drukknop.
Enkele jaren later kocht ik ook een low-budget drum-computer (Siel MPD40). Naast 40 rythme-patronen, kon elk drum-geluid met de hand worden gespeeld en dit apparaat heeft ook midi aansluitingen.
In 1988 werd het tijd om wat meer te doen met midi en de commodore-64 die ik toen had. Er werd een midi-interface ontworpen (met een eigen ACIA 6551), een print ervoor gemaakt (voor achterin de expantie-poort van de cbm-64) en gebouwd.
Om hiervoor software te kunnen schrijven, was het nodig om het eerder genoemde midi artikel eens goed door te spitten. De uiteindelijke software bestond uit een stuk machinetaal en een stuk basic programma. Het machinetaal-deel (geschreven in 6502-assembly (18 kantjes = ong. 1080 regels => 2200bytes)) had als taken om de data uit de Acia (met een interupt) te decoderen en rechtstreeks de noten naar de SID (= 6581) te sturen. Het geheel was 3-tonig polifonisch ... meer oscilators heeft de SID niet. Het basic-deel (gegevens niet meer bekend) had als taak om de instellingen van de SID te regelen (ADSR, Golfvorm (zaagtand, driehoek, blokgolf) en volume).
Inmiddels had ik het cheeta keyboard verkocht aan een vriend, die het gebruikte als tweede keyboard voor zijn electronische piano. In 2014 heb ik een Roland keyboard (A49) gekocht om opnieuw met Midi te kunnen experimenteren.
En hoewel er de afgelopen 25 jaar veel veranderd is met de elektronische muziek apparaten, is de Midi-norm nog steeds hetzelfde gebleven. Een teken dat men toen, begin jaren 1980, een ver vooruitziende blik had. Want tegenwoordig is het echt plug & play ... sluit het op elkaar aan en het werkt gewoon.
Midi eenvoudig uitgelegd.
Op elektro-niveau heeft Midi gelijkenis met RS 232, daarnaast zijn er ook verschillen.
Overeenkomsten |
Startbit - Databits - Stopbit |
Zelfde bitvolgorde |
Zelfde chips zijn te gebruiken |
verschillen: | Midi | RS232 |
Connector | 5 polig Din 180gr | 25-polig of 9-polig D-connector |
Ingang/ Uitgang | Elk zijn eigen connector | gecombineerd in 1 connector |
Stroom/ Spanning | 10..20mA (voor 1 Led) | +/-12V |
Snelheid | 31250bit/sec | 50 .. 115000bit/sec |
Galvanische scheiding | Opto-coupler | Nee |
Spanning omzetting | Opto-coupler en TTL | Ja +/-12V <=> 5V |
Bitjes | 8 bits; geen parity | 5..8 bits; even/ oneven/ geen pariteit |
Handshake | Geen | Rts/Cts en Dsr/Dtr/Dcd |
Norm omschrijving | hardware en software | alleen hardware |
Op byte niveau heeft Midi korte boodschappen van 1, 2 of 3 bytes groot, een commando-byte en 0 .. 2 data-bytes (uitgezonderd is de System Excclusive - deze is merk specifiek en zal daarom ook hier niet verder besproken worden). Simpel gezegd, is elke byte met zijn hoogste bit hoog ($80 tot en met $FF) een commando-byte en elke byte met zijn hoogste bit laag ($00 tot ent met $7F) een data-byte.
Commando-bytes en Midi-Kanalen.
Midi kent 7 verschillende commando's, genummerd vanaf $8 tot en met $E. Commando $F bevat diverse Systeem Common Commando's (hieronder valt ook de System Exclusive). De commando-byte bevat ook een kanaal-nummer (Hexadecimaal genummerd vanaf $0 tot en met $F, in de meeste muzikanten documentatie genummerd vanaf 1 tot en met 16). Om dit te combineren staat het commando in de hoogste 4 bits (4..7) en het kanaalnummer de laagste 4 bits (0..3).
7 | 6 | 5 | 4 | | 3 | 2 | 1 | 0 |
4 Commando bits $8..$F | | kanaalnummer $0..$F (= c1..c16) (*) |
*) Voor programmeurs en digitalisten zal ik hier de kanaalnummers hexadecimaal aanhouden als $0..$F. Voor anderen, zoals muzikanten, noteer ik ze als c1..c16 (c van channel, niet te verwarren met de C-noot).
Bij elk midi apparaat is het kanaal in te stellen, tevens bestaat de stand "Omni", waarbij het apparaat elk commando verwerkt zonder naar het kanaal nummer te kijken.
De 7 Commando-bytes zijn als volg gedefinieerd:
KorteNotatie | Byte | Commando | Databytes | Uitleg |
$8c $nn $vv | $8 | Note Off | 2 | Zet een noot $nn uit |
$9c $nn $vv | $9 | Note On | 2 | Zet een noot $nn aan met aanslag gevoeligheid $vv. |
$Ac $nn $vv | $A | Aftertouch | 2 | Doe een aftertouch op noot $nn met gevoeligheid $vv. |
$Bc $cc $vv | $B | Control/ Mode Change | 2 | Verander een Control $cc met waarde $vv. |
$Cc $pp | $C | Program Change | 1 | Verander het programma naar $pp |
$Dc $vv | $D | Channel Aftertouch | 1 | Doe een (gemiddelde(?) aftertouch met waarde $vv |
$Ec $ll $hh | $E | Pitchbend | 2 | verander de Pitch met waarde $hhvv ($hh=msb & $vv=lsb) |
System Common Commando-bytes.
Naast deze 7 commando-bytes kent Midi zo'n 11 System Common Commando-bytes. De codes hiervoor gelden voor de gehele Midi-keten en bepalen onder ander het tempo van sequencers en drumcomputers, liednummers en bevat een communicatie op apparatuur-niveau. Deze laatste, de System Exclusive, is erg merk gebonden en vormt de lastigste code om te decoderen en te implementeren. Toendertijd op mijn cbm-64 heb ik deze compleet genegeerd.
Deze System Common Commando-bytes zijn als volg gedefinieerd:
KorteNotatie | Byte | Commando | Databytes | Uitleg |
$F0 ?? ?? ?? | $F0 | System Commando's | variabel | System Exclusive Start |
$F1 $dd | $F1 | System Commando's | 1 | Midi Tijd Code met waarde $dd |
$F2 $ll $hh | $F2 | System Commando's | 2 | Kies de lied-positie $hhll ($hh=msb & $vv=lsb) |
$F3 $ss | $F3 | System Commando's | 1 | Kies een lied $ss |
$F4 | $F4 | System Commando's | 0 | * niet gedefinieerd * |
$F5 | $F5 | System Commando's | 0 | * niet gedefinieerd * |
$F6 | $F6 | System Commando's | 0 | Tune aanvraag (Tune request) |
$F7 | $F7 | System Commando's | 0 | System Exclusive Einde |
$F8 | $F8 | System Commando's | 0 | Tijdklok (24 stuks in 1 kwart maat) |
$F9 | $F9 | System Commando's | 0 | * niet gedefinieerd * |
$FA | $FA | System Commando's | 0 | Start |
$FB $ss | $FB | System Commando's | 1 | Continue |
$FC | $FC | System Commando's | 0 | Stop |
$FD | $FD | System Commando's | 0 | * niet gedefinieerd * |
$FE | $FE | System Commando's | 0 | Actief zijn Aanvraag |
$FF | $FF | System Commando's | 0 | Systeem Reset |
Midi en de Led-panelen.
In het kort: De panelen zijn 16 led's hoog. Er zijn 7 Midi commando's en er zijn de System Common Commando. Elk commando kan op 2 regels Led's worden getoond. Iets met letters neemt te veel ruimte in, dus het wordt iets met afzonderlijke Led's aan en uitzetten.
De commando's Noot-aan en Noot-uit vormen een paar. Deze kunnen zelfs 4 regels Led's gebruiken.
KorteNotatie | Commando | Led regels | Uitleg |
$8c $nn $vv | Note Off | 0..3 | Zie Noot On ($9n), maar zet de Led uit. |
$9c $nn $vv | Note On | 0..3 | De noot $nn bepaalt welke Led zal branden. Oneven noten op de bovenste regel, even notenop de
regel eronder (een soort piano effect. Desnoods kan een noot 2 Led's boven elkaar nemen. De
aanslaggevoeligheid kan de kleur van de Led bepalen. Bijvoorbeeld 1 Led voor een zwakke
aanslag (<=$3F) en 2 Led's. voor veel aanslag (>=$40). |
$Ac $nn $vv | Aftertouch | 4..5 | De noot $nn bepaalt welke Led zal varieren in kleur. |
$Bc $cc $vv | Control/ Mode Change | 6..7 | De Control $cc bepaalt welke Led zal varieren in kleur. |
$Cc $pp | Program Change | 8..9 | De program $pp bepaalt welke Led zal varieren in kleur. |
$Dc $vv | Channel Aftertouch | 10..11 | De waarde $vv bepaalt welke Led zal varieren in kleur. |
$Ec $ll $hh | Pitchbend | 12..13 | De Pitch $hhll bepaalt welke Led zal varieren in kleur. $hh op de bovense regel, $ll op de regel eronder. |
De System Common Commando-bytes vormen een aparte Led aansturing.
KorteNotatie | Commando | Led regels | Uitleg |
$F0 | Syst.Excl.Start | 14,0 | Laat 4 (of meer?) Led's als looplicht gaan knipperen. |
$F1 | Midi Tijd Code | 15,0 | Laat 2 Led's om beurten knipperen. |
$F2 | Lied Positie | 14,12 | * nog niet uitgedacht * |
$F3 | Kies Lied | 14,18 | * nog niet uitgedacht * |
$F4 | * niet gedefd* | 14,24 | Laat 2 Led's om beurten knipperen. |
$F5 | * niet gedefd* | 14,30 | Laat 2 Led's om beurten knipperen. |
$F6 | Tune Request | 14,36 | * nog niet uitgedacht * |
$F7 | Syst.Excl.Stop | 14,0 | Zet de $F0 looplicht stil. |
$F8 | Tijdklok | 15,7 | Laat 24 (of minder?) Led's als looplicht aan en uit gaan op het ritme van deze klok. |
$F9 | * niet gedefd* | 14,42 | Laat 2 Led's om beurten knipperen. |
$FA | Start | 15,48 | Zet deze Looplicht aan. Zet een andere Led aan. |
$FB $ss | Continue | 15,54 | Zet deze looplicht (weer) aan. Zet een tweede andere led aan. |
$FC | Stop | 15,60 | Zet deze looplicht stil. Zet die andere twee Led uit. |
$FD | * niet gedefd* | 14,48 | Laat 2 Led's om beurten knipperen. |
$FE | Actief Zijn | 14,54 | * nog niet uitgedacht * |
$FF | Reset | 14,60 | Laat 2 Led's om beurten knipperen. |
kanaal | Reset | 14,?/15,? | Elk kanaal moet zijn eigen led krijgen dat vanzelf moet uitgaan. |
Eerst uitzoeken in hoeverre Midi ontvangst de Led-Paneel aansturing in de weg gaat zitten. Eerst de Midi interface voor de Arduino bouwen.
Midi Bronnen.
- Link: Een site met een overzicht van Midi en Fabrikant codes..
- Link: Een site met Midi documentatie, specificatie en geschiedenis.
- Boek: Midi, Muziek en Computer (Theorie en praktijk) - 1989; Autheur Hans Timmermans; Uitgever: Kluwer Technische Boeken; ISBN: 90 201 2166-9.
- Boek: Het Midi Handboek - 1990; Autheur en Midi freak: John Vanderaart; Uitgever: Addison-Wesley; ISBN: 90 6789 144-4.
|
Afbeeldingen
1/8: midintro_1.jpg.
2/8: midintro_2.jpg.
3/8: midintro_3.jpg.
4/8: midintro_4.jpg.
5/8: midintro_5.jpg.
6/8: midintro_6.jpg.
7/8: midintro_7.jpg.
8/8: midintro_8.jpg.
|
|