Arduino Projekten

Thu 18-Apr-24
23:20:49


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 connectorgecombineerd in 1 connector
Stroom/ Spanning 10..20mA (voor 1 Led) +/-12V
Snelheid 31250bit/sec 50 .. 115000bit/sec
Galvanische scheidingOpto-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).

7654 3210
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:

KorteNotatieByteCommando DatabytesUitleg
$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:

KorteNotatieByteCommando DatabytesUitleg
$F0 ?? ?? ?? $F0System Commando's variabel System Exclusive Start
$F1 $dd $F1System Commando's 1 Midi Tijd Code met waarde $dd
$F2 $ll $hh $F2System Commando's 2 Kies de lied-positie $hhll ($hh=msb & $vv=lsb)
$F3 $ss $F3System Commando's 1 Kies een lied $ss
$F4 $F4System Commando's 0 * niet gedefinieerd *
$F5 $F5System Commando's 0 * niet gedefinieerd *
$F6 $F6System Commando's 0 Tune aanvraag (Tune request)
$F7 $F7System Commando's 0 System Exclusive Einde
$F8 $F8System Commando's 0 Tijdklok (24 stuks in 1 kwart maat)
$F9 $F9System Commando's 0 * niet gedefinieerd *
$FA $FASystem Commando's 0 Start
$FB $ss $FBSystem Commando's 1 Continue
$FC $FCSystem Commando's 0 Stop
$FD $FDSystem Commando's 0 * niet gedefinieerd *
$FE $FESystem Commando's 0 Actief zijn Aanvraag
$FF $FFSystem 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.

KorteNotatieCommando Led regelsUitleg
$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.

KorteNotatieCommando Led regelsUitleg
$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.

  1. Link: Een site met een overzicht van Midi en Fabrikant codes..
  2. Link: Een site met Midi documentatie, specificatie en geschiedenis.
  3. Boek: Midi, Muziek en Computer (Theorie en praktijk) - 1989; Autheur Hans Timmermans; Uitgever: Kluwer Technische Boeken; ISBN: 90 201 2166-9.
  4. Boek: Het Midi Handboek - 1990; Autheur en Midi freak: John Vanderaart; Uitgever: Addison-Wesley; ISBN: 90 6789 144-4.

Afbeeldingen

midintro_1.jpg
1/8: midintro_1.jpg.
midintro_2.jpg
2/8: midintro_2.jpg.
midintro_3.jpg
3/8: midintro_3.jpg.
midintro_4.jpg
4/8: midintro_4.jpg.
midintro_5.jpg
5/8: midintro_5.jpg.
midintro_6.jpg
6/8: midintro_6.jpg.
midintro_7.jpg
7/8: midintro_7.jpg.
midintro_8.jpg
8/8: midintro_8.jpg.