Dr.Godfried-Willem RAES
Kursus Experimentele Muziek: Boekdeel 1: Algoritmische kompositie
Hogeschool Gent : Departement Muziek & Drama
<Terug naar inhoudstafel kursus> | Naar Noot->frekwentie lookup table | Noot: de inhoud van deze paragraaf behoort tevens tot de leerstof voor het vak akoestiek. |
INLEIDING TOT KLASSIEKE EN ALTERNATIEVE TOONSYSTEMEN
EN HUN PROGRAMMERING
Bij een eerste benadering van het MIDI-systeem valt het op dat het in de allereerste plaats opgezet lijkt voor westerse tonale muziek, geschreven in gelijkzwevende toonsystemen. In Amerikaanse vakliteratuur wordt de gelijkzwevende stemming vaak aangeduid met de afkorting EQ (Equal) of ET (Equal Temperament). De nootnummer-kodes hebben in elk geval steeds betrekking op de ermee overeenstemmende noten op het normale moderne pianoklavier. De centrale DO is daarbij steeds midi noot 60.
Omdat het voor een goed begrip van hetgeen volgt nogal belangrijk is , toch eerst even een opfrissing met betrekking tot de preciese wiskundige basis van het getemperde toonsysteem (equal temperament, in het engels):
regel 1 :
gegeven F0 o = een bepaalde toonhoogte
dan is F0o * 2 = het oktaaf daarboven
en F0o / 2 = het oktaaf eronder.
Elke oktavering van een toonhoogte komt dus heel precies overeen met een verdubbeling resp. halvering van haar trillingsgetal.
regel 2 :
elk oktaaf zal worden verdeeld in 12 precies gelijke intervallen (halve tonen, in het westers jargon) en wel op volgende wiskundige wijze :
interval = (2^(1/12)). Dit is de twaalfdemachtswortel uit 2.
Zo verkrijgen we alle toonhoogtes waaruit de kromatische toonladder is opgebouwd.
Deze verdeling van het oktaaf in twaalf gelijke delen werd het ultieme antwoord van de muziekkultuur op het equivalent van de kwadratuur van de cirkel voor de muziek: de onmogelijkheid van de kwintencirkel. Inderdaad, wanneer we kwinten opstapelen, komen we nooit opnieuw bij dezelfde toon uit. Dit volgt uit de rekenkundige evidentie dat (3/2)^12 = 129,7 en niet = 128. Voor geen enkele macht van 3/2 krijgen we ooit een macht van twee als resultaat. Anders gesteld: de kwintencirkel bestaat niet maar is veleer een kwintenspiraal, die bij elke omwenteling een nieuwe reeks intervallen genereert zonder ooit naar haar oorsprong terug te keren. Het antwoord van de gelijkzwevende stemming was (2^(1/12))^12 = 2. De cirkel sluit nu, maar alle intervalverhoudingen zijn irrationale getallen geworden.
OPMERKING:
vb. vierkantswortel 2 = 2^(1/2)
derdemachtswortel uit 10 = 10^(1/3)
Het immense voordeel van deze notatie tegenover de traditionele is dat alle bewerkingen nu in gewoon machineschrift kunnen worden weergegeven, zonder gebruik te moeten maken van ingewikkelde grafische tekens en speciale wetenschappelijke tekstverwerkers zoals 'Tex'.
Het zal de aandachtige student wel opvallen dat het getal 2 dat zich hier telkens onder de wortel bevindt, voortkomt uit het feit dat we een verdubbeling van frekwentie (*2), een oktaaf dus, in gelijke stukjes wilden verdelen. Het is perfekt mogelijk een toonsysteem te bedenken dat bvb. vrij is van oktaven , of, dat bvb. slechts om de twee oktaven terug juiste oktaven oplevert ... Denk bvb. eens aan de mogelijkheid een interval van twee oktaven te gaan verdelen in 15 gelijke intervallen! De juiste noodzakelijke toonhoogtes kan je dan berekenen alsvolgt:
Ik geef dit voorbeeld alleen om erop te wijzen dat ons getemperd toonsysteem eigenlijk slechts een van de zeer vele mogelijke getemperde systemen is. In verdere paragrafen gaan we daar dieper op in.
Een kwarttoonssysteem kan worden berekend met fo * (2^(n/24)), waarbij n gaat van 0 tot 24. De bekende Fokker-Huygens stemming, die kwa reinheid de juisteboventoonsstemming erg dicht benaderd, en op grond waarvan toch heel wat instrumenten (o.m. een nederlands orgel) zijn gebouwd, gaat uit van een verdeling van het oktaaf in 31 delen. Dat is dus:
fo * (2^(n/31)), voor n =0 tot 31
De algemene vorm van alle getemperde systemen is evenwel steeds dezelfde:
stap 1 (regel 1): bepaal het interval waarbinnen een toonreeks gelijkzwevend verdeeld dient te worden. (Noteer: het hoeven niet eens oktaven te zijn!). Stel interval= x.
stap 2 (regel 2): bepaal het aantal verdelingen waarover je binnen dat interval wil kunnen beschikken. Stel verdeling = Notes.
F0 = F0
Fn = F0 * ( Interval^(n/Notes))
De teoretici van de muzikale akoestiek en de harmonie, hebben om het getemperd systeem toch te kunnen afwegen tegenover andere mogelijke en oudere (maar daarom niet verouderde...) systemen, nog een ekstra eenheid ingevoerd, kleiner dan het kleinste interval binnen het getemperd systeem (de halve toon). Om deze frakties te bepalen hebben zij de toonsafstand van een halve toon in elk interval verdeeld in honderd gelijke getemperde stukjes, die men CENTS noemt. In Cents uitgedrukt wordt het oktaaf dus verdeeld in 1200 gelijke stukjes.
Wiskundig ziet dat er dan uit alsvolgt :
F(n) = F0 * (2^(n/1200))
dan is in dit interval 100 Cents = 466-440 = 26 Hz
Dat het aantal trillingen dat met 100 Cents overeenkomt verschilt naargelang het beschouwde interval zal wel duidelijk zijn wanneer we nu een ander interval bezien:
stel LA=1760 Hz en Sib=1864 Hz dan worden 100 cents hier = 1864 -1760= 104 Hz
Rekening houdend hiermee en met de praktische relevantie van al te kleine sowieso onhoorbare frakties, mogen we de Cents-verdeling echter gerust lineair interpolleren.
Door de introduktie van deze nieuwe eenheid werd het mogelijk een muzikaal inzicht te krijgen in bvb. de relatie van de (niet-getemperde, maar daarom nog niet noodzakelijk écht korrekte) boventoonreeks van snaren en blaasinstrumenten tot de noten van het getemperd systeem. Lees er maar onze hoofdstukken over akoestiek van muziekinstrumenten op na.
Voorbeeld:
een akoestisch perfekte reine kwint is hierdoor gekenmerkt dat de trillingsgetallen der beide toonhoogtes zich verhouden als 2 tot 3.
Een perfekte kwint op DO = 523 Hz levert dan ook op
SOL = 523*3/2 = 784.5 Hz
Een getemperde kwint op Do =523 Hz echter is :
F(7) = 523 * (2^(7/12)) = 783.6 Hz
De getemperde kwint is dus een beetje te laag in vergelijking met de 'natuurlijke', of beter gezegd 'rekenkundige' kwint. Laten we beide toonhoogten gelijktijdig horen, dan horen we zwevingen met een frekwentie van 784.5 - 783.6 = 0.9Hz, of iets minder dan 1 zweving per sekonde. Merk op dat we dit bij het stemmen van een piano bvb., waarnemen als ongeveer 2 (ritmische) zwevingen per sekonde, wat echter veroorzaakt wordt door de zwevingen van de boventonen:
wanneer die samen klinken horen we 1.8 zwevingen per sekonde.
Een berekening in Cents:
De getemperde Fa# = F(6)=523 * (2^(6/12)) = 740 Hz
Sol = 783.6 Hz
100 Cents = 43.6 Hz
1 Cent = 0.436 Hz
Juiste kwint Sol = 784.5 Hz
Verschil met getemperde sol = 783.6-784.5 = - 0.9 Hz
Verschil in Cents = 0.9/0.436 = - 2 Cents
Het zijn deze eenheden die steeds weer worden gebruikt bij onderlinge vergelijkingen van diverse toonsystemen en die men dan ook in de technische literatuur terzake kan weervinden. Niet getemperde systemen berusten zowat allemaal op juiste boventoonsreeksen. Wiskundig komt dat erop neer dat alle intervallen kwalitatief verschillend zijn, want afgeleid uit eenvoudige getalverhoudingen ten opzichte van een willekeurig gekozen grondtoon.
Welhaast klassieke, niet getemperde, toonsystemen zijn bvb.:
De juiste boventoons-grote-terstoonladder :
DO | RE | MI | FA | SOL | LA | SI | DO |
Fo | Fo * 9/8 | Fo * 5/4 | Fo * 4/3 | Fo * 3/2 | Fo * 5/3 | Fo * 15/8 | Fo * 2 |
De onderlinge getalverhoudingen der intervallen zijn daarbij dan :
DO RE MI FA SOL LA SI DO
9/8 10/9 16/15 9/8 10/9 9/8 16/15
De juiste boventoons-mineur-toonladder :
DO | RE | MI | FA | SOL | LA | SI | DO |
Fo | Fo * 9/8 | Fo * 6/5 | Fo * 4/3 | Fo * 3/2 | Fo * 8/5 | Fo * 9/5 | Fo * 2 |
DO RE MI FA SOL LA SI DO
F0 9/8*F0 6/5*F0 4/3*F0 3/2*F0 8/5*F0 9/5*F0 2*F0
intervallen:
DO RE MI FA SOL LA SI DO
9/8 16/15 10/9 9/8 16/15 9/8 10/9
Vanzelfsprekend zijn ook hier weer onnoemelijk vele alternatieve mogelijkheden voorhanden om onze oktaven te gaan verdelen. De vele muziekkulturen die onze wereld kent (of gekend heeft, want vele ervan werden door het imperialisme van onze muziekkultuur zo goed als uitgeroeid) hebben bijna evenzoveel verschillende toonsystemen voortgebracht.
Implementatie op midi gestuurde instrumenten
Om met andere toonsystemen binnen MIDI te kunnen werken is het echter nodig eerst een goed inzicht te hebben in de verhouding van die alternatieve systemen tot het klassieke westerse uitgangspunt, dat immers in het MIDI kodesysteem verankerd werd.
We hebben gezien (cfr.1070) dat de standaard midi-kodering onder andere voorziet in een kode voor 'pitch-bend': De midi-byte-sekwens is daarbij alsvolgt :
- Status-byte = 224 + Kanaal
- data-byte = 0-127 LSB
- data-byte = 0-127 MSB
De data-bytes LSB en MSB vormen daarbij een 14-bit getal waarmee de afwijking tegenover de normale toonhoogte wordt bepaald. Die 14-bits kunnen echter toegepast worden op een (meestal instelbaar) interval. Wanneer dat een halve toon omhoog of omlaag is, dan kunnen we via een simpele opzoektabel makkelijk allerlei mikrotonale intervallen en alternatieve toonsystemen aanwenden. Het kan echter ook ingesteld zijn als plus of min een hele toon, of zelfs een heel oktaaf.
Het byte vervat in MSB is van de vorm 0 mmm mmmm
Het byte vervat in LSB is van de vorm 0 l l l l l l l
Het op vele klavieren voorhanden pitch-bend wiel stuurt in de centrale positie (dus zonder pitch-bend) volgende code uit :
- MSB = 64 = 0100 0000
- LSB = 0 = 0000 0000
De betekenis hiervan ligt dan ook voor de hand : geen afwijking van de normale getemperde toonhoogte. MSB en LSB vormen evenwel samengevoegd een getal van 14 bits waarmee de toonhoogteafwijking kan worden opgegeven. 14 bits levert ons als hoogst mogelijke waarde het binaire getal 11 1111 1111 1111 op. Omgerekend naar decimaal is dit dan 16383.
Wanneer in de middenpositie van het wiel de data in LSB 0 zijn op alle 7 bitposities -zoals bleek-, dan moet de nulpositie van de kombinatie van beide bytes volgend binair getal opleveren:
100 0000 000 0000
=dec. 64 0
In decimaal omgerekend is dit dus 8192.
We moeten dus klaarblijkelijk het getal vervat in MSB vermenigvuldigen met 8192/64= 128 om de betekenis ervan te weten te komen. De waarde vervat in LSB dient daar dan doodeenvoudig bij te worden opgeteld. Wanneer we het pitch-wheel via de daartoe voorziene kode dus instellen op een bereik van plus of min een halve toon , dan kunnen we elke halve toon in 8192 verschillende stapjes verdelen, en dit zowel omhoog als omlaag. Willen we echter een (opnieuw) 'normale' noot horen dan zijn we , wanneer we deze kode verzenden, verplicht MSB gelijk te stellen aan 64 en LSB aan 0.
Dit komt er dus op neer dat we het zo kunnen beschouwen dat voor eender welk interval 100 Cents omhoog overeenkomt met 8191 op te tellen bij de nulpositie , te weten 8192, en dat 100 Cents omlaag overeenkomt met 8192 af te trekken van de nulpositie, te weten 8192.
Stel nu dat we een bepaalde noot met een korrektie uitgedrukt in Cents willen laten horen op een midi synthesizer, en stel dat de waarde van deze korrektie is opgenomen in de variabele CENTKOR , dan berekenen we de uit te sturen bytes alsvolgt :
1. berekening van de totale afwijking (MIDKOR)in midi- eenheden :
1 Cent = 8192 /100
MIDKOR = 8192 + ((8192/100) * CENTKOR)
let erop dat CENTKOR zowel positief als negatief mag zijn.
2. berekening van het uit te sturen MSB :
MSB = MIDKOR \ 128
Let op : we gebruiken hier de INTEGER deling \, want we willen precies weten hoeveel gehele malen het getal 128 - dit is immers de hoogste waarde (+1) die LSB zou kunnen hebben - in de midikorrektiewaarde gaat.
3. berekening van het uit te sturen LSB :
LSB = MIDKOR MOD 128
Let op : hier berekenen we de rest van de deling door 128. Dit hadden we ook anders kunnen doen , alsvolgt :
LSB = MIDKOR - (MSB * 128)
Dit kan nu eenvoudig in een procedure worden gegoten, waarbij we de hele last van het rekenwerk uiteraard aan de komputer overlaten.
Stel dat we in een deel van een programma een Array definieerden met noten NT(300) bvb.
stel dat we elk van die noten een bepaalde Cents-afwijking willen geven en dat we deze Cents-waarden opnamen in een Array onder de naam CK(300).Dus :
'inlezen arrays
FOR I=0 TO 300
READ NT(I)
NEXT I
FOR I=0 TO 300
READ CK(I)
NEXT I
... ...
' 301 noot-data
DATA 12,23,67,56,45,34,56,45,68,65,13,24,67,56,56
DATA 45,45,54,79,90,121,23,34,45,57,26,45,15,23,67
...
' 301 cents-korrektie-data
DATA -10,0,2,45,-7,-80,43,40,12,12,0,0,0,1,56
DATA -4,-6,-8,-80,-44,77,67,23,23,0,0,0,24,45,87
...
Volgende subroutine zal dan alle noten met de afwijkingen een na een spelen:
FOR I=0 TO 300
Play K, NT(I),64 ' midi sekwens 144+K, NT(I), 64
Bend K, ((8192+((8192/100)*CK(I))) MOD 128), ((8192+((8192/100)*CK(I)))\128) ' midi sekwens 224+K, lsb, msb
GOSUB RITME
NEXT I
Merk op dat de cent-korrektie bytes in de volgorde LSB-MSB worden uitgestuurd!
De GOSUB RITME instruktie -kan ook Call Ritme zijn- is uiteraard een verwijzing naar een procedure die instaat voor de metriek van de muziek. De Play en Bend instrukties zoals gebruikt hier behoren tot de midi-biblioteek van onze GMT programmeertaal voor kompositie. Al deze funkties zijn opgenomen in de dll: g_mus.dll
Opgemerkt moet worden dat de beschreven routine -vanuit komputertechnisch oogpunt- bijzonder ongelukkig is geschreven. Immers, de processor dient telkens opnieuw dezelfde berekening uit te voeren. Een voor verwerkingssnelheid geoptimaliseerd programma zal dan ook deze berekening eenmalig uitvoeren en de rezultaten ervan onderbrengen in een tabel (een 'look-up table') die in de verdere loop van het programma kan worden geraadpleegd.
vb.: Look-up table voor Cent naar Midi Pitch-wheel omzetting:
DIM PW(1,100) : ' PW(0,n) = MSB
' PW(1,n) = LSB
' berekening en invulling van de tabel:
FOR Cent=0 TO 99
code= (8129 + ((8129/100) * Cent))
PW(0, Cent) = code \ 128 : ' msb
PW(1, Cent) = code MOD 128 :' lsb
NEXT Cent
De bovenstaande routine, herschreven gebruik makend van deze look-up tabel ziet er dan uit als:
FOR I=0 TO 300
Play K, (NT(I)), 64
Bend K, PW(1, CK(I)), PW(0, CK(I))
Wacht (tijd)
NEXT I
Merk op dat we hier slechts positieve waarden voor de cent-afwijking hebben geimplementeerd. Tracht zelf een routine te schrijven waarbij ook negatieve waarden voor de Cent variabele, gebruik makend van een look-up tabel kunnen worden gebruikt.
[Filedate: 900508] / Updated: 2007-03-26
Terug naar de inhoudtafel: <Kursus Index>
Homepage Dr.Godfried-Willem RAES
Basic-funkties voor midi-getallen en frekwenties:
Ook in andere konteksten dan in die van de 'alternatieve' toonsystemen is het handig bewerkingen, berekeningen en algoritmen te kunnen uitvoeren waarbij uitgegaan wordt van de frekwentie van een noot. Zo bijvoorbeeld voor het ontwerpen van software voor spektrale harmonie, gesteund dus op boventoonreeksen in het algemeen. Om jullie wat rekenwerk te besparen geef ik hierbij een Basic voorbeeldprogramma, waarin de daarvoor nodige funkties vervat liggen:
- PRINT "Noot="; byte%; " Freq="; NoteFreq!(byte%)
- PRINT "Freq="; freq!; "Noot="; FreqNote%(freq!)
Hier komen de eigenlijke funkties:
- FreqNote% = 12 * (LOG(f!) - LOG(Gronddo!)) / (LOG(2))
- NoteFreq! = Gronddo! * (2! ^ (byte% / 12!))
Deze funkties zijn sedert 1997 opgenomen in onze GMT programmeertaal voor Wintel PC's onder de namen N2F en F2N. (g_indep.dll) De funktiebibliotheek, ontworpen voor voor de PowerBasic compiler kan echter eveneens autonoom worden gebruikt in programmeertalen zoals Visual Basic, C en C++. De deklaraties zijn opgenomen in de file g_indep.bi
Een opzoektabel voor noten naar frekwentie kan met deze funkties snel worden gegenereerd. Voor wie het graag snel binnen handbereik wil hebben, maakten we een opzoektabel uitgaande van La= 440Hz. (cfr. link onderaan of bovenaan deze pagina).
Filedate: 900610 /2007-03-26
Terug naar inhoudstafel kursus: <Index Kursus> | Naar homepage dr.Godfried-Willem RAES | Naar opzoektabel noot-> frekwentie |