Inkijkexemplaar 'De verbeelders. Nederlandse boekillustratie in de twintigste eeuw'
Backtrackalgoritmen voor regelgebaseerde vierstemmige...
Transcript of Backtrackalgoritmen voor regelgebaseerde vierstemmige...
![Page 1: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/1.jpg)
Faculteit Ingenieurswetenschappen
Vakgroep Toegepaste Wiskunde en Informatica
Voorzitter: Prof. Guido Vanden Berghe
Backtrackalgoritmen voor regelgebaseerde
vierstemmige harmonisatie
door
Stéphanie Vanhove
Promotor: Prof. Kris Coolsaet
Scriptie ingediend tot het behalen van de academische graad van
Licentiaat in de Informatica
optie Toepassingsgerichte Informatica
Academiejaar 2006 � 2007
![Page 2: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/2.jpg)
Overzicht
Backtrackalgoritmen voor regelgebaseerde vierstemmige harmonisatie
Stéphanie Vanhove
Promotor: Prof. Kris Coolsaet
Academiejaar 2006-2007
Scriptie ingediend tot het behalen van de academische graad van Licentiaat in de
Informatica, optie Toepassingsgerichte Informatica
Universiteit Gent
Faculteit Ingenieurswetenschappen
Vakgroep Toegepaste Wiskunde en Informatica
Voorzitter: Prof. Guido Vanden Berghe
Trefwoorden
Algoritmische compositie, Backtracking, Harmonie, Muziek, Ramo
Samenvatting
Het programma Ramo is een interactieve harmonietrainer waarin partituren kunnen
ingevoerd worden en gecontroleerd worden op de correctheid volgens de harmonie-
regels. In deze thesis wordt Ramo uitgebreid met een actieve component die zelf mu-
ziek kan genereren die aan de harmonieregels voldoet. Hiervoor worden verschillende
backtracking-algoritmen ontworpen en met elkaar vergeleken.
i
![Page 3: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/3.jpg)
ii
Toelating tot bruikleen
De auteur geeft de toelating om deze scriptie voor consultatie beschikbaar te stellen
en delen van de scriptie te kopiëren voor persoonlijk gebruik. Elk ander gebruik valt
onder de beperkingen van het auteursrecht, in het bijzonder met betrekking tot de
verplichting de bron uitdrukkelijk te vermelden bij het aanhalen van resultaten uit
deze scriptie.
Stéphanie Vanhove
30 mei 2007
![Page 4: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/4.jpg)
Voorwoord
Om deze thesis tot een goed einde te brengen, kon ik rekenen op de steun van een
aantal mensen die bereid waren tot meer dan normale inspanningen. Ik wil dan ook
graag de volgende mensen bedanken:
Mijn promotor Prof. Kris Coolsaet, voor het onderwerp, de vrijheid die ik kreeg, de
snelle reacties via e-mail en de regelmatige bijeenkomsten waarna ik telkens weer nieuwe
ideeën had om verder te doen.
Hans Scholliers, voor het muzikaal advies en voor het leveren van zeer bruikbare lite-
ratuur over harmonie.
Johan Schrooyen, voor de hulp bij het zoeken naar artikels en voor het opsporen van
taalfouten tot in de meest onmogelijke detailniveaus in mijn tekst.
Arne Brasseur en Wouter Rogiers, voor de toelichting bij hun werk. Arne wil ik ook
bedanken voor het nalezen van de tekst en de kritische opmerkingen.
Luc Vanhove, mijn vader, voor het meedenken en het voortdurend nalezen van nieuwe
stukken tekst, wat met twee thesissen tegelijk in huis een groot deel van zijn tijd innam.
Frédéric Vanhove, mijn broer, voor de LATEX tips en voor de onmisbare wiskundige
hulp doorheen de jaren.
Mijn medestudenten en vrienden, voor allerlei tips en voor de vlotte samenwerking
en leuke momenten tijdens de voorbije 4 jaar. In het bijzonder Joram Barrez, Joke
Verhegghe, Filip Blondeel, Helmut Provost, Benny Botte, Jan Hanselaer en Taheen
Vandeghinste.
iii
![Page 5: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/5.jpg)
Inhoudsopgave
Voorwoord iii
1 Inleiding 1
1.1 Doelstellingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Overzicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Opmerking i.v.m. muziektheorie . . . . . . . . . . . . . . . . . . . . . . 2
2 Inleiding tot de harmonie 3
2.1 Situering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Harmonieleer en harmonieregels . . . . . . . . . . . . . . . . . . . . . . 4
2.3 Tonale muziek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4 Algemene begrippen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.5 Harmonieregels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.6 Harmonieopgaven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3 Het programma Ramo 22
3.1 Bedoeling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2 Het oorspronkelijke Ramo programma . . . . . . . . . . . . . . . . . . 22
3.3 Het nieuwe regelsysteem . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.4 Afweging tussen beide regelsystemen . . . . . . . . . . . . . . . . . . . 28
4 Methoden voor algoritmische compositie 29
4.1 Algoritmische compositie . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.2 Constraint satisfaction problem met backtracking . . . . . . . . . . . . 31
4.3 Genetische algoritmen . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
iv
![Page 6: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/6.jpg)
INHOUDSOPGAVE v
4.4 Backtracking vs. genetische algoritmen . . . . . . . . . . . . . . . . . . 46
4.5 Andere methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.6 Onze strategie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5 Controleregels 50
5.1 Vereisten voor het regelsysteem . . . . . . . . . . . . . . . . . . . . . . 50
5.2 Bruikbaarheid van de verschillende soorten regels . . . . . . . . . . . . 52
5.3 Alle regels checken? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6 Productieregels 57
6.1 Situering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.2 Productieregels voor volledige kwintakkoorden en septiemakkoorden . . 58
6.3 Productieregel voor onvolledige septiemakkoorden . . . . . . . . . . . . 70
6.4 Productieregels voor noten . . . . . . . . . . . . . . . . . . . . . . . . . 70
6.5 Productieregels in verband met de tonica . . . . . . . . . . . . . . . . . 72
7 Heuristische regels 73
7.1 Bedoeling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.2 Werking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.3 Soorten heuristische regels . . . . . . . . . . . . . . . . . . . . . . . . . 74
7.4 Opmerking over de subjectiviteit . . . . . . . . . . . . . . . . . . . . . 76
8 Backtracking-algoritmen 77
8.1 Inleiding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
8.2 Willekeurig algoritme . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
8.3 Algoritme met vooruitkijken voor beschrijvingen . . . . . . . . . . . . . 93
8.4 Algoritme met vooruitkijken voor beschrijvingen en noten . . . . . . . . 103
8.5 Complexiteit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
9 Eindbeschouwingen 119
9.1 Conclusie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
9.2 Mogelijkheden voor verdere ontwikkeling . . . . . . . . . . . . . . . . . 120
Index 122
Bibliogra�e 124
![Page 7: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/7.jpg)
Hoofdstuk 1
Inleiding
1.1 Doelstellingen
Muziek, en in het bijzonder de tonale muziek, onderscheidt zich van de andere kunst-
vormen door de formalisering ervan. Het is deze formalisering die het mogelijk maakt
automatisch muziek te genereren, bvb. met behulp van een computer. Geen enkele
andere kunstvorm is zo sterk geformaliseerd als de muziek. We kunnen ons immers wel
voorstellen dat een computer muziek zou genereren, maar om een computer vanuit het
niets een schilderij te laten genereren ontbreekt het ons toch aan houvast.
In de harmonieleer uit deze formalisering zich vooral in de vorm van regels. Deze regels
bepalen wat toegelaten is of niet in de harmonie, en zijn het voorwerp van heel wat
cursussen en handboeken. In voorgaande thesissen werd reeds een applicatie ontwikkeld
die kan controleren of een ingevoerde partituur aan de harmonieregels voldoet. Deze
applicatie kreeg de naam Ramo.
In dit werk is het de bedoeling Ramo uit te breiden met automatische harmonisatie
en daarvoor de nodige algoritmen te ontwerpen. Om dit mogelijk te maken, wordt het
systeem ook uitgebreid met productieregels en heuristische regels. De algoritmen zijn
regelgebaseerd omdat er in het systeem een verzameling is van regels die bepalen of een
oplossing geldig is of niet. Deze regelset kan probleemloos gewijzigd worden, zonder
dat de algoritmen daarom moeten veranderen.
Bij het begrip �automatische harmonisatie� denken mensen vaak aan synthesizers die
automatisch een bijpassend akkoord laten horen wanneer men een noot indrukt. Deze
synthesizers gebruiken echter een eenvoudiger algoritme. Door de real-time vereisten
kunnen synthesizers bij de keuze van een akkoord weinig rekening houden met de
context, en al zeker niet met wat er nog zal volgen. Wanneer de volgende noot gekend
is, moet het vorige akkoord al lang beslist zijn. Backtracking over een volledige opgave
is voor dergelijke synthesizers dan ook geen optie.
1
![Page 8: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/8.jpg)
HOOFDSTUK 1. INLEIDING 2
De algoritmen die we in dit werk zullen ontwerpen, houden wel rekening met de context.
Ieder akkoord hangt af van zijn voorgangers en opvolgers, en de akkoorden moeten
correct verbonden worden volgens de verbindingsregels. In deze algoritmen zullen we
dan ook uitvoerig gebruik maken van backtracking.
1.2 Overzicht
In het volgende hoofdstuk geven we een inleiding tot de harmonie, waarin de belang-
rijkste begrippen uiteengezet worden die voor de rest van deze tekst van belang zijn. In
Hoofdstuk 3 bespreken we de geschiedenis en de mogelijkheden van Ramo. Vervolgens
geven we in Hoofdstuk 4 een overzicht van de methoden voor algoritmische compositie
die in de literatuur beschreven zijn. We zetten er ook de principes van backtracking
en genetische algoritmen uiteen, en maken een vergelijking tussen beide. De controle-
regels, productieregels en heuristische regels die we nodig hebben ter ondersteuning van
de algoritmen worden respectievelijk besproken in Hoofdstuk 5, 6 en 7. In Hoofdstuk 8
worden de verschillende ontworpen backtracking-algoritmen uiteengezet. We doen ook
een aantal testen en vergelijken de resultaten met elkaar. Ten slotte geven we nog een
aantal eindbeschouwingen in Hoofdstuk 9.
Bij dit werk hoort ook een CD met het programma Ramo, de broncode, documentatie,
een aantal testbestanden en een digitale versie van deze tekst. Meer informatie over
het uitvoeren van het programma e.d. is te vinden in het bestand �Overzicht.txt� in de
rootmap op de CD.
1.3 Opmerking i.v.m. muziektheorie
In deze tekst worden heel wat begrippen uit de notenleer en harmonieleer gebruikt.
Het is niet realistisch hier de hele notenleer en harmonieleer te willen uiteenzetten, dus
enige muzikale voorkennis is wel noodzakelijk. Goede inleidingen tot de notenleer zijn
bvb. te vinden in [12, 16] en ook in de thesis van Arne Brasseur [4] pp. 6-20.
Aangezien veel mensen wel notenleer kennen maar geen harmonie, willen we deze tekst
ook toegankelijk maken voor de lezer met een basiskennis notenleer. Daarom geven
we in Hoofdstuk 2 een inleiding tot de harmonie. Men verwacht misschien niet meteen
20 pagina 's muziektheorie aan te tre�en in een informaticathesis, maar we zijn van
mening dat dit noodzakelijk is als basis voor het vervolg van de tekst. Lezers die over de
nodige harmoniekennis beschikken, kunnen dit hoofdstuk gerust overslaan. Overigens
is er op het einde van deze tekst een index, waarin onder andere de muziektermen
kunnen opgezocht worden.
![Page 9: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/9.jpg)
Hoofdstuk 2
Inleiding tot de harmonie
2.1 Situering
Wanneer musici een muziekstuk analyseren, doen zij dit vaak aan de hand van verschil-
lende elementen, die samen de totale klank van de muziek bepalen. Deze elementen
zijn:
• Melodie: de opeenvolging van (gelijke of verschillende) toonhoogtes, in een be-
paald ritme
• Metrum: de opeenvolging van zware en lichte tellen in de muziek
• Ritme: de opeenvolging van langere en kortere tonen en rusten
• Dynamiek: de verhouding in klanksterkte in de muziek
• Tempo: de snelheid waaraan de muziek wordt uitgevoerd
• Timbre: de typische klankkleur van de instrumenten en/of stemmen die de muziek
uitvoeren
• Vorm: de manier waarop een muziekstuk is opgebouwd
• Harmonie: het gelijktijdig samengaan van tonen met verschillende toonhoogtes
In een cursus notenleer maken leerlingen hoofdzakelijk kennis met melodie, metrum,
ritme, dynamiek, tempo, timbre en vorm. Omdat de harmonie enerzijds een zeer
belangrijk element is in de muziek, en anderzijds door velen als één van de moeilijkere
domeinen in de muziektheorie wordt beschouwd, wordt een cursus notenleer meestal
gevolgd door een afzonderlijke cursus harmonie. We geven hier een korte inleiding tot
de harmonie.
3
![Page 10: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/10.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 4
2.2 Harmonieleer en harmonieregels
Wanneer we op een piano drie willekeurige toetsen gelijktijdig indrukken, is de kans
groot dat dit niet als een mooi geheel zal klinken. Hoewel elk van deze tonen op
zich heel normaal klinkt, creëren ze samen een gevoel van spanning. Men spreekt dan
van een dissonante samenklank. Daar tegenover staan de tonen die wél als een goed
samenpassend geheel klinken. Deze geven een gevoel van rust en noemen we consonant .
Door de spanning die ze veroorzaken, vragen dissonanten erom dat ze gevolgd worden
door de rust van een consonante samenklank. Men zegt dan dat de dissonant oplost
naar de consonant.
Doorheen de muziekgeschiedenis waren de opvattingen over consonantie en dissonantie
niet altijd dezelfde. Bij het begin van het ontstaan van de meerstemmigheid in de
vroege middeleeuwen werden enkel de reine kwart, de reine kwint en het rein octaaf als
consonant beschouwd. Zelfs grote en kleine tertsen en sexten beschouwde men toen als
dissonant. De dissonant werd echter meer en meer geëmancipeerd door de eeuwen heen.
Tijdens de renaissance (ca. 1400-1600) werden ook de tertsen en sexten, zowel grote als
kleine, als consonant aanvaard. Andere dissonanten kwamen ook voor, maar vooral als
toevallige versieringen. Vanaf de barok (ca. 1600-1750) werd de dissonant als zelfstandig
akkoord aanvaard, hoewel de harmonisatie nog vooral op drieklanken gebaseerd was.
Tijdens de romantiek (ca. 1815-1920) en de twintigste eeuw werd uitvoerig gebruik
gemaakt van vierklanken en andere dissonanten die vaak pas laat of zelfs helemaal niet
oplossen.
De spanningen en ontladingen die ontstaan door de manier waarop tonen worden sa-
mengevoegd, worden bestudeerd in de harmonieleer. Heel wat componisten hebben
hun inzichten omtrent de harmonie neergeschreven in een traktaat. Het bekendste en
meest invloedrijke traktaat is ongetwijfeld dat van de Franse componist Jean-Philippe
Rameau, getiteld �Traité de l'harmonie, réduite à ses principes naturels�. Hierin be-
schrijft hij het idee dat ieder akkoord een functie heeft ten opzichte van de andere
akkoorden, en dat spanningen en rust kunnen verklaard worden aan de hand van deze
functies. Het programma Ramo is dan ook genoemd naar deze componist.
Figuur 2.1: �Traité de l'harmonie� van Jean-Philippe Rameau
![Page 11: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/11.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 5
Veel van de traktaten over harmonie speci�ceren een verzameling harmonieregels die
bepalen welke noten mogen samenklinken, en op welke manier deze samenklanken met
elkaar mogen verbonden worden. In een cursus harmonie worden dan ook heel wat
regels aangeleerd die bepalen wat er wel en niet mag. In sectie 2.5 geven we een aantal
voorbeelden van dergelijke regels.
Hierbij moeten we wel een belangrijke kanttekening maken. Aangezien er bijna even-
veel traktaten bestaan als componisten, bestaat er geen unieke verzameling regels die
men als �wet� moet aanvaarden. De harmonieregels zijn ook niet opgesteld als recept
voor hoe men in de toekomst moet componeren, maar veeleer als een beschrijving van
hoe de componisten in het verleden te werk gingen. We kunnen dus zeggen dat de
harmonieregels de muziek volgen, en niet omgekeerd, en dat de harmonieregels slechts
�in principe� gelden.
Wel hebben de harmonieregels een belangrijke pedagogische waarde. Doordat in oe-
feningen voor beginners bepaalde harmonieregels moeten nageleefd worden, wordt de
leerling gestimuleerd tot horizontale en verticale controle van zijn werk, en kan de leer-
ling zijn harmonisch gevoel ontwikkelen naar het voorbeeld van de grote componisten
uit de geschiedenis. Pas in een meer gevorderd stadium kan de leerling op oordeelkun-
dige wijze afwijken van de vooropgestelde harmonieregels.
Toch zijn er een aantal regels die algemeen aanvaard worden en waarop overtredingen
zeer uitzonderlijk zijn, zoals bvb. de regel van de parallelle kwinten en octaven (zie
2.5.3).
Een andere belangrijke opmerking is dat de harmonieregels slechts de �syntax� van de
muziek zijn. Een muziekstuk dat aan alle regels voldoet, is nog niet noodzakelijk mooi.
Bij een gegeven baslijn moet men een vloeiende melodie kunnen schrijven, en bij een
gegeven melodie moet men de juiste harmonische onderbouw kunnen vinden. Dit vergt
enige aanleg en veel oefening, en is duidelijk meer dan het louter toepassen van een
aantal regels.
2.3 Tonale muziek
In de harmonieleer wordt vooral tonale muziek bestudeerd. Tonale muziek is gebaseerd
op grote en kleine tertstoonladders (zie 2.4.2) en draait rond één centrale toon, die we
de tonica noemen. Melodieën beginnen en eindigen vaak op de tonica. De andere tonen
staan in een vaste relatie tot de tonica. De dominant (toon die een kwint boven de
tonica ligt) en de subdominant (toon die een kwint onder de tonica ligt) spelen ook een
belangrijke rol. De andere tonen uit de toonladder zijn minder belangrijk, en helemaal
ondergeschikt zijn de toonladdervreemde noten.
![Page 12: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/12.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 6
In de muziekgeschiedenis duurde de tonale periode van ca. 1680 tot ca. 1880. In deze
periode vinden we componisten als Antonio Vivaldi, Johann Sebastian Bach, Georg
Friedrich Händel, Wolfgang Amadeus Mozart, Ludwig van Beethoven en vele anderen.
Tegenhangers van de tonale muziek zijn de modale muziek en de atonaliteit.
In de modale muziek worden geen grote en kleine tertstoonladders gebruikt, maar wel
een andere soort toonladders die we modi noemen. Deze modi zijn in feite rotaties
van de grote en kleine tertstoonladder, waardoor de hele en halve tonen op andere
plaatsen terechtkomen. Voorbeelden zijn de dorische, lydische en frygische modus. Het
modale toonsysteem werd tijdens de middeleeuwen veelvuldig gebruikt in Gregoriaanse
gezangen, en ging dus in de muziekgeschiedenis het tonaal systeem vooraf. Omdat ze
zo vaak in religieuze muziek voorkomen, worden de modi ook kerktoonladders genoemd.
Aan het einde van de tonale periode, in de tweede helft van de negentiende eeuw,
begon men meer en meer gebruik te maken van toonladdervreemde noten. Als gevolg
hiervan begon de tonaliteit te vervagen en ontstond de atonaliteit . In het atonaal
toonsysteem zijn alle tonen gelijkwaardig en is er geen centrale toon meer. Dissonanten
zijn hier schering en inslag. De componist Arnold Schoenberg (1874-1951) speelde een
belangrijke rol in de ontwikkeling van de atonaliteit.
Het programma Ramo richt zich tot nu toe op tonale muziek, omdat in harmoniecur-
sussen voornamelijk de tonale harmonie onderwezen wordt.
2.4 Algemene begrippen
In de volgende paragrafen beschrijven we een aantal belangrijke concepten uit de har-
monie. We beperken ons hier tot de concepten die relevant zijn voor het vervolg van
dit werk.
2.4.1 Stemmen en stembereik
Harmonisaties worden steeds uitgewerkt alsof ze voor een vierstemmig koor bedoeld
zijn. Er zijn dus altijd 4 stemmen, die van hoog naar laag sopraan, alt, tenor en bas
genoemd worden. De sopraan en alt zijn vrouwenstemmen, en worden in solsleutel
genoteerd op de bovenste notenbalk. Tenor en bas zijn mannenstemmen en worden in
fasleutel genoteerd op de onderste notenbalk. Om de sopraanstem en de altstem van
elkaar te kunnen onderscheiden, worden de stokken van de noten in de sopraanstem
altijd naar boven genoteerd, en die in de altstem altijd naar beneden. Op analoge
wijze worden bij de tenorstem de stokken naar boven geschreven en bij de basstem
naar beneden. Met de termen sopraan, alt, tenor en bas doelen we zowel op de zanger,
als op de melodielijn die hij/zij zingt. De bas is een belangrijke stem omdat deze de
![Page 13: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/13.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 7
laagste stem is en dus het fundament vormt van de harmonie. Ook de sopraan verdient
de nodige aandacht omdat dit de stem is die voor de luisteraar het meest in het oor
springt. Een melodieuze sopraanstem is dus wenselijk.
Aangezien een harmonisatie uitvoerbaar moet zijn door een koor, moet bij het harmo-
niseren rekening gehouden worden met de vocale mogelijkheden van de zangers. De
ene stemsoort kan hogere of lagere toonhoogten aan dan de andere. We zeggen dat
iedere stemsoort zijn eigen stembereik heeft. In de literatuur is men het niet altijd eens
over de precieze grenzen, maar Figuur 2.2 toont een typisch stembereik voor sopraan,
alt, tenor en bas. Men kan natuurlijk ook een harmonisatie schrijven die enkel voor
instrumenten bedoeld is. In dat geval kan men deze grenzen licht overschrijden.
Figuur 2.2: Stembereik voor sopraan, alt, tenor en bas.
2.4.2 Toonladders en toontrappen
Een toonladder wordt gekenmerkt door de plaatsen waar de hele en halve tonen zich
bevinden. Elke toonladder bestaat uit zeven graden of toontrappen die genummerd
worden met Romeinse cijfers. De toontrap die volgt op toontrap VII wordt soms als
VIII genoteerd, maar we zullen deze hier telkens als toontrap I noteren. Bij een grote
tertstoonladder ligt er een halve toon tussen III en IV en tussen VII en I, en een hele
toon tussen de andere toontrappen. In Figuur 2.3 zien we de grote tertstoonladder
van do, of kortweg �do groot�. De halve tonen zijn aangeduid als een groot �V� teken
tussen de 2 toontrappen.
Figuur 2.3: Grote tertstoonladder: voorbeeld op do.
Voor kleine tertstoonladders bestaan er drie varianten. In Figuur 2.4 zien we de drie
varianten van de kleine tertstoonladder van la, of kortweg �la klein�.
![Page 14: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/14.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 8
Figuur 2.4: De drie varianten van de kleine tertstoonladder: voorbeeld op la.
• Oude wijze = antieke wijze = eolische wijze: de halve tonen liggen tussen II en
III en tussen V en VI. Tussen de overige graden ligt telkens een hele toon.
• Harmonische wijze: Deze wijze is dezelfde als de oude wijze, maar graad VII
wordt met een halve toon verhoogd. Deze verhoging (meestal een kruis of her-
stellingsteken) wordt niet aan de voortekening genoteerd, maar wel als toevallig
wijzigingsteken in de loop van het stuk. Als gevolg van deze verhoging, is er een
extra halve toon tussen VII en I. Tussen VI en VII ligt nu een vermeerderde se-
cunde (= een secunde bestaande uit drie halve tonen in plaats van de gewoonlijke
één of twee halve tonen).
• Melodische wijze: Ook deze wijze is dezelfde als de oude wijze, maar hier worden
graad VI en graad VII beide met een halve toon verhoogd. Deze wijze wordt
enkel stijgend gebruikt, en niet dalend. Ook deze verhogingen worden als toevallig
wijzigingsteken genoteerd, en niet aan de voortekening. Door de verhoging van de
zevende graad, ligt er ook bij deze wijze een halve toon tussen VII en I. Doordat
ook de zesde graad verhoogd is, ligt er geen vermeerderde secunde meer tussen
VI en VII, en is de halve toon tussen V en VI een hele toon geworden.
De toontrappen hebben ook elk een eigen naam. Tabel 2.1 geeft de benaming voor elk
van de toontrappen.
![Page 15: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/15.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 9
Toontrap Benaming
I TonicaII BoventonicaIII MediantIV SubdominantV DominantVI BovendominantVII Leidtoon of ondertonica
Tabel 2.1: Benaming van de 7 toontrappen
Merk op dat er voor de zevende toontrap twee benamingen zijn. De benaming leidtoon
gebruiken we wanneer er een halve toon is tussen toontrap VII en toontrap I. Dit is
het geval bij een grote tertstoonladder, en bij de harmonische en melodische wijze van
de kleine tertstoonladder. De leidtoon vraagt er als het ware om gevolgd te worden
door de tonica, de leidtoon �leidt� dus naar de tonica. Bij de oude wijze van de kleine
tertstoonladder, is er echter een hele toon tussen de zevende en de eerste toontrap.
In dit geval �leidt� de zevende toontrap niet naar de tonica, en spreken we van een
ondertonica.
In de harmonie gebruikt men voor kleine tertstoonladders steeds de harmonische wijze.
Bij harmonisaties in een kleine tertstoonladder moet men er dus over waken dat de
zevende graad steeds met een halve toon verhoogd is.
2.4.3 Akkoorden
Een akkoord is een samenklank die ontstaat door 2 of meer tertsen op elkaar te stapelen.
De noot waarop het akkoord gebouwd wordt, noemen we de grondnoot . Naargelang het
aantal noten waaruit ze bestaan, kunnen we volgende soorten akkoorden onderscheiden:
• Drieklanken of kwintakkoorden zijn een opeenstapeling van twee tertsen. Ze
bestaan uit de grondnoot met daarop de terts en de kwint, bvb. do - mi - sol.
• Vierklanken of septiemakkoorden zijn een opeenstapeling van drie tertsen. Ze
bestaan uit de grondnoot met daarop de terts, de kwint en de septime, bvb. do
- mi - sol - si.
• Vijfklanken of none-akkoorden zijn een opeenstapeling van vier tertsen. Ze be-
staan uit de grondnoot met daarop de terts, de kwint, de septime en de none,
bvb. do - mi - sol - si - re.
![Page 16: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/16.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 10
Figuur 2.5: Kwintakkoord, septiemakkoord en none-akkoord met do als grondnoot.
Bij de opbouw van akkoorden moet men steeds binnen de toonaard blijven, dus het
kwintakkoord op re is in do groot re - fa - la, maar in re groot re - fa # - la.
Aangezien none-akkoorden een vrij gevorderd concept zijn, beperkt Ramo zich tot
kwintakkoorden en septiemakkoorden.
In tonale muziek geldt ook voor de akkoorden dat sommige een belangrijkere functie
hebben dan andere. Net zoals de tonicanoot, heeft ook de tonicadrieklank (de drie-
klank met de tonica als grondnoot) een centrale functie. De subdominantdrieklank en
de dominantdrieklank (resp. de drieklanken met toontrappen IV en V als grondnoot)
hebben ook een belangrijke rol, terwijl de overige drieklanken van minder groot be-
lang zijn. Daarom noemt men de akkoorden op I, IV en V de hoofdakkoorden en de
drieklanken op II, III, VI en VII de nevenakkoorden.
Aan de hand van een Romeins cijfer kunnen we de toontrap van de grondnoot noteren
onder het akkoord. In Figuur 2.6 zien we de hoofdakkoorden en nevenakkoorden in do
groot en la klein. Bemerk ook de verhoging van de zevende graad bij de akkoorden in
la klein.
Figuur 2.6: Hoofdakkoorden en nevenakkoorden in do groot (boven) en la klein (onder)
2.4.4 Realisaties van akkoorden
We hebben eerder al gezien dat de harmonie vierstemmig geschreven wordt. We moeten
dus aan elke stem een akkoordnoot toekennen in een bepaald octaaf. Hiervoor zijn er
verschillende mogelijkheden. Een toekenning van de akkoordnoten aan de 4 stemmen
![Page 17: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/17.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 11
noemen we een realisatie van het akkoord. Figuur 2.7 geeft (niet-uitputtend) enkele
mogelijke realisaties van het tonica-akkoord in do groot. Merk op dat het hier steeds
om hetzelfde akkoord gaat.
Figuur 2.7: Enkele mogelijke realisaties van het tonica-akkoord in do groot.
In het geval van een drieklank zijn er maar 3 noten, maar we moeten aan 4 stemmen
een noot toekennen. Eén van de akkoordnoten zal dus 2x voorkomen. We spreken dan
van een verdubbeling van de grondnoot, de terts of de kwint van het akkoord.
Wanneer de noten in de drie bovenstemmen zo dicht tegen elkaar liggen dat er geen
akkoordnoot meer tussen kan, spreken we van enge ligging . Wanneer er telkens een
akkoordnoot tussen gelaten wordt, ligt het akkoord in wijde ligging . Wanneer tussen
sopraan en alt nog een akkoordnoot kan tussengevoegd worden maar niet tussen alt
en tenor (of omgekeerd), spreken we van gemengde ligging. Bij elk van deze liggingen
wordt de afstand tussen bas en tenor niet in rekening genomen.
In Figuur 2.8 zijn enkele voorbeelden weergegeven van de drie liggingen. De akkoord-
noten die bij wijde of gemengde ligging tussen twee stemmen zouden kunnen geplaatst
worden, zijn weergegeven als zwarte noten zonder stok.
Figuur 2.8: Enge, wijde en gemengde ligging van het 5Iakkoord in do groot.
2.4.5 Omkeringen
Tot nu toe hebben we steeds de grondnoot in de bas genoteerd. Het akkoord ligt dan
in grondligging . Wanneer een andere noot dan de grondnoot in de bas ligt, is er sprake
![Page 18: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/18.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 12
van een omkering van het akkoord. Wanneer de terts in de bas ligt, is dit de eerste
omkering. Wanneer de kwint in de bas ligt, is dit de tweede omkering. In het geval
van septiemakkoorden is er ook nog een derde omkering, waarbij de septime in de bas
ligt. Als voorbeeld bekijken we het tonica-akkoord van do groot. De grondnoot is hier
do. Wanneer do in de bas ligt, ligt het akkoord dus in grondligging. Een terts boven
de grondnoot vinden we de noot mi, dus bij de eerste omkering ligt mi in de bas. Op
analoge wijze vinden we dat bij de tweede omkering sol in de bas ligt, en bij de derde
omkering si.
Elke omkering heeft ook zijn eigen benaming en notatie. Tabel 2.2 geeft een overzicht
van de verschillende omkeringen. Onder �ligging� verstaan we hier de grondligging
of een omkering van het akkoord, niet te verwarren met de enge, wijde en gemengde
ligging uit de vorige sectie. De polyfonie is het aantal noten in het akkoord, dus 3 voor
een drieklank en 4 voor een vierklank.
Polyfonie Ligging Basnoot Naam Notatie
3 grondligging grondnoot kwintakkoord 53 eerste omkering terts sextakkoord 6
3 tweede omkering kwint kwartsextakkoord 64
4 grondligging grondnoot dominant septiemakkoord 7
4 eerste omkering terts kwintsextakkoord 65
4 tweede omkering kwint tertskwartakkoord 43
4 derde omkering septime secundeakkoord 2
Tabel 2.2: Overzicht van de omkeringen
De notatie in Arabische cijfers die hier gebruikt wordt, legt dus de polyfonie en de
ligging van het akkoord ondubbelzinnig vast. We noemen deze aanduiding de becijfe-
ring van het akkoord. De getallen die gebruikt worden in de becijfering komen overeen
met de intervallen die in de naam van het akkoord voorkomen. Bijvoorbeeld bij een
kwartsextakkoord in do groot met do als grondnoot vinden we sol in de bas, en do, mi
en sol in de bovenstemmen. De benaming kwartsextakkoord is afkomstig van het feit
dat in de bovenstemmen, naast een verdubbeling van de basnoot sol, de kwart boven
de basnoot (do) en de sext boven de basnoot (mi) voorkomen. Doordat een sext een
interval is dat uit 6 noten bestaat, en een kwart een interval dat uit 4 noten bestaat,
komen we aan de notatie64.
Er bestaan nog andere notaties dan de notatie die we hier voorstellen. In Frankrijk
wordt een andere notatie gebruikt voor de septiemakkoorden, en in jazz-theorieboeken
gebruikt men totaal andere akkoordsymbolen. In deze tekst en in Ramo zullen we ons
echter steeds houden aan de notatie uit Tabel 2.2.
![Page 19: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/19.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 13
2.4.6 Beschrijvingen
Een toontrap, genoteerd met een Romeins cijfer, en een becijfering, genoteerd met één
of twee Arabische cijfers, leggen een akkoord en zijn ligging ondubbelzinnig vast. De
combinatie van een toontrap en een becijfering, noemen we een beschrijving van een
akkoord. De becijfering wordt steeds boven de toontrap genoteerd. In Figuur 2.9 zien
we enkele voorbeelden van akkoorden met hun beschrijvingen. Merk op dat er ook per
beschrijving verschillende realisaties mogelijk zijn.
Figuur 2.9: Akkoorden met hun beschrijvingen (in do groot)
2.4.7 Beweging
De manier waarop twee stemmen bewegen ten opzichte van elkaar is ook belangrijk in
de harmonie. We onderscheiden drie soorten bewegingen:
• Gelijke beweging: beide stemmen stijgen of beide stemmen dalen.
• Tegenbeweging: de ene stem stijgt en de andere stem daalt.
• Zijdelingse beweging: één stem blijft liggen en de andere stem stijgt of daalt.
Men streeft meestal naar zoveel mogelijk tegenbeweging.
Figuur 2.10: De drie soorten beweging tussen twee stemmen.
![Page 20: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/20.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 14
2.4.8 Cadenzen
Een cadens is een opeenvolging van akkoorden die de toonaard bevestigt. Ze worden
gebruikt aan het einde van een stuk, of aan het einde van een muzikale zin van een
stuk. We beperken ons hier tot de belangrijkste soorten cadenzen.
• De volmaakte cadens is een5V
-5I
verbinding. Deze verbinding geeft een zeer
duidelijk �slotgevoel�. Het is dan ook de cadens bij uitstek om een stuk mee af
te sluiten.
• De plagale cadens is een5
IV-
5I
verbinding. Deze cadens wordt ook gebruikt aan
het einde van een stuk, en wordt bijna altijd voorafgegaan door een volmaakte
cadens.
• De gebroken cadens is een5V
-5
V Iverbinding. Deze cadens wordt nooit gebruikt
aan het de�nitieve slot van een stuk, maar wel aan het eind van een deel van een
stuk. Deze cadens klinkt alsof het slot eraan komt, maar doordat er geen5I
maar
een5
V Iakkoord volgt, blijkt het slot toch nog even op zich te laten wachten.
Om deze reden wordt de gebroken cadens soms ook �valse cadens� of �bedrieglijke
cadens� genoemd.
• De halve cadens is een tijdelijk rustpunt op het dominant akkoord5V
. Deze
cadens wordt gebruikt om een deel van een stuk dat nog niet gedaan is tijdelijk
neer te leggen.
Een volmaakte cadens wordt vaak voorafgegaan door een akkoord met subdominant-
functie (een akkoord op toontrap IV of II), hoewel dit niet verplicht is. De volledige
verbinding is dan bvb.5
IV-
5V
-5I. Op dezelfde manier kan ook een gebroken cadens
of een halve cadens voorafgegaan worden door een subdominant. In Figuur 2.11 zien
we de verschillende soorten cadenzen, waarbij de volmaakte, gebroken en halve cadens
voorafgegaan worden door een subdominant.
Aangezien cadenzen een punt van rust zijn in de muziek, kunnen we ze vergelijken met
leestekens in een tekst. Een volmaakte cadens komt dan overeen met een punt aan het
einde van een zin, terwijl een halve cadens of gebroken cadens overeenkomt met een
komma.
![Page 21: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/21.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 15
Figuur 2.11: Cadenzen in do groot.
2.4.9 Modulaties
Wanneer een muziekstuk van de ene toonaard naar de andere overgaat, noemen we
dit een modulatie. In Ramo gebruiken we enkel de diatonische modulatie. Het is
niet wenselijk dat een muziekstuk zeer abrupt van de ene toonaard naar de andere
overgaat. Daarom is er bij een diatonische modulatie steeds één akkoord dat zowel in
de eerste toonaard als in de tweede toonaard kan voorkomen zonder toonaardvreemde
noten te bevatten. We noemen dit akkoord het spilakkoord. Dit spilakkoord wordt dan
beschreven met 2 verschillende toontrappen, één voor elke toonaard. Wanneer we bvb.
moduleren van do groot naar sol groot, kan de drieklank do - mi - sol als spilakkoord
dienen, want de noten in deze drieklank komen in beide toonaarden voor. In do groot
is de beschrijving van deze drieklank5I, en in sol groot is de beschrijving
5IV
. Merk
op dat een spilakkoord 2 verschillende toontrappen heeft, maar dat de becijfering wel
steeds gelijk blijft.
Om de modulatie te bevestigen, laat men na een spilakkoord best zo snel mogelijk
de noten horen uit de nieuwe toonaard die in de vorige toonaard niet voorkwamen.
Dit gebeurt vaak door middel van een cadens, al dan niet voorafgegaan door een sub-
dominant.
Figuur 2.12: Modulatie van do groot naar sol groot.
![Page 22: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/22.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 16
2.5 Harmonieregels
Er bestaan heel veel verschillende harmonieregels en in Ramo zijn er ook al heel wat
regels geïmplementeerd. Sommige regels daarvan zijn van fundamenteel belang, terwijl
andere zich op details richten die minder vaak voorkomen. In deze sectie willen we een
overzicht geven van de soorten regels die er bestaan, en dit illustreren met enkele
voorbeelden. Een volledig overzicht van de geïmplementeerde regels in Ramo is te
vinden in de thesis van Wouter Rogiers ([23], appendix A).
2.5.1 Akkoordregels
De akkoordregels zijn de �verticale� regels. Ze hebben betrekking op de 4 noten die
een akkoord realiseren. Bij het evalueren van een akkoordregel, moeten we dus enkel
het akkoord zelf bekijken en niet de akkoorden die eraan voorafgaan of erop volgen.
Enkele voorbeelden:
• Stembereik: Een stem mag de grenzen van zijn stembereik niet overschrijden.
• Stemkruising: Een lagere stem mag geen noot toegewezen krijgen die hoger is
dan een noot in een hogere stem.
• Afstand tussen stemmen: Het interval tussen sopraan en alt, en tussen alt en
tenor, mag niet groter zijn dan een octaaf. Deze beperking geldt niet voor het
interval tussen tenor en bas.
• Geen akkoordvreemde noten: Geen enkele stem mag een noot bevatten die niet
tot het akkoord behoort.
• Verdubbeling: Naargelang de ligging van het akkoord, mogen of moeten bepaalde
noten wel of niet verdubbeld worden. Bvb. bij hoofdakkoorden (akkoorden op
toontrappen I, IV en V) in grondligging moet de grondnoot verdubbeld worden.
Figuur 2.13: Enkele overtredingen van akkoordregels
![Page 23: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/23.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 17
2.5.2 Melodieregels
De melodieregels zijn de �horizontale� regels. We kunnen deze stem per stem evalueren,
zonder rekening te houden met de andere stemmen.
Enkele voorbeelden:
• Leidtoon: Wanneer de leidtoon (de zevende toontrap van de toonladder) voor-
komt in een stem, moet de volgende noot in diezelfde stem de tonica zijn.
• Tritonus: Een vermeerderde kwart (�tritonus� genoemd omdat een vermeerderde
kwart uit drie hele tonen bestaat) tussen twee opeenvolgende noten in dezelfde
stem is verboden. In Figuur 2.14 zien we een voorbeeld van een tritonus in de
sopraan.
• Vermeerderde secunde: Een vermeerderde secunde tussen twee opeenvolgende
noten in dezelfde stem is verboden. Bij grote tertstoonladders kan dit niet voor-
komen. Bij de harmonische kleine tertstoonladder moet men hier wel op letten,
omdat er dan tussen VI en VII een vermeerderde secunde ligt (zie 2.4.2)
Figuur 2.14: Vermeerderde kwart in de sopraanstem.
2.5.3 Verbindingsregels
De verbindingsregels bepalen hoe akkoorden en hun realisaties met elkaar mogen ver-
bonden worden.
Een eerste soort verbindingsregels houdt enkel rekening met de beschrijvingen:
• Bepaalde beschrijvingen mogen niet met elkaar verbonden worden. De belang-
rijkste verboden verbinding is5V
-5
IV, hoewel deze in de popmuziek wel vaak
gebruikt wordt. Andere verboden verbindingen zijn bvb. II - III, II - IV, III - I,
III - II, III - V, IV - III en VI - I, ongeacht de becijfering.
![Page 24: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/24.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 18
Een tweede soort verbindingsregels heeft betrekking op de noten in de realisaties van
meerdere opeenvolgende akkoorden. Dit zijn dus zowel �horizontale� als �verticale�
regels. Hierbij kan al dan niet rekening gehouden worden met de beschrijvingen.
Enkele voorbeelden:
• Stemoverschrijding: Een noot in een bepaalde stem mag in diezelfde stem niet
gevolgd worden door een noot die hoger (of lager) ligt dan een noot uit een hogere
(of lagere) stem in het eerste akkoord.
• Tegenbeweging: Sommige verbindingen eisen dat de 3 bovenstemmen tegenbe-
weging maken met de bas, bvb. de verbinding5
IV-
5V
.
• Parallelle primen, kwinten en octaven: Wanneer het gereduceerde interval (d.i.
het interval modulo een octaaf) tussen twee stemmen een kwint is, mag het ge-
reduceerde interval tussen diezelfde stemmen in het volgende akkoord niet weer
een kwint zijn, behalve wanneer de betre�ende stemmen blijven liggen. Hetzelf-
de geldt voor primen (gelijkklanken, bvb. sol - sol op dezelfde toonhoogte) en
octaven. Dit is één van de belangrijkste regels uit de harmonie. Een overtreding
op deze regel wordt bijna altijd als een ernstige fout beschouwd. In Figuur 2.15
zien we een voorbeeld van parallelle kwinten.
Figuur 2.15: Voorbeeld van parellelle kwinten
2.5.4 Metrumregels
Dit zijn akkoordregels, melodieregels of verbindingsregels die rekening houden met de
positie van de akkoorden binnen hun maat. Het kan bvb. van belang zijn of een akkoord
op een sterke of op een zwakke tel komt. Hoewel het in de muziektheorie geen o�ciële
benaming is, hebben we regels van dit type verzameld onder de naam �metrumregels�.
Enkele voorbeelden van metrumregels:
![Page 25: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/25.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 19
• Gesyncopeerde harmonieën: Een beschrijving mag niet op een lichte tel starten
en op een zware tel verdergezet worden. In Figuur 2.16 zien we een gesyncopeer-
de harmonie waarbij het dominant akkoord op de tweede (lichte) tel start, en
doorgaat op de derde (sterke) tel.
• Nieuwe beschrijving na maatstreep: Bij het begin van een maat moet een nieuwe
beschrijving begonnen worden.
Figuur 2.16: Gesyncopeerde harmonie
Ook veel regels in verband met kwartsextakkoorden (drieklanken waarbij de kwint in de
bas ligt, zie 2.4.5) vallen onder deze categorie. In tegenstelling tot de andere liggingen, is
het gebruik van kwartsextakkoorden slechts in een aantal speci�eke situaties toegelaten.
In Ramo zijn enkel de volgende mogelijkheden toegelaten:
• Voorslagakkoord: Kwartsextakkoord op een sterke tel, dat gevolgd wordt door het
kwintakkoord op de toontrap een kwint hoger, bvb.64I
-5V
. Voorslagakkoorden
worden vaak gebruikt in cadenzen. Een volmaakte cadens kan er dan bvb. uitzien
als64I
-5V
-5I
.
• Wisselakkoord: Kwartsextakkoord op een lichte tel, voorafgegaan en gevolgd door
het kwintakkoord op de toontrap een kwint hoger, bvb.5V
-64I
-5V
. Wissel-
akkoorden worden vaak gebruikt als afwisseling bij een lang aangehouden bas-
noot.
• Doorgangsakkoord: Kwartsextakkoord op een lichte tel, waarbij de bas als eentrapje stijgt of daalt in secunden. Een doorgangsakkoord mag slechts door zeerspeci�eke beschrijvingen voorafgegaan en gevolgd worden. We gaan hier in deze
![Page 26: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/26.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 20
tekst niet in detail op in, een gedetailleerd overzicht is te vinden in [23], hoofdstuk
15. Een voorbeeld van een mogelijke verbinding is5I-
64V
-6I
.
Figuur 2.17: Correct gebruik van kwartsextakkoorden.
2.6 Harmonieopgaven
Tot slot van dit hoofdstuk bespreken we nog enkele typische opgaven zoals die in
harmoniecursussen gegeven worden. Deze zullen in Hoofdstuk 8 ook de meest voor de
hand liggende input zijn voor de algoritmen in Ramo die de oefeningen proberen op te
lossen.
2.6.1 Harmoniseren van een bas met beschrijvingen
De eenvoudigste oefening is de bas met beschrijvingen. In de opgave is dan de basstem
volledig ingevuld, terwijl de andere 3 stemmen niet ingevuld zijn. Ook alle beschrij-
vingen zijn gegeven. De leerling weet dus voor elke basnoot welk akkoord er moet
komen en in welke ligging. De leerling moet dan enkel nog de bovenste 3 stemmen
invullen, volgens de harmonieregels uiteraard, en zoveel mogelijk voor een melodieuze
sopraanstem zorgen. In Figuur 2.18 zien we een voorbeeld van een dergelijke opgave
en een van de mogelijke oplossingen.
2.6.2 Harmoniseren van een bas zonder beschrijvingen
Iets moeilijker wordt het wanneer de basstem gegeven is, maar de beschrijvingen nog
door de leerling moeten ingevuld worden. De leerling moet dan zelf de meest geschikte
![Page 27: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/27.jpg)
HOOFDSTUK 2. INLEIDING TOT DE HARMONIE 21
Figuur 2.18: Opgave met gegeven bas en beschrijvingen (boven) + mogelijke oplossing(onder)
beschrijvingen kiezen. Het aantal mogelijke beschrijvingen per basnoot is wel niet zo
groot. Daarnaast moeten ook bij deze oefening de drie bovenstemmen ingevuld worden
volgens de harmonieregels en moet er aandacht besteed worden aan de sopraan.
2.6.3 Harmoniseren van een sopraan
Bij deze oefening is enkel de sopraanstem gegeven. De leerling moet dan de tenor, alt,
bas en de beschrijvingen invullen. Hierbij zijn er meestal vrij veel mogelijke beschrij-
vingen per noot in de sopraan. De leerling moet dus ook zelf bepalen welke cadenzen
er op welke plaatsen komen. Dit zijn de moeilijkste oefeningen, maar tegelijk ook
de interessantste, omdat de leerling in het harmoniseren van een sopraan veel meer
creativiteit kwijt kan dan in het harmoniseren van een bas.
![Page 28: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/28.jpg)
Hoofdstuk 3
Het programma Ramo
3.1 Bedoeling
Ramo werd oorspronkelijk ontwikkeld als een interactieve harmonietrainer. Leerlingen
moesten hun werk kunnen invoeren in het programma, en het programma zou de fouten
in de oefening aanduiden. Op die manier kon de docent ontlast worden van het telkens
opnieuw verbeteren van dezelfde elementaire fouten. Het programma was in de eerste
plaats bedoeld voor conservatoriumstudenten, maar zou even goed bruikbaar kunnen
zijn voor leerlingen die harmonie volgen aan een muziekacademie. In deze thesis is
het de bedoeling verder te gaan, en Ramo ook zelf de opgaven te laten oplossen. Om
een aantal keuzes te kunnen verantwoorden, geven we in de volgende paragrafen een
beknopt overzicht van het verloop van de ontwikkeling tot nu toe.
3.2 Het oorspronkelijke Ramo programma
Bart Van Lysebetten en Wouter Rogiers schreven de eerste versie van Ramo in het
academiejaar 2004-2005. Het programma werd geschreven in Java en maakt gebruik
van XML om bestanden op te slaan. Ramo bestond in feite uit 3 verschillende applica-
ties: één voor de student, één voor de docent, en één waarmee harmonieregels kunnen
gegroepeerd worden.
3.2.1 Student, docent en regelgroepeerder
We bespreken hier kort de mogelijkheden van de drie deelapplicaties van het oorspron-
kelijke programma. Eerst en vooral bespreken we de versie voor de student.
Een belangrijk onderdeel van de versie van Ramo voor de student is de noteneditor.
Hiermee kan de student zijn oplossing voor een opgave invoeren. Het muziekblad wordt
22
![Page 29: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/29.jpg)
HOOFDSTUK 3. HET PROGRAMMA RAMO 23
door de noteneditor opgevat als één lange horizontale notenbalk, waaronder de toonaar-
den en de beschrijvingen aangegeven zijn. Verticaal wordt het muziekblad ingedeeld in
harmonische cellen. Dit zijn groepen van 4 noten die gelijktijdig klinken. Deze indeling
is mogelijk doordat de stemvoering homoritmisch is: alle stemmen hebben hetzelfde
ritme.
Een muziekblad kan opgeslagen worden als een *.ramo bestand. In een regelbestand
(*.rl bestand) zijn de regels opgeslagen waaraan de oplossing moet voldoen. Na een
dergelijk regelbestand ingeladen te hebben, kan de student zijn oplossing checken. In-
dien er overtredingen zijn, verschijnt dan onderaan in beeld een lijst met de gemaakte
fouten. Wanneer de student één van deze fouten uit de lijst aanklikt, wordt de fout
soms ook in rood aangeduid op de partituur, bvb. door één of meer noten te omcirkelen
of door één of meer akkoorden te omkaderen. Verder heeft de student ook nog de mo-
gelijkheid zijn muziekblad af te spelen. In Figuur 3.1 zien we de GUI voor de student
met de noteneditor, de lijst met overtredingen en een gra�sche aanduiding voor één
van de fouten.
Figuur 3.1: GUI voor de student
Een typische use case (= opeenvolging van gebeurtenissen in een bepaalde volgorde die
samen een zinvolle toepassing van het systeem vormen) voor de student is de volgende:
1. De student opent een *.ramo bestand met de opgave die door de docent werd
opgesteld.
2. De student voert zijn oplossing in met behulp van de noteneditor.
3. De student laadt het *.rl bestand in met de regels waaraan moet voldaan worden.
![Page 30: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/30.jpg)
HOOFDSTUK 3. HET PROGRAMMA RAMO 24
4. De student laat zijn oplossing controleren.
5. De student bekijkt de eventuele fouten en brengt verbeteringen aan waar nodig.
6. De student slaat zijn oplossing op in een *.ramo bestand.
De tweede deelapplicatie is de versie voor de docent. Deze verschilt niet veel van die
voor de student. Alle mogelijkheden voor de student zijn bij de docent ook aanwezig,
maar de docent heeft nog een aantal extra mogelijkheden. Zo kan hij bvb. bepaalde
noten of een hele stem van een opgave vast zetten. De student kan in zijn oplossing deze
noten dan niet wijzigen. Ook kan de docent de voortekening van de opgave bepalen,
en maten toevoegen of verwijderen.
Ten slotte is er nog de regelgroepeerder. In de oorspronkelijke versie van Ramo is
een vaste set van regels geïmplementeerd. De gebruiker kan hier zelf geen regels aan
toevoegen. Wel kan de gebruiker een subset van deze regels speci�ceren met behulp
van de regelgroepeerder. Hiermee kan men een regelbestand aanmaken dat vervolgens
in de applicatie voor student of docent kan ingeladen worden om muziekbladen te
controleren volgens deze regels.
Figuur 3.2: De regelgroepeerder uit het oorspronkelijke programma
3.2.2 GUI en regelsysteem
We kunnen het systeem enerzijds bekijken als verdeeld in 3 componenten, namelijk de
3 applicaties zoals hierboven beschreven. Maar zoals uiteengezet in [2] bestaat er niet
zoiets als dé structuur van een systeem, en kan een systeem steeds op verschillende
manieren in componenten verdeeld worden. Een andere kijk op het systeem levert ons
twee componenten: enerzijds de gra�sche gebruikersinterface (GUI) en anderzijds het
![Page 31: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/31.jpg)
HOOFDSTUK 3. HET PROGRAMMA RAMO 25
regelsysteem. De GUI zorgt voor de interactie met de gebruiker: het tonen en editeren
van muziekbladen, het aanduiden van fouten enz.
Het regelsysteem zorgt voor de interne logica en is verantwoordelijk voor het evalueren
van een muziekblad. De regels in het regelsysteem zijn proceduraal uitgedrukt, wat
betekent dat ze uitgedrukt worden als uitvoerbare code. Elke regel wordt geëvalueerd
door een �check� methode uit te voeren die het muziekblad of (een deel ervan) contro-
leert en een boolean retourneert die aangeeft of aan de regel voldaan is. In deze versie
van het regelsysteem zijn de regels hardgecodeerd. Meestal is er één klasse per regel.
Soms zijn er van één klasse ook verschillende instanties mogelijk die dan elk verschil-
lende regels voorstellen. De regels voor verboden verbindingen zijn bvb. allemaal een
instantie van dezelfde klasse. In elk geval legt het feit dat de regels hardgecodeerd zijn
beperkingen op aan het systeem, en zou een meer �exibel regelsysteem wenselijk zijn.
3.3 Het nieuwe regelsysteem
In het academiejaar 2005-2006 werd een nieuwe versie van het regelsysteem geïmple-
menteerd door Arne Brasseur. Het basisidee hierbij was dat het mechanisme (hóe
regels evalueren) moet gescheiden worden van het beleid (wélke regels evalueren). Het
beleid verandert doorgaans immers veel sneller dan het mechanisme.
Er werd ook een nieuwe regeleditor geïmplementeerd. Hierin kan de gebruiker zelf
beschrijvingen van regels opstellen, en instanties van deze regels maken, en dit alles
opslaan in een bestandsformaat in XML. Er zijn dus geen hardgecodeerde regels meer.
3.3.1 Regelbeschrijvingen en instanties
Figuur 3.3 toont hoe een beschrijving van een regel in de nieuwe regeleditor er uitziet.
De regels worden zoals in het vorige regelsysteem nog steeds proceduraal uitgedrukt.
Bij het evalueren van de regel wordt de code uitgevoerd die door de gebruiker inge-
voerd wordt. De gebruiker kan ook een aantal parameters aanmaken om in de code te
gebruiken. Deze parameters kunnen van het type int of String zijn, maar er zijn ook
parametertypes voorzien die akkoorden, toontrappen, becijferingen, noten, intervallen
enz. voorstellen. De gebruiker kan ook een tekstuele foutboodschap opgeven, waarin hij
gebruik kan maken van de gede�nieerde parameters door hun naam tussen accolades te
plaatsen. Er kan een foutboodschap voor verschillende talen opgegeven worden, bvb.
Nederlands.
De regel die in het voorbeeld beschreven wordt, is de regel �Afstand tussen stemmen�
uit 2.5.1 die bepaalt dat de afstand tussen sopraan en alt en tussen alt en tenor niet
groter dan een octaaf mag zijn. In het voorbeeld kan men echter zien dat de beschrij-
ving niet vastlegt over welke stemmen en over welk interval het gaat. De parameters
![Page 32: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/32.jpg)
HOOFDSTUK 3. HET PROGRAMMA RAMO 26
Figuur 3.3: Beschrijving van een regel in de nieuwe regeleditor
upperVoice en lowerVoice bepalen de stemmen, en de parameter maxInterval be-
paalt het maximum interval dat tussen upperVoice en lowerVoice mag liggen.
Het is duidelijk dat de beschrijving van de regel niet op zichzelf kan gebruikt worden.
De parameters moeten nog concrete waarden krijgen. Daarvoor moeten instanties van
de regels aangemaakt worden die aan de parameters een concrete waarde geven. Figuur
3.4 geeft een voorbeeld van een dergelijke instantie, waarbij de afstand tussen alt en
tenor niet groter mag zijn dan een octaaf.
Figuur 3.4: Instantie van een regel in de nieuwe regeleditor
Op die manier kan de gebruiker al de gewenste regelbeschrijvingen zelf aanmaken en
de nodige instanties creëren. Enkel instanties van regels kunnen uitgevoerd worden,
![Page 33: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/33.jpg)
HOOFDSTUK 3. HET PROGRAMMA RAMO 27
dus ook voor regelbeschrijvingen zonder parameters moet een instantie aangemaakt
worden. Zowel voor de beschrijvingen van regels als voor de instanties van regels is een
bestandsformaat in XML gede�nieerd.
3.3.2 Uitvoeren van regels
Om de regels te evalueren werd gebruik gemaakt van het Bean Scripting Framework
(BSF ). Dit framework maakt het gebruik van scripting mogelijk in java, wat betekent
dat code onmiddellijk uitgevoerd kan worden zonder deze eerst te compileren. Die code
kan geschreven zijn in een scriptingtaal zoals JavaScript of Python. De code wordt dan
at runtime geïnterpreteerd. Aangezien Java normaal niet als een geïnterpreteerde taal
gebruikt wordt, moeten we om dit ook voor Java mogelijk te maken de hulp inroepen
van de BeanShell , een interpreter voor Java broncode. In theorie is het mogelijk de
regels in de nieuwe regeleditor te speci�ceren in verschillende talen, maar in de praktijk
is enkel Java voorzien.
3.3.3 Errortickets
Telkens als een regel faalt, wordt een errorticket afgeleverd. Dit errorticket bevat
tekstuele informatie over de fout en eventueel ook een gra�sche weergave. Voor elke
regelbeschrijving kan de gebruiker ook vastleggen welk soort errorticket er moet afgele-
verd worden. Er zijn verschillende types mogelijk, die elk een eigen gra�sche weergave
hebben zoals bvb. een cirkel rond een noot, een lijn, een kader rond cellen... Iets ge-
lijkaardig was in het oorspronkelijke programma ook al voorzien, maar was toen nog
niet geïmplementeerd aan de hand van errortickets.
Naargelang hun type hebben errortickets verschillende informatie nodig om zichzelf te
kunnen tekenen. Een errorticket met enkel tekst heeft geen verdere informatie nodig.
Een errorticket dat getekend wordt als een cirkeltje rond een noot moet weten in
welke cel en in welke stem de noot moet omcirkeld worden, terwijl een errorticket dat
getekend wordt als een kader rond cellen moet weten wat de startcel is en hoeveel cellen
er omkaderd moeten worden. Deze informatie wordt meegegeven als parameters voor
het errorticket. In Figuur 3.5 zien we het editorvenster voor een errorticket.
Figuur 3.5: Editorvenster voor een errorticket
![Page 34: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/34.jpg)
HOOFDSTUK 3. HET PROGRAMMA RAMO 28
3.4 Afweging tussen beide regelsystemen
Uit het voorgaande is gebleken dat de recentste versie van het regelsysteem een duidelijk
voordeel heeft op het oorspronkelijke regelsysteem, namelijk de �exibiliteit. Bij de start
van deze thesis was het dan ook de bedoeling met dit regelsysteem verder te werken.
Dit regelsysteem bleek echter een belangrijk nadeel te hebben, namelijk de snelheid.
Het evalueren van een muziekblad van 4 maten aan de hand van een regelset met 21
regels, duurde gemiddeld 600 à 700 milliseconden met uitschieters tot 2 seconden. Uit
enkele tijdmetingen bleek dat het grootste deel van de tijd gespendeerd werd in de eval
methode van de klasse BSFManager, de methode die voor het interpreteren van de code
zorgt. De lage snelheid lag dus wel degelijk aan het Bean Scripting Framework.
Voor de use case beschreven in 3.2.1, dus de student die een opgave oplost en contro-
leert, is dat geen onoverkomelijk nadeel. Maar voor de backtracking-algoritmen die wij
in gedachten hadden, zouden zodanig veel checks nodig zijn dat de snelheid met dit
regelsysteem absoluut onaanvaardbaar zou worden.
Het oorspronkelijke regelsysteem daarentegen kon een muziekblad met dezelfde grootte
evalueren in 16 milliseconden, en dit met een veel grotere regelset. In dit geval vonden
we het dus verantwoord snelheid te verkiezen boven �exibiliteit, en besloten we terug
te keren naar het oude regelsysteem.
![Page 35: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/35.jpg)
Hoofdstuk 4
Methoden voor algoritmische
compositie
4.1 Algoritmische compositie
Algoritmische compositie kan omschreven worden als �een sequentie van bewerkingen
om muzikale elementen in een eindig aantal stappen te combineren tot een muzikaal
geheel � [19]. In [1] vinden we nog een andere de�nitie, namelijk �het gebruik van formele
methoden om muziek te creëren met minimale menselijke interventie�.
Het is interessant te onderstrepen dat het hier niet noodzakelijk om computergegenereerde
muziek gaat. Het idee van het formaliseren van het compositieproces is al eeuwenoud.
Een voorbeeld hiervan is de canon. In zijn eenvoudigste vorm is dit een techniek waar-
bij de componist één melodie componeert en vervolgens aan de verschillende stemmen
dezelfde melodie toekent, maar verschoven over een aantal tellen. Tijdens de vroeg-
renaissance ontwikkelde deze canontechniek zich tot een intellectueel spel. Zo zijn er
bvb. canons waarbij de tweede stem de intervallen van de melodie omgekeerd uitvoert
(canon in omkering), of waarbij de andere stemmen de duur van de noten proportioneel
vergroten of verkleinen (proportiecanon), of waarbij elke stem de melodie een kwint
hoger of lager inzet dan zijn voorganger en zo de kwintencirkel doorlopen wordt (cir-
kelcanon). De technieken die hier gebruikt worden kunnen we de algoritmen noemen
die de componist gebruikt om zijn muziekwerk te creëren. Hierbij gebeurt een deel van
het componeerwerk niet door menselijke creativiteit maar wel door het volgen van een
algoritme.
Bij algoritmische compositie wordt ook zeer vaak gebruik gemaakt van het toeval.
Bepaalde beslissingen worden dan op willekeurige wijze genomen. Wolfgang Amadeus
Mozart deed dit reeds in zijn �Musikalisches Wurfelspiel� (�muzikaal dobbelspel�). Door
het gooien van een dobbelsteen werden een aantal vooraf gecomponeerde maten op
willekeurige wijze aan elkaar geplakt.
29
![Page 36: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/36.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 30
Nog een voorbeeld van algoritmen in muziek is het serialisme (twintigste eeuw) waarin
muzikale elementen in reeksen worden geplaatst, en vervolgens allerlei transformaties
op deze reeksen gebeuren zoals omkering, spiegeling... Het zijn niet alleen de noten die
in reeksen geplaatst worden, maar ook alle andere elementen zoals bvb. de klanksterkte
en de gebruikte instrumenten.
Het hoeft ons dan ook niet te verwonderen dat men na de uitvinding van de computer
al snel geïnteresseerd was in manieren om de computer muziek te laten genereren. In
de negentiende eeuw deed Ada Lovelace, die als pionier in de informatica het eerste
programma schreef voor de �analytical engine� van Charles Babbage, reeds de volgende
voorspelling:
�Supposing, for instance, that the fundamental relations of pitched sounds
in the science of harmony and of musical composition were susceptible of
such expression and adaptations, the engine might compose elaborate and
scienti�c pieces of music of any degree of complexity or extent.� [14]
Om het automatisch componeren van muziek waar te maken, zijn al verschillende bena-
deringen geprobeerd, de ene al met meer succes dan de andere. In wat volgt beschrijven
we een aantal van de reeds geprobeerde benaderingen. In het bijzonder besteden we
aandacht aan �constraint satisfaction problems� met backtracking en genetische algo-
ritmen en maken we een vergelijking tussen deze twee. We vermelden ook nog een
aantal andere benaderingen. Tot slot zetten we kort onze eigen methode uiteen, die in
de volgende hoofdstukken verder uitgewerkt wordt.
![Page 37: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/37.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 31
4.2 Constraint satisfaction problem met backtracking
4.2.1 Harmonisatie als een constraint satisfaction problem
Het probleem van harmonisatie kan uitgedrukt worden als een constraint satisfaction
problem (CSP). We geven eerst een de�nitie voor een CSP en gaan vervolgens na hoe
dit gebruikt wordt voor harmonisatie.
De�nitie constraint satisfaction problem
Een constraint satisfaction problem is een probleem waarbij
• een set S = {V1,... , Vm} van m variabelen waarbij elke variabele Vi waarden
aanneemt uit een eindig domein Di
• een set C = {C1, C2,... , Cn} van n restricties (�constraints�) op de waarden van
deze variabelen
gegeven zijn, en waarbij het de bedoeling is een waarde toe te kennen aan al deze
variabelen op een zodanige manier dat aan alle constraints voldaan is.
De constraints uit C beperken het aantal mogelijke combinaties van waarden die men
kan toekennen aan de variabelen uit S. Soms wordt ook nog onderscheid gemaakt tussen
hard constraints , restricties waaraan strikt moet voldaan worden, en soft constraints ,
waarbij dit niet verplicht is maar wel wenselijk.
Variabelen, domein en constraints in het harmonisatieprobleem
Noem g de grootte van het muziekblad uitgedrukt in aantal akkoorden. Bij het vier-
stemmige harmonisatieprobleem moet er aan 8 x g variabelen een waarde toegekend
worden, elk met hun eigen domein. Per akkoord hebben we de volgende variabelen:
• Toontrap 1, met als domein {I, II, III, IV, V, VI, VII} (domeingrootte: 7)
• Toontrap 2, met als domein {I, II, III, IV, V, VI, VII} (domeingrootte: 7)
• Becijfering 1, met als domein {5, 6,6
4, 7,
6
5,
4
3, 2} (domeingrootte: 7)
• Becijfering 2, met als domein {5, 6,6
4, 7,
6
5,
4
3, 2} (domeingrootte: 7)
• De sopraanstem, met als domein het bereik [do(0) .. la(1)] (domeingrootte: 61)
![Page 38: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/38.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 32
• De altstem, met als domein het bereik [sol(-1)..re(1)] (domeingrootte: 56)
• De tenorstem, met als domein het bereik [do(-1)..la(0)] (domeingrootte: 61)
• De basstem, met als domein het bereik [fa(-2)..re(0)] (domeingrootte: 61)
De domeingrootte voor sopraan, alt, tenor en bas werd bepaald door alle noten tussen
de ondergrens en de bovengrens te tellen, inclusief hun varianten met (dubbel-)kruis
en (dubbel-)mol, voor zover die de boven- en ondergrens respecteren. Voor de sopraan
is do#(1) dus geldig, maar la#(2) niet.
Het totaal aantal combinaties voor één akkoord is dus het product van de grootte van
al deze domeinen. Dit product P bedraagt
P = 7× 7× 7× 7× 61× 56× 61× 61 = 30.518.957.336
Het aantal mogelijkheden Q om een muziekblad van bvb. 16 akkoorden te harmoniseren
bedraagt dan:
Q = P 16 ∼= 5, 66× 10167
We hebben dus een gigantische zoekruimte, zelfs voor een muziekblad van maar 16
akkoorden. Gelukkig zijn lang niet alle combinaties zinvol. Het muziekblad moet
namelijk voldoen aan de harmonieregels. We kunnen de harmonieregels dus beschouwen
als de constraints die opgelegd worden aan deze variabelen. Door deze constraints wordt
de zoekruimte al een heel stuk kleiner, hoewel ze nog steeds heel groot is.
Verder moeten we opmerken dat de opgave zelf uiteraard ook nog een aantal beper-
kingen oplegt. Wanneer bvb. de basstem gegeven is, kunnen we dit zien als extra
constraints op de basstemvariabelen. Een andere mogelijkheid is dit als een verande-
ring van domein te zien, waarbij elke basstemvariabele een domein krijgt met grootte
1.
Probleem in twee niveaus
We kunnen het harmonisatieprobleem op twee niveaus bekijken: op nootniveau en op
akkoordniveau. F. Pachet [17, 18] benadrukt in meerdere artikels het belang hiervan.
Bovenop de 8 hierboven beschreven variabelen (noten, toontrappen en becijferingen)
moet volgens hem ook een akkoordvariabele beschouwd worden.
Het probleem kan dan in twee delen opgelost worden. In de eerste stap houdt het
algoritme enkel rekening met de constraints voor noten. Dit zijn de akkoordregels
zoals bvb. de stemkruisingregel. In deze stap zoekt het algoritme naar combinaties van
![Page 39: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/39.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 33
de 8 variabelen die voldoen aan deze constraints. Op die manier wordt een domein
opgesteld voor de akkoordvariabele. In de tweede stap worden dan de constraints
tussen akkoorden geëvalueerd, zoals bvb. de regel van de parallelle kwinten.
Pachet geeft twee argumenten voor deze methode. Een eerste argument is dat de
zoekruimte hierdoor aanzienlijk verkleind wordt. De waarden in het opgestelde do-
mein voor de akkoordvariabele voldoen reeds aan een aantal constraints. Dit aantal
combinaties is dus veel kleiner dan de 30.518.957.336 combinaties die we in de vorige
paragraaf berekenden. Ter vergelijking: een experiment in Ramo waarbij voor een lege
akkoordvariabele alle geldige instanties werden geteld leverde 657 mogelijkheden op in
do groot. Een tweede argument is dat, om regels te kunnen evalueren die op meerdere
akkoorden betrekking hebben, vaak alle noten in de cel al een waarde moeten hebben.
Door deze manier van werken komen de inter-akkoordregels pas in het spel op het mo-
ment dat de akkoorden volledig ingevuld zijn, en ontstaan er geen problemen waarbij
dergelijke regels moeten geëvalueerd worden op half ingevulde cellen.
![Page 40: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/40.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 34
4.2.2 Backtracking
Een veelgebruikte manier om een CSP op te lossen, is backtracking . We beschrijven
hier eerst algemeen de werking van backtracking. In de volgende sectie bespreken we
de mogelijkheden van backtracking voor harmonisatie.
Basisidee
Het basisidee van backtracking is dat elke mogelijke oplossing voor het probleem ge-
probeerd wordt, tot wanneer een geldige oplossing gevonden is, of tot wanneer er geen
enkele oplossing meer is die men nog kan proberen. Het aantal mogelijke oplossingen
moet dus eindig zijn, anders eindigt het algoritme nooit indien er geen oplossing is.
Stel dat we aan 16 variabelen een waarde moeten toekennen. Het backtracking-
algoritme kent één voor één aan deze 16 variabelen een waarde toe. Er zijn dus 16
punten waar een keuze moet gemaakt worden. In harmonisatie kan deze keuze bvb.
zijn �Welke noot gaan we invullen in die stem in die cel?� Het backtracking-algoritme
kiest een waarde voor de variabele en gaat verder met de volgende stap waar een keuze
moet gemaakt worden. Dit gebeurt meestal door een recursieve oproep. Indien de ge-
nomen keuze achteraf een slechte keuze blijkt te zijn, keert het backtracking-algoritme
één stap terug en kiest een andere waarde voor de variabele.
Zoekboom
Door al deze keuzes ontstaat een zoekboom, die op een diepte-eerst manier doorzocht
wordt. Figuur 4.1 illustreert de volgorde waarin een backtracking-algoritme een zoek-
boom doorzoekt.
Figuur 4.1: Zoekboom in een backtracking-algoritme
Testen van oplossingen
De vraag is nu natuurlijk hoe we weten dat een keuze een slechte keuze was. Hiervoor
worden er op alle oplossingen tests uitgevoerd. Wanneer we een volledige oplossing
![Page 41: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/41.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 35
hebben, zitten we in een blad van de zoekboom, en zijn de volgende resultaten van de
test mogelijk:
• De oplossing is ongeldig: het algoritme zet een stap terug en zoekt verder.
Voorbeeld in harmonisatie: de oplossing bevat overtredingen op de harmonieregels.
• De oplossing is geldig: het algoritme retourneert de oplossing en stopt.
Voorbeeld in harmonisatie: de oplossing overtreedt geen enkele harmonieregel.
Figuur 4.2 toont een voorbeeld van een geldige oplossing in de zoekboom, waarbij het
algoritme stopt.
Figuur 4.2: Geldige oplossing in een backtracking-algoritme
Testen van deeloplossingen
Het is vaak mogelijk een oplossing al af te wijzen wanneer nog maar een deel ervan
gekend is. Daarom worden ook tests uitgevoerd op deeloplossingen, wanneer bvb. nog
maar 5 van de 16 variabelen ingevuld zijn. In dat geval zitten we in een interne top
van de zoekboom en zijn volgende resultaten van de test mogelijk:
• De deeloplossing is ongeldig: op basis van wat we nu weten kan deze deeloplossing
al zeker nooit meer tot een geldige oplossing leiden. Het heeft dan geen zin
verder te zoeken in die tak van de zoekboom. Alle afstammelingen van deze
deeloplossing zullen ook ongeldig zijn. Het algoritme zal dus onmiddellijk een stap
terugzetten zonder de kinderen van de huidige top te evalueren. Deze techniek
wordt �pruning� of �snoeien� genoemd, omdat men als het ware een deel van
de zoekboom wegsnoeit. Hierdoor kunnen soms grote delen van de zoekruimte
overgeslagen worden, waardoor het algoritme aanzienlijk versnelt. Figuur 4.3
illustreert het principe van snoeien.
Voorbeeld in harmonisatie: de huidige deeloplossing bevat reeds overtredingen op
de harmonieregels. Wanneer men met deze oplossing verdergaat, zal elke oplossing
die ervan afstamt diezelfde overtredingen bevatten.
![Page 42: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/42.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 36
• Onzeker: de deeloplossing is niet ongeldig verklaard, en kan dus nog tot een
geldige oplossing leiden. Aangezien de oplossing nog niet volledig is, kunnen we
nu nog niet weten of er echt een geldige oplossing uit zal voortvloeien, maar het
is tot nu toe nog steeds mogelijk. Het algoritme gaat dus verder met de kinderen
van de huidige top in de zoekboom.
Voorbeeld in harmonisatie: in de huidige deeloplossing zijn geen overtredingen
gevonden. Misschien leidt deze deeloplossing tot een geldige oplossing, misschien
ook niet.
Figuur 4.3: Snoeien van de zoekboom
Deze tests worden heel vaak uitgevoerd. Het spreekt dus voor zich dat deze tests
snel moeten kunnen uitgevoerd worden, bij voorkeur in constante tijd. Indien de tests
teveel tijd innemen vertragen ze het algoritme, waardoor de versnelling door het snoeien
misschien wel teniet wordt gedaan.
Backtracking voor Constraint Satisfaction Problems
Uit het voorgaande blijkt dat backtracking zeer geschikt is om een CSP op te lossen.
Een backtracking-algoritme kent één voor één een waarde toe aan de variabelen uit
het CSP. Het testen van een oplossing of deeloplossing gebeurt hier door na te gaan of
aan de constraints voldaan is. Wanneer dus na het invullen van slechts een deel van de
variabelen al één van de constraints geschonden is, zal het algoritme niet op dat spoor
verdergaan.
![Page 43: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/43.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 37
4.2.3 Backtracking voor algoritmische harmonisatie
Backtracking wordt door onderzoekers als een van de belangrijkste methoden voor har-
monisatie gezien. Er werd zelfs al een programmeertaal speciaal voor dit doel geschre-
ven. Deze taal is geschreven door Ebcioglu (1988) en werd �Backtracking Speci�cation
Language� (BSL) genoemd. Ebcioglu gebruikte BSL om CHORAL te implementeren.
Dit is een systeem voor harmonisatie van koralen1 in de stijl van Johann Sebastian
Bach. De input is een koraalmelodie en het systeem genereert aan de hand van 350
regels de middenstemmen en de bas. CHORAL is het eerste systeem voor automatische
harmonisatie waarmee resultaten van hoge kwaliteit bekomen werden. Het werk van
Ebcioglu is zeer invloedrijk en er wordt dan ook zeer vaak naar gerefereerd. Dit werk
is hierop geen uitzondering.
Een gelijkaardig systeem vinden we bij Pachet en Roy [17]. Zij schreven een frame-
work genaamd BackTalk (�Backtracking in SmallTalk�). BackTalk is een extensie van
Smalltalk om constraint satisfaction problems op een objectgeoriënteerde manier voor
te stellen. Het framework voorziet één klasse waarmee variabelen voorgesteld worden
en verschillende klassen om constraints voor te stellen. De CSP's worden opgelost door
backtracking, vandaar de naam van het framework.
In wat volgt, bespreken we een aantal interessante technieken die reeds geprobeerd zijn
in combinatie met backtracking.
Harmonisatieplan
Door te werken volgens een harmonisatieplan kan het probleem op een gestructureerde
manier opgelost worden. Een harmonisatieplan legt éérst alle beschrijvingen vast. Pas
daarna worden de noten ingevuld. Zo heeft men meer controle over de akkoordkeuze
dan wanneer men willekeurige beschrijvingen probeert en controleert of ze slagen. Men
kan op die manier bvb. de cadenzen op voorhand vastleggen.
Een ander voordeel is dat door de beschrijvingen op voorhand vast te leggen, het aantal
mogelijke noten per stem drastisch gereduceerd wordt. Wanneer bvb. voor een bepaald
akkoord de beschrijving5
IVin do groot is vastgelegd, zijn enkel nog de noten fa, la en
do mogelijk (in verschillende octaven). Het aantal noten dat moet geprobeerd worden,
is dus veel kleiner dan wanneer men alle noten zou moeten proberen.
Een dergelijke benadering met een harmonisatieplan vinden we in het systeem COM-
POzE van Henz et al. [13].
Onze ervaring is echter dat dit slechts in een beperkt aantal gevallen blijkt te werken
(zie Hoofdstuk 8).
1Religieuze melodieën voor koor, in de tijd van Bach meestal vierstemmig.
![Page 44: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/44.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 38
Productieregels voor beschrijvingen
Wanneer al één of meerdere noten gegeven zijn, bvb. in de sopraan of bas, kan men in
plaats van passief alle mogelijk beschrijvingen te proberen en te controleren welke er
slagen, ook actief de mogelijke beschrijvingen genereren. Deze regels die zelf mogelijke
waarden genereren noemen we productieregels .
Wanneer bvb. in do groot een do in de sopraan staat, kan een productieregel bepalen
dat enkel de drieklanken IV (fa-la-do), VI (la-do-mi) en I (do-mi-sol) mogelijk zijn en
hun omkeringen. Op deze manier verkleint het aantal mogelijkheden voor de beschrij-
vingen aanzienlijk, waardoor ook het aantal mogelijkheden voor de noten aanzienlijk
vermindert. In dit voorbeeld, waarbij enkel drieklanken gebruikt worden, is bvb. al
geen re of si meer mogelijk voor de noten.
In [21] is een �chord sequence generator� beschreven die dergelijke productieregels voor
beschrijvingen implementeert.
Woordenboek
Ramirez en Peralta [21] beschrijven een methode waarbij men om de beschrijvingen
te kiezen het aantal gekende akkoordprogressies probeert te maximaliseren. Deze ge-
kende progressies zijn opgeslagen in een woordenboek. Zo kan men vermijden dat
eigenaardige progressies gekozen worden waar er een progressie mogelijk was die veel
logischer is. Merk wel op dat deze gekende progressies niet noodzakelijk verplicht zijn
volgens de harmonieregels. De gekende progressies mogen dus niet als hard constraints
geïmplementeerd worden.
Backjumping
Backjumping is een variant op backtracking waarbij niet één, maar meerdere niveaus
teruggekeerd wordt. De nog niet geprobeerde nakomelingen van de tussenliggende
knopen worden dan niet meer geprobeerd. Als kan bewezen worden dat hierdoor geen
geldige mogelijkheden verloren gaan, spreken we van een safe jump. Een safe jump
komt de e�ciëntie ten goede, zonder de betrouwbaarheid van het algoritme te schaden.
Figuur 4.4 illustreert het idee van backjumping.
Backjumping is in het bijzonder bruikbaar voor regels die betrekking hebben op meer
dan 2 cellen. Wanneer bvb. een regel die betrekking heeft op 3 akkoorden overtreden
blijkt te zijn, kan het soms beter zijn meteen terug te keren naar het eerste akkoord
van de drie in plaats van naar het tweede akkoord terug te keren. Men 'springt' dan
twee stappen terug in plaats van één.
![Page 45: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/45.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 39
Figuur 4.4: Backjumping
Ebcioglu (zie boven) implementeerde deze techniek in BSL en maakt er gebruik van in
zijn CHORAL systeem. Hoewel dit zeker een nuttige techniek is, zullen we in Hoofdstuk
8 zien dat dit in Ramo niet nodig is.
Heuristische regels
Heuristische regels zijn in deze context regels die geen overtredingen op harmonieregels
detecteren, maar die uit esthetische overwegingen bepalen of iets een goede keuze is.
Ze kunnen dus geïmplementeerd worden als soft constraints. Heuristische regels geven
een indicatie van wat er moet gebeuren als er meerdere mogelijkheden zijn die aan de
hard constraints voldoen. Voorbeelden van heuristische regels zijn criteria zoals
• Tegenbeweging tussen sopraan en bas is goed.
• Stapsgewijze beweging in de sopraan is goed.
• Veel grote sprongen in sopraan of bas is niet goed.
Vaak kennen deze heuristische regels een score toe aan de akkoordrealisaties die ze
evalueren. Naargelang het belang van de heuristische regel, kan de waarde van de
score groter of kleiner zijn.
Stra�en
Een gelijkaardige benadering als die in de vorige paragraaf vinden we bij Schottstaedt
[24]. Zijn werk is gebaseerd op het traktaat �Gradus ad Parnassum� van Johann Joseph
Fux. Omdat Fux veel van de regels in zijn traktaat slechts als richtlijnen bedoelde,
moeten in het werk van Schottstaedt ook niet alle regels strikt gevolgd worden. Om
het relatieve belang van de regels uit te drukken, kent hij aan elke regel een straf toe die
bepaalt hoe �erg� het is als de regel overtreden wordt. Regels die strikt moeten gevolgd
worden, krijgen een oneindig hoge straf. Op deze manier kan men ervoor zorgen dat de
![Page 46: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/46.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 40
strikte regels nooit overtreden worden, en dat als het niet anders kan wel andere regels
overtreden worden, maar dan bij voorkeur diegene met de lichtste straf.
De regel van de parallelle kwinten is een voorbeeld van een regel met een oneindige
straf. De stembereikregel, die bepaalt dat stemmen binnen de grenzen van hun bereik
moeten blijven, is een regel met een hoge straf maar geen oneindige straf. Als het echt
niet anders kan, mag de stembereikregel in dit systeem dus overtreden worden.
Omdat men wil kunnen snoeien zodra de stra�unctie te hoog wordt, is het van belang
dat de stra�unctie monotoon is. Er zijn dus geen �beloningen� want die zouden de
stra�unctie plots weer kunnen doen dalen.
![Page 47: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/47.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 41
4.3 Genetische algoritmen
4.3.1 Wat zijn genetische algoritmen
Genetische algoritmen (GA) of evolutionaire algoritmen halen hun inspiratie in de
natuur. Ze zijn een soort simulatie van het proces van evolutie en natuurlijke selectie
van Charles Darwin (1859). Ze werden voor het eerst gebruikt in de jaren '70 door
John Holland.
In een genetisch algoritme worden de mogelijke oplossingen voor een probleem voor-
gesteld als individuen in een populatie. Net zoals in de natuur is het ene individu
beter aangepast aan zijn omgeving (��tter�) dan het andere, waardoor het proces van
natuurlijke selectie kan plaatsvinden.
Het algoritme start met een initiële populatie. Meestal zijn de individuen in deze popu-
latie willekeurig gekozen. In elke stap van het algoritme worden een aantal individuen
geselecteerd die kinderen krijgen. De kinderen ondergaan vervolgens kleine wijzigin-
gen, mutaties genoemd, en worden toegevoegd aan de populatie. Om de grootte van
de populatie in de hand te houden, worden ook een aantal individuen geselecteerd die
moeten sterven en dus uit de populatie verwijderd worden.
Dit proces wordt herhaald tot wanneer aan een zekere stopvoorwaarde voldaan is. Het
algoritme kan bvb. stoppen na een bepaald aantal stappen, of wanneer alle individuen
in de populatie aan elkaar gelijk zijn. In dat geval spreken we van convergentie.
Individuen
De individuen, door Wiggins [27, 28] ook chromosomen genoemd, stellen zoals gezegd de
mogelijke oplossingen van het probleem voor. Om de individuen voor te stellen, wordt
vaak gebruik gemaakt van een codering, bvb. een binaire string of een karakterstring.
Fitnessfunctie
De �tnessfunctie bepaalt de ��tness� van een individu door een numerieke waarde toe te
kennen aan de kwaliteit ervan. Elk individu heeft dus op elk moment zijn eigen �tness.
Elke stap van het algoritme streeft een zo hoog mogelijke �tness van de individuen in
de populatie na. In plaats van een �tnessfunctie wordt soms ook een menselijke opinie
gebruikt. In dat geval spreekt men van een interactief genetisch algoritme.
Operatoren voor mutaties en crossover
Een mutatie is een wijziging aan één individu uit de populatie. Wanneer we S de
verzameling van alle mogelijke individuen noemen, is een operator voor mutatie een
![Page 48: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/48.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 42
unaire transformatie m van de vorm
m : S → S
Crossover wordt gebruikt om meerdere individuen samen een kind te laten krijgen. Dit
gebeurt door een nieuw individu te creëren dat eigenschappen heeft van alle ouders.
In het beste geval is hierdoor dan een individu gecreëerd dat het beste van de ouders
combineert. Het aantal ouders is naar analogie met de natuur vaak twee, maar crossover
met meer dan twee ouders kan ook. Een operator voor crossover is dus een n-aire
(n ≥ 2) transformatie c van de vorm
c : S × ...× S → S
Meestal zijn er meerdere operatoren voor mutatie en voor crossover. Bij mutatie of
crossover moet dan op een of andere manier gekozen worden welke operator zal gebruikt
worden. Men kan bvb. de operator willekeurig kiezen, waarbij elke operator een eigen
kans heeft om gekozen te worden.
Selectie
De selectie van individuen is zeer belangrijk in een genetisch algoritme. Men moet de
individuen selecteren die zich zullen voortplanten en ook diegene die uit de populatie
verwijderd worden. De selectie gebeurt op basis van de �tness van de individuen. Het is
logisch om bij de selectie voorrang te geven aan de goede oplossingen voor het probleem,
dus de individuen met een hoge �tness, maar om te vermijden dat men in lokale optima
vast geraakt, is het van belang dat men ook soms minder ��tte� individuen de kans
geeft. Om deze reden gebeurt de selectie meestal op basis van kansen. Hoe groter de
�tness van een individu, hoe groter de kans dat het individu gekozen wordt.
Variaties op genetische algoritmen
Op genetische algoritmen zijn allerlei variaties mogelijk. In plaats van de kinderen aan
de populatie toe te voegen, kan men bvb. in elke stap een nieuwe populatie creëren.
In het eerste geval spreekt men van een steady-state genetisch algoritme, in het tweede
geval van een generationeel genetisch algoritme.
Een andere mogelijkheid is het eilandmodel. In dit model evolueren verschillende po-
pulaties tegelijkertijd onafhankelijk van elkaar, alsof elke populatie geïsoleerd op zijn
eigen eiland zit. Wanneer een individu toch verhuist van de ene populatie naar de
andere, noemt men dit een migratie.
Men kan ook extra natuurelementen toevoegen aan het genetisch algoritme. Men
kan bvb. de individuen een geslacht geven, waardoor crossover slechts tussen bepaalde
![Page 49: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/49.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 43
combinaties van individuen mogelijk is. Men kan ook een leeftijd toekennen aan de
individuen zodat ze in iedere stap verouderen. De leeftijd kan dan samen met de �tness
bepalen hoe lang een individu nog mag leven.
Algoritme in pseudocode
De pseudocode voor een genetisch algoritme is weergegeven in Algoritme 1.
Algoritme 1 Genetisch algoritme1: Kies startpopulatie P {kies startpopulatie, bvb. willekeurig}2: while (not stopconditie) do
3: bepaalFitness(P) {bepaal �tness voor elk individu uit populatie}4: Stel K ← creëerKinderen(P) {selecteer ouders en pas crossover toe}5: muteer(K ) {voer mutaties uit op de kinderen}6: voegIndividuenToe(K, P) {voeg de kinderen toe aan de populatie}7: verwijderIndividuen(P) {selecteer individuen die moeten sterven}8: end while
4.3.2 Genetische algoritmen voor harmonisatie
Genetische algoritmen in algoritmische compositie zijn reeds uitgebreid bestudeerd
door Wiggins et al. [19, 20, 27, 28], zowel voor harmonisatie als voor het genereren
van instrumentale solo's. In wat volgt, bekijken we hoe genetische algoritmen kunnen
gebruikt worden voor harmonisatie.
Individuen voor harmonisatie
De individuen zijn de mogelijke oplossingen voor het harmonisatieprobleem, waarbij
de ene al meer regels overtreedt dan de andere. Ze worden voorgesteld als een 4 x n
matrix van noten, met n het aantal akkoorden.
Fitnessfunctie voor harmonisatie
De �tnessfunctie kent een numerieke waarde toe aan de kwaliteit van de oplossing.
Een oplossing is van lage kwaliteit wanneer veel harmonieregels overtreden worden,
en van hogere kwaliteit wanneer weinig of geen harmonieregels overtreden worden. In
4.2.3 bespraken we reeds stra�en en heuristische regels. Ook hier kan men werken
met gewogen stra�en per overtreden regel. Eventueel kunnen daar bovenop ook nog
heuristische regels gebruikt worden om te bepalen wat er goed klinkt.
Uiteraard kan een mens nog altijd beter beoordelen wat er goed klinkt dan een compu-
ter. Interactieve genetische algoritmen, waarbij de �tnessfunctie vervangen wordt door
![Page 50: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/50.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 44
een menselijke opinie, zijn hier dus wel een optie. Toch heeft dit ook heel wat nade-
len. De gebruiker moet heel veel oplossingen evalueren, waardoor het evalueren van de
oplossingen een ernstige bottleneck zou worden. Uiteraard is de beoordeling door een
menselijke gebruiker ook altijd subjectief, en verder is er nog een psychologisch aspect.
Wanneer iemand hetzelfde muziekstuk steeds opnieuw hoort met kleine wijzigingen,
treedt er na verloop van tijd gewenning op. Hierdoor zal de gebruiker een oplossing na
een paar varianten gehoord te hebben misschien beter beoordelen dan de eerste keer
dat hij het hoorde, wat de objectiviteit van de beoordeling in het gedrang brengt.
Crossover voor harmonisatie
Wiggins [28] geeft een mogelijke methode voor crossover tussen twee oplossingen of
individuen. Beide individuen worden op hetzelfde punt in twee gesplitst, waarna het
eerste deel van het ene individu gecombineerd wordt met het laatste deel van het andere
individu. Uiteraard kunnen hierdoor fouten optreden tegen de verbindingsregels op het
punt waar gesplitst werd, maar indien het kind het beste van beide ouders combineert,
bevat het misschien minder andere fouten, waardoor de �tness toch hoger kan zijn dan
die van de ouders.
Mutaties voor harmonisatie
Er zijn heel wat mogelijkheden voor mutaties van een oplossing. We noemen er hier
enkele:
• Een akkoordnoot vervangen door een willekeurige andere noot uit het akkoord.
• Twee stemmen omwisselen.
• Twee akkoorden omwisselen.
• Alle noten uit een akkoord vervangen door noten uit een ander akkoord.
• Het eerste en laatste akkoord vervangen door het tonica-akkoord.
Merk op dat het hier niet om volledig willekeurige mutaties gaat, maar wel om pro-
bleemspeci�eke mutaties. Ze zijn zo gekozen dat ze op muzikaal gebied zinvol zijn.
De mutatieoperatoren hebben dus zelf ook domeinkennis over het probleem. We spre-
ken dan van gerichte mutaties. Gerichte mutaties maken het genetisch algoritme veel
e�ciënter.
![Page 51: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/51.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 45
4.3.3 Probleem van de overgang tussen oplossingen
Wiggins [27] kaart een probleem aan i.v.m. genetische algoritmen voor harmonisatie.
Er zijn heel veel regels in de harmonie die de kwaliteit van de oplossingen bepalen.
We kunnen deze regels ook hier als constraints beschouwen. We zagen reeds in 4.2.1
dat constraints de zoekruimte aanzienlijk verkleinen, wat goed is. Maar toch maken
constraints het leven niet noodzakelijk makkelijker, want zij stellen ons voor een nieuw
probleem: men moet van de ene geldige oplossing naar de andere kunnen gaan. In
het harmonisatieprobleem kan men bijna nooit een noot veranderen zonder dat dit
drastische gevolgen heeft op sommige of zelfs vele noten eromheen. De kwaliteit van
een oplossing is immers extreem gevoelig voor kleine veranderingen. Het gevolg is dat
wanneer men het geluk heeft een oplossing gevonden te hebben die geen enkele regel
overtreedt, het zeer moeilijk is om vanuit deze oplossing naar een andere oplossing
te gaan die ook geen enkele regel overtreedt. Daarvoor zijn speci�eke wijzigingen in
veel details tegelijkertijd nodig. Genetische algoritmen zijn hier niet goed in. De kans
dat alle nodige veranderingen op willekeurige wijze tegelijkertijd gebeuren is zo goed
als nul. Men zou natuurlijk kunnen zoeken naar crossover- en mutatieoperatoren die
nooit een geldige oplossing omzetten in een ongeldige oplossing, maar dat is absoluut
niet triviaal. Michalewicz en Fogel [15] hebben het in deze context zelfs over �wishful
thinking�.
Dit probleem is een belangrijk nadeel, maar het is niet inherent aan genetische algo-
ritmen. Eender welke heuristiek waarbij van de ene oplossing naar de andere moet
overgegaan worden, zoals bvb. lokaal zoeken, zal met dit probleem te maken krijgen.
![Page 52: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/52.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 46
4.4 Backtracking vs. genetische algoritmen
In de voorgaande secties hebben we twee methoden besproken voor harmonisatie: back-
tracking en genetische algoritmen. In dit werk hebben we backtracking verkozen boven
genetische algoritmen. In deze sectie geven we de argumenten voor en tegen beide
benaderingen.
Genetische algoritmen proberen niet alle combinaties. Dit heeft als voordeel dat ze
goed presteren in grote zoekruimten, maar dat ze niet altijd het optimum vinden.
Het is dus mogelijk dat een genetisch algoritme een oplossing vindt die fouten bevat
tegen de harmonieregels, terwijl er wel degelijk een oplossing bestond die aan alle regels
voldoet. Een backtracking-algoritme zal de foutloze oplossing steeds vinden, voor zover
die bestaat, maar heeft als nadeel dat het - op snoeien na - de hele zoekruimte moet
doorzoeken tot wanneer een oplossing gevonden is, en dus vertraagd wordt door de
grootte van de zoekruimte.
Een ander voordeel van genetische algoritmen is dat ze te allen tijde met volledige
oplossingen werken. Men kan het algoritme op om het even welk moment stoppen,
en men zal altijd volledig ingevulde oplossingen krijgen. Ook kan een genetisch algo-
ritme meerdere oplossingen retourneren, zodat de gebruiker nog keuze heeft uit een
aantal mogelijkheden. Een backtracking-algoritme werkt steeds met deeloplossingen.
Er is pas een volledige oplossing wanneer het algoritme beëindigd is. Wanneer een
backtracking-algoritme een geldige oplossing retourneert, is dit ook de enige oplossing
die het algoritme tot dan toe heeft. Door het algoritme nog verder te laten uitvoeren
kunnen wel nog oplossingen gevonden worden, maar dan is de kans groot dat deze goed
zullen lijken op de reeds gevonden oplossing, omdat waarschijnlijk enkel in de laatste
stappen dingen veranderd worden. Het is wel mogelijk een backtracking-algoritme álle
oplossingen te laten genereren, wat een genetisch algoritme niet kan.
De vaakst gehoorde kritiek op genetische algoritmen voor harmonisatie is echter dat ze
niet op een gestructureerde manier werken. Alles gebeurt als gevolg van een toevallige
wijziging en niet in functie van een doel (wat overigens in de natuur ook het geval is!).
Men zegt dat het genetische algoritmen ontbreekt aan intentie [20, 28]. Backtracking-
algoritmen zijn juist wél zeer geschikt om het probleem op een gestructureerde manier
op te lossen. Ze kunnen het probleem oplossen in een vaste volgorde, bvb. eerst de
cadenzen vastleggen, dan de baslijn invullen en ten slotte de overige stemmen invullen.
Zoals we eerder al zagen, kunnen ze ook werken volgens een harmonisatieplan dat eerst
de beschrijvingen vastlegt (zie 4.2.3).
Tabel 4.1 geeft een vergelijkend overzicht van de kenmerken van beide methoden.
Nog een indicatie in het voordeel van backtracking is het feit dat Wiggins [20, 28], die
heel wat artikels gepubliceerd heeft over genetische algoritmen voor harmonisatie, zelf
![Page 53: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/53.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 47
Genetisch algoritmeBacktracking
Kan goed om met grote zoekruimtenUitvoeringstijd is sterk afhankelijk van
de grootte van de zoekruimte
Vindt meestal het optimum nietVindt een oplossing die aan alle regels
voldoet (als er één is)
Kan altijd een (suboptimale) oplossing
geven, ook wanneer het algoritme
onderbroken wordt
Kan pas een oplossing geven na
beëindigen van het algoritme
Kan meerdere oplossingen geven. Geeft meestal maar één oplossing
Is niet in staat alle oplossingen te
genereren.
Kan indien gewenst alle oplossingen
genereren
Werkt ongestructureerd met toevallige
wijzigingen zonder intentieKan werken volgens een zoekplan
Tabel 4.1: Vergelijking genetische algoritmen en backtracking
concludeert dat backtracking een betere methode is. Wiggins deed namelijk een be-
langrijk experiment. Hij liet dezelfde opgaven oplossen door een genetisch algoritme en
door een backtracking-algoritme. Vervolgens liet hij de oplossing van het backtracking-
algoritme evalueren door de �tnessfunctie van het genetisch algoritme. Beide systemen
gebruikten dezelfde regels en hadden dus dezelfde domeinkennis. Het resultaat was dat
de oplossingen die het backtracking-algoritme genereerde altijd beter waren, soms met
een verhouding tot 40:1 in de waarde van de �tnessfunctie!
De betere kwaliteit van de resultaten in combinatie met de mogelijkheid om het pro-
bleem op een gestructureerde manier op te lossen, waren van doorslaggevend belang
bij de keuze voor backtracking in dit werk.
![Page 54: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/54.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 48
4.5 Andere methoden
Naast genetische algoritmen en backtracking-algoritmen zijn er nog een aantal andere
benaderingen die reeds e�ectief bleken te zijn.
Een veelbelovende methode waar reeds experimenten mee werden gedaan, zijn arti�-
cieel intelligente systemen die leren. Dergelijke systemen hebben op voorhand geen
domeinkennis, maar leiden de domeinkennis zelf af uit een aantal voorbeelden. Hild et
al. werkten een dergelijke methode uit op basis van neurale netwerken.
Verder vermelden we ook nog de stochastische processen. Een stochastisch proces is een
proces waarbij de beslissingen op willekeurige wijze worden genomen. Het gedrag van
een stochastisch proces is iedere keer anders, en dus niet voorspelbaar. Stochastische
processen voor muziek maken geen gebruik van regels. Wel wordt vaak gebruik gemaakt
van Markov-ketens. Een Markov-keten is een rij van stochastische variabelen, waarbij
men de mogelijke waarden voor de stochastische variabelen toestanden noemt. De
kans dat naar een bepaalde toestand wordt overgegaan, hangt enkel af van de vorige
toestand, en niet van de andere toestanden uit het verleden.
In muziek kan men bvb. een Markov-keten opbouwen voor melodieën door bij een
aantal muziekstukken na te gaan hoe vaak elke noot gevolgd wordt door elke andere
noot. Men kan bvb. vaststellen dat do in 10 % van de gevallen gevolgd wordt door do,
in 20 % van de gevallen door re, in 15 % van de gevallen door mi enz. Bij het genereren
van een melodie zal dan op basis van die informatie uit de vorige noot telkens de
volgende noot afgeleid worden. De volgende noot wordt willekeurig gekozen, maar met
gewogen kansen die afhangen van de percentages uit de verworven informatie. Om
hier goede resultaten te krijgen, moeten uiteraard eerst zoveel mogelijk muziekstukken
geanalyseerd worden.
Een vaak gehoorde kritiek op stochastische processen in muziek is echter dat men
muziek helemaal niet als een Markov-keten mag zien. Stel bvb. dat we in plaats van de
melodie de geluidssterkte als een Markov-keten zouden modelleren. Wanneer een reeks
progressief luider wordende noten elkaar opvolgen, is de kans in de realiteit zeer groot
dat er een nog luidere noot op zal volgen. We zitten dan in een crescendo (geleidelijke
overgang van zacht naar hard). De Markov-keten zal hier echter geen rekening mee
houden, en enkel kijken naar de geluidssterkte van de laatste noot. Wanneer in de
voorbeeldmuziekstukken dan toevallig die geluidssterkte vaak gevolgd werd door een
stillere, is de kans reëel dat een stillere geluidssterkte als opvolger gekozen wordt.
Stochastische processen houden m.a.w. onvoldoende rekening met de muzikale context
waarin men zich bevindt.
Een gelijkaardige methode vinden we bij Hiller en Isaacson in 1958. Dit was één van
de eerste pogingen tot algoritmische compositie met de computer. Zij modelleerden
het probleem als een eindige toestandsautomaat. Bij deze methode werkt men met een
![Page 55: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/55.jpg)
HOOFDSTUK 4. METHODEN VOOR ALGORITMISCHE COMPOSITIE 49
eindig aantal mogelijke toestanden (getekend als toppen in een graaf) en een aantal
geldige overgangen tussen toestanden (getekend als bogen die de toppen verbinden).
Het resultaat is niet alleen een harmonisatie, maar een volledige compositie, die de
Illiac suite werd gedoopt.
4.6 Onze strategie
De strategie die wij hanteren in Ramo maakt onder andere gebruik van een aantal
ideeën uit de voorgaande secties. Het probleem wordt opgevat als een CSP dat opge-
lost wordt door een backtracking-algoritme. Om het aantal te proberen beschrijvingen
en noten te beperken, worden de mogelijke beschrijvingen en mogelijke noten per be-
schrijving eerst gegenereerd door productieregels. Het backtracking-algoritme zoekt
altijd eerst naar een geldige invulling van een cel die aan de akkoordregels voldoet, en
controleert dan pas de regels die op meer cellen betrekking hebben. De testen in het
backtracking-algoritme gebeuren door controleregels die nagaan of de oplossing aan de
harmonieregels voldoet. Optioneel kan ook gebruik gemaakt worden van heuristische
regels. Deze heuristische regels proberen de meest muzikaal verantwoorde keuze te
nemen wanneer er meerdere geldige mogelijkheden zijn. De heuristische regels houden
ook rekening met gekende akkoordprogressies.
De controleregels, productieregels, heuristische regels en het backtracking-algoritme
worden respectievelijk verder uitgewerkt in Hoofdstuk 5, Hoofdstuk 6, Hoofdstuk 7 en
Hoofdstuk 8.
![Page 56: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/56.jpg)
Hoofdstuk 5
Controleregels
5.1 Vereisten voor het regelsysteem
Het gekozen regelsysteem werd oorspronkelijk geschreven met als doel het louter chec-
ken van één muziekblad. In dit werk is het echter de bedoeling dat het regelsysteem
gebruikt wordt in backtracking-algoritmen. Het regelsysteem zal dus op een totaal
andere manier gebruikt worden, waardoor er toch nog een aantal aanpassingen nodig
waren. In wat volgt, beschrijven we eerst de vereisten waaraan het regelsysteem moet
voldoen, en toetsen we vervolgens de bruikbaarheid van de verschillende soorten regels
aan deze vereisten. Waar nodig, beschrijven we ook de gedane aanpassingen. De de-
tails van de backtracking-algoritmen zullen uiteengezet worden in Hoofdstuk 8. Voor
dit hoofdstuk is het enkel van belang te weten dat het muziekblad van links naar rechts
wordt ingevuld, en de noten in de cellen van onder naar boven.
Figuur 5.1: Volgorde van invullen van de noten in het muziekblad
Wanneer het regelsysteem voor zijn oorspronkelijk doel gebruikt wordt, namelijk het
detecteren van de fouten in een muziekblad, wordt het hele muziekblad in één keer
geëvalueerd en moet alles slechts 1x gecheckt worden. Het muziekblad wordt dan ook
verondersteld volledig ingevuld te zijn. Als we het regelsysteem echter gebruiken in een
backtracking-algoritme, worden er voortdurend kleine wijzigingen aangebracht aan het
50
![Page 57: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/57.jpg)
HOOFDSTUK 5. CONTROLEREGELS 51
muziekblad (bvb. het toevoegen van een noot of het wijzigen van een noot) die telkens
opnieuw moeten gecontroleerd worden.
Niet alleen is het belangrijk dat dit snel gaat, maar het is ook belangrijk dat er niet
méér gecontroleerd wordt dan strikt nodig is. Het zou bvb. geen goed idee zijn om
wanneer één noot veranderd is, opnieuw het hele muziekblad te controleren. Stel bvb.
ook dat cel 8 zonet een invulling gekregen heeft, en er gecontroleerd wordt op parallelle
kwinten. De regel voor parallelle kwinten moet dan enkel de verbinding tussen cel
7 en cel 8 checken (de verbinding tussen cel 8 en cel 9 moet niet gecheckt worden
omdat wegens de gede�nieerde volgorde cel 9 dan nog geen invulling heeft). Het is niet
nodig dat de regel voor parallelle kwinten na de wijziging in cel 8 ook de verbinding
tussen cellen 3 en 4 controleert, want in cellen 3 en 4 kan helemaal geen parallelle
kwint ontstaan enkel en alleen door een wijziging in cel 8. Per wijziging mag dus enkel
datgene gecontroleerd worden dat door die wijziging kan beïnvloed zijn.
Verder is het ook belangrijk dat het regelsysteem moet kunnen omgaan met onvolledige
informatie. Dit geldt zowel op muziekbladniveau als op celniveau. Op muziekblad-
niveau moeten we de verbindingen tussen cellen kunnen controleren zonder dat alle
volgende cellen ook al ingevuld zijn. Op celniveau willen we fouten als stemkruising of
een te grote afstand tussen stemmen al kunnen detecteren zonder dat alle noten in de
stem al ingevuld zijn. In Figuur 5.2 zien we dat de tenor (stok naar boven) lager ligt
dan de bas (stok naar beneden). Hier kan dus een stemkruising gedetecteerd worden,
ook al zijn de alt en sopraan nog niet ingevuld.
Figuur 5.2: Stemkruising van tenor en bas
De reden waarom het regelsysteem moet kunnen omgaan met onvolledige informatie,
is dat we fouten zo vroeg mogelijk willen detecteren. Het zou niet e�ciënt zijn als een
muziekblad eerst volledig moet ingevuld worden alvorens er kan gecontroleerd worden.
Integendeel, het controleren moet al beginnen bij het invullen van de eerste cel.
Omdat we fouten zo vroeg mogelijk willen detecteren, verdienen ook regels die op meer
dan 2 cellen betrekking hebben de nodige aandacht. Soms kan men in de eerste 2 (of
meer) cellen al zien dat de verbinding verkeerd zal zijn. Kwartsextakkoorden die op een
lichte tel komen zijn hiervan een belangrijk voorbeeld. Een kwartsextakkoord dat start
![Page 58: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/58.jpg)
HOOFDSTUK 5. CONTROLEREGELS 52
op een lichte tel moet ofwel als wisselakkoord ofwel als doorgangsakkoord fungeren, en
maakt daarbij deel uit van een geheel van drie cellen (zie 2.5.4). De bas blijft daarbij
liggen, of stijgt of daalt in secunden. Een andere mogelijkheid is er niet. Ondanks
het feit dat een kwartsextakkoord op een lichte tel deel uitmaakt van een geheel van 3
cellen, kunnen we over de 2 cellen in Figuur 5.3 nu al zeggen dat de verbinding zeker
ongeldig zal zijn. Het regelsysteem zou dit dus ook moeten detecteren.
Figuur 5.3: Kwartsextverbinding die al zeker ongeldig is
We kunnen de vereisten om het regelsysteem op een e�ciënte manier voor backtracking
bruikbaar te maken als volgt formuleren:
1. Akkoordregels moeten waar nodig onvolledig ingevulde cellen kunnen checken.
2. Alle regels moeten een onvolledig ingevuld muziekblad kunnen checken.
3. Na een wijziging moet het mogelijk zijn enkel die noten, cellen of verbindingen
te checken die door die wijziging kunnen beïnvloed zijn.
4. Fouten moeten zo vroeg mogelijk gedetecteerd worden.
In de volgende sectie bespreken we de aanpassingen die gedaan werden aan het regel-
systeem opdat het aan deze vereisten zou voldoen.
5.2 Bruikbaarheid van de verschillende soorten regels
Er zijn vijf soorten regels in het oorspronkelijke regelsysteem: akkoordregels, melo-
dieregels, tweecellenregels, driecellenregels en muziekbladregels. Elk heeft zijn eigen
interface waarmee de regel geëvalueerd wordt. Merk op dat de regels hier anders inge-
deeld zijn dan in 2.5. Hier gaat het over de manier waarop de regels geïmplementeerd
zijn, terwijl het in 2.5 over muziektheorie gaat. In de volgende secties bekijken we voor
elk van deze soorten regels of ze aan de vereisten voldoen, en indien dat niet het geval
is, hoe we ze kunnen bruikbaar maken voor onze doelstellingen.
![Page 59: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/59.jpg)
HOOFDSTUK 5. CONTROLEREGELS 53
5.2.1 Celregels
Regels van het type Celregel worden gebruikt voor de implementatie van de akkoord-
regels uit 2.5.1. Ze worden geëvalueerd door een methode uit te voeren van de vorm
boolean check(Cel cel, List<Annotatie> annotaties);
De parameter annotaties is een lijst waaraan de informatie over een eventuele overtre-
ding (een object van het type Annotatie) moet toegevoegd worden. Deze parameter
is in deze context van minder belang. Ook de regels van de andere types hebben deze
parameter, we komen erop terug in 5.3.
Via de parameter cel wordt juist één cel doorgegeven. Aan vereisten 2 en 3 kan dus
makkelijk voldaan worden, het volstaat de regel enkel op te roepen voor de relevante
cellen.
Voorwaarde 1 is echter niet voldaan. De check methode controleert namelijk telkens
eerst of alle noten wel ingevuld zijn. Indien niet, gaat de check niet door en wordt
de cel gewoon goed gerekend. Pas wanneer alle noten ingevuld zijn, kan er gecon-
troleerd worden. Nochtans zijn er wel degelijk celregels, zoals de eerder aangehaalde
stemkruisingregel, die al vroeger fouten zouden kunnen detecteren. Om hieraan tege-
moet te komen, werd voor sommige celregels een nieuwe implementatie voorzien die
het mogelijk maakt dat onvolledige cellen gecontroleerd worden. Deze implementaties
zijn te vinden in de package ramo.solve.regels.akkoordregels. Door deze wijziging
worden fouten ook vroeger gedetecteerd, en is dus ook voorwaarde 4 voldaan.
In het oorspronkelijke regelsysteem is er ook een regel Vierstemmig van het type
Celregel die een cel fout rekent wanneer niet alle 4 de stemmen ingevuld zijn. De stu-
dent zou dan zijn opgave niet volledig afgewerkt hebben. Uiteraard doet een dergelijke
regel hier meer kwaad dan goed, en laten we deze dus achterwege. Wegens de volgorde
van het invullen van de noten (zie Figuur 5.1) zal elke stem in elke cel zeker ingevuld
worden, en bestaat er dus geen risico op onvolledige cellen.
5.2.2 Melodieregels
Regels van het type Melodieregel implementeren de melodieregels uit 2.5.2. De me-
thode die een dergelijke regel evalueert, is van de vorm
boolean check(List<Cel> melodie, int stem, List<Annotatie> annotaties);
Omdat melodieregels stem per stem geëvalueerd worden, geeft de parameter stem aan
voor welke stem de regel moet geëvalueerd worden. De parameter melodie is de lijst
met cellen waarvoor de gegeven stem moet geëvalueerd worden.
![Page 60: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/60.jpg)
HOOFDSTUK 5. CONTROLEREGELS 54
Bij een melodieregel hoort ook altijd een methode int getMelodieGrootte(); die
aangeeft hoe groot de lijst melodie moet zijn.
Voorwaarde 1 geldt enkel voor akkoordregels dus is hier niet relevant. Voorwaarden 2
en 3 zijn net zoals bij de celregels voldaan: men hoeft nooit het volledige muziekblad
te evalueren, maar wel enkel de relevante cellen.
Voor bijna alle melodieregels is de melodiegrootte gelijk aan 2. Het gaat dan om
melodieregels zoals de vermeerderde secunde en tritonus die verboden zijn, de leidtoon
die naar de tonica moet gaan... Er is bij dergelijke regels geen manier om vroeger de
fout te detecteren dan door beide cellen te evalueren. Voorwaarde 4 is in dat geval dus
voldaan.
De regel OpeenvolgendInterval is met een melodiegrootte van 3 de enige regel met
een melodiegrootte die groter is dan 2. Deze regel bepaalt dat een gegeven interval
(op te geven als parameter) niet 2x na elkaar stijgend of dalend mag voorkomen in
dezelfde stem. Een instantie van deze regel is bvb. dat er geen twee stijgende of twee
dalende kwarten na elkaar mogen voorkomen in dezelfde stem. Als we bij deze regel
enkel de eerste twee cellen evalueren, is er geen manier om al te weten dat hetzelfde
interval 2x na elkaar zal voorkomen. We kunnen dus niets doen om de fout al vroeger
te detecteren. De fout wordt dus wel degelijk zo vroeg mogelijk gedetecteerd, waardoor
voorwaarde 4 voldaan is.
We kunnen besluiten dat de melodieregels aan alle voorwaarden voldoen, en we ze
ongewijzigd kunnen gebruiken.
5.2.3 Tweecellenregels
Regels van het type Tweecellenregel worden gebruikt om de verbindingsregels uit
2.5.3 te implementeren. Ze worden geëvalueerd door een methode uit te voeren van de
vorm
boolean check(Cel cel1, Cel cel2, List<Annotatie> annotaties);
De parameters cel1 en cel2 zijn de cellen waarvoor men de verbinding wil evalueren.
Ook hier is het mogelijk enkel de relevante cellen door te geven, en wordt de fout ook
zo vroeg mogelijk gedetecteerd. De regel bekijkt de beide cellen om na te gaan of de
verbinding klopt. Maar het is sowieso niet mogelijk om op basis van één cel al te zeggen
of de verbinding correct zal zijn. De fout zou dus niet vroeger kunnen gedetecteerd
worden dan nu al het geval is.
Alle voorwaarden zijn dus voldaan voor de tweecellenregels.
![Page 61: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/61.jpg)
HOOFDSTUK 5. CONTROLEREGELS 55
5.2.4 Driecellenregels
Regels van het type Driecellenregel zijn analoog aan de tweecellenregels, maar dan
met 3 cellen als input. De check methode ziet er als volgt uit:
boolean check(Cel cel1, Cel cel2, Cel cel3, List<Annotatie>
annotaties);
De regel Accentparallellen is de enige regel van dit type. Deze regel bekijkt de 3
cellen, maar ook bij deze regel zijn de 3 cellen noodzakelijk om een besluit te kun-
nen vormen of de regel voldaan is of niet, en wordt de fout dus zo vroeg mogelijk
gedetecteerd. Alle voorwaarden zijn dus voldaan.
5.2.5 Muziekbladregels
Regels van het type Muziekbladregel controleren een volledig muziekblad in één keer.
Ze hebben als checkmethode
boolean check(Muziekblad blad, List<Annotatie> annotaties);
Dit is absoluut niet wat we nodig hebben, geen enkele voorwaarde is voldaan. De
muziekbladregels worden in dit werk dan ook niet gebruikt.
Het betreft de regels voor kwartsextakkoorden en gesyncopeerde harmonieën (zie 2.5.4)
en de regels die bepalen dat het eerste en laatste akkoord het tonica-akkoord in
grondligging moeten zijn. Het is nochtans mogelijk deze regels op een meer lokale
manier te evalueren, zonder daarom een volledig muziekblad te evalueren. Daarom
werd voor de regels in verband met kwartsextakkoorden en gesyncopeerde harmonieën
een nieuwe implementatie voorzien. Deze implementatie is te vinden in de package
ramo.solve.regels.variabeleLengteRegels. Het zijn immers regels waarvan niet
op voorhand geweten is op hoeveel cellen ze betrekking zullen hebben, waardoor ze niet
als bvb. een twee- of driecellenregel of melodieregel kunnen geïmplementeerd worden.
De regels in verband met het tonica-akkoord aan het begin en aan het einde werden
verhuisd naar de productieregels (zie Hoofdstuk 6).
5.3 Alle regels checken?
Tot slot is er nog een belangrijk verschil tussen het evalueren van een muziekblad om
de fouten aan de student mee te delen, en het evalueren met het oog op backtracking.
In het eerste geval moeten álle fouten gedetecteerd worden. Men moet dus alle regels
evalueren, en elke regel voegt de informatie over de fout toe aan de lijst annotaties.
![Page 62: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/62.jpg)
HOOFDSTUK 5. CONTROLEREGELS 56
Voor backtracking is het echter niet nodig alle fouten te kennen. Van zodra er één
fout gevonden wordt, is de oplossing sowieso al incorrect. Zodra één fout is gevonden,
zullen we dan ook de volgende regels niet meer evalueren, wat de snelheid ten goede
komt.
Verder is de informatie over de aard van de fouten vooral van pedagogisch belang,
maar is dit voor het backtracking-algoritme niet noodzakelijk. We zullen dan ook geen
gebruik maken van de lijst annotaties.
![Page 63: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/63.jpg)
Hoofdstuk 6
Productieregels
6.1 Situering
Naast de controleregels hebben we een nieuwe soort regels toegevoegd aan Ramo: de
productieregels . Een productieregel is een �actieve regel� die, gegeven een cel, een reeks
mogelijkheden genereert die aan de regel voldoen. De gegenereerde mogelijkheden zijn
typisch een lijst van mogelijke beschrijvingen voor een cel of een lijst van mogelijke
noten voor een bepaalde cel en stem. Het verschil met een controleregel dient hier
duidelijk onderstreept te worden. Een productieregel genereert zélf mogelijke correcte
invullingen, terwijl een controleregel voor een reeds ingevulde cel nagaat of de regel
voldaan is.
Door het gebruik van productieregels wordt het algoritme veel e�ciënter. Enerzijds
verkleint de zoekruimte erdoor. Er worden immers enkel zinvolle mogelijkheden gepro-
beerd in plaats van alle mogelijkheden. Anderzijds moeten er ook minder controleregels
gecontroleerd worden. Indien een productieregel bvb. garandeert dat een akkoord geen
akkoordvreemde noten bevat, moet dit later ook niet meer gecontroleerd worden door
de controleregels.
In Ramo zijn er een aantal soorten productieregels. Een zeer belangrijke soort zijn de
productieregels voor volledige kwintakkoorden en septiemakkoorden. Deze genereren
voor een cel alle mogelijke beschrijvingen, rekening houdend met de ingevulde noten.
Hierbij wordt verondersteld dat het akkoord volledig moet zijn, d.w.z. dat er geen ak-
koordnoten mogen ontbreken in de cel. Bij vierklanken in grondligging mag volgens de
literatuur de kwint echter ontbreken. In dit geval is het akkoord dus niet volledig. Om
te vermijden dat deze akkoorden uit de boot zouden vallen, is er ook een productieregel
voorzien voor onvolledige septiemakkoorden.
Verder zijn er ook nog de productieregels voor noten. Deze genereren voor een bepaalde
beschrijving en stem de lijst met mogelijke noten die in die stem kunnen ingevuld
worden. Daarbij wordt ook rekening gehouden met het stembereik. Ten slotte zijn er
57
![Page 64: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/64.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 58
nog de productieregels in verband met de tonica, die bepalen of er al dan niet moet
begonnen en geëindigd worden met het tonica-akkoord en/of de tonicanoot.
Aan Ramo werd een settingsvenster toegevoegd waarin de gebruiker kan instellen welke
productieregels er gebruikt worden. Figuur 6.1 toont een screenshot van dit settings-
venster. We zullen de verschillende soorten productieregels in de volgende paragrafen
uitgebreid toelichten.
Figuur 6.1: Settings in Ramo voor de productieregels
6.2 Productieregels voor volledige kwintakkoorden en
septiemakkoorden
6.2.1 Doel
De productieregels voor volledige kwintakkoorden en septiemakkoorden hebben als
input een cel, en genereren een lijst met mogelijke beschrijvingen voor die cel als output.
Er is een variant voor kwintakkoorden en een variant voor septiemakkoorden. In de
implementatie volstaat het de polyfonie, 3 of 4, door te geven als parameter om aan te
geven of het over kwintakkoorden of septiemakkoorden gaat.
Precondities
De precondities zijn de condities waaraan voldaan moet zijn voordat deze productie-
regels uitgevoerd worden op een cel:
![Page 65: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/65.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 59
1. Indien beide becijferingen ingevuld zijn, moeten deze gelijk zijn aan elkaar.
2. Indien beide toonaarden ingevuld zijn en één toontrap is gegeven, dan moeten
alle noten uit het akkoord op deze toontrap in beide toonaarden voorkomen.
3. Indien beide toonaarden ingevuld zijn, en beide toontrappen zijn gegeven, dan
moet het akkoord op de eerste gegeven toontrap in de eerste toonaard dezelfde
noten bevatten als het akkoord op de tweede gegeven toontrap in de tweede
toonaard.
Het gaat hier dus om het elimineren van cellen die inconsistent zijn met zichzelf. Als
één van de precondities niet voldaan is, worden de productieregels niet uitgevoerd. De
gegenereerde set beschrijvingen is dan een lege verzameling.
Merk op dat het consistent zijn van de eventuele ingevulde noten met de eventuele
gegeven becijfering geen preconditie is. Het algoritme dat hiervoor nodig zou zijn,
zou ons te ver leiden. Indien een dergelijke inconsistentie optreedt, zal dit door de
productieregels zelf gedetecteerd worden en zullen zij geen enkele becijfering genereren.
Postcondities
De postcondities zijn de condities waaraan altijd voldaan is na uitvoeren van deze
productieregels:
1. De cel bevat geen akkoordvreemde noten.
2. Er zijn voldoende vrije plaatsen in de cel om het akkoord te kunnen vervolledigen.
3. De beschrijving is realiseerbaar in de cel.
Met deze laatste postconditie wordt bedoeld dat de noot die volgens de becijfering in
de bas moet komen daar ook daadwerkelijk kan geplaatst worden, en er niet bvb. al
een andere basnoot ingevuld is.
Deze postcondities hoeven dus niet meer gecheckt te worden, en kunnen bij de controle-
regels achterwege gelaten worden.
6.2.2 Vaststellingen
Aan de hand van voorbeelden komen we tot een aantal vaststellingen waarmee rekening
zal moeten gehouden worden in het algoritme om de beschrijvingen voor een cel vast te
leggen. Het aantal voorbeelden kan misschien wat veel lijken, maar elk voorbeeld heeft
zijn eigen eigenaardigheden die van belang zijn voor het algoritme. Voor de eenvoud
zijn alle voorbeelden in do groot.
![Page 66: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/66.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 60
Voorbeeld 1: enkel basnoot gegeven
Figuur 6.2: Voorbeeld met basnoot gegeven
Een veel voorkomende harmonie-oefening is een oefening waarbij enkel de baslijn ge-
geven is. Figuur 6.2 zou een cel uit een dergelijke opgave kunnen zijn. We willen de
mogelijke beschrijvingen voor deze cel bepalen.
We bekijken eerst van welke drieklanken deze basnoot deel kan uitmaken. Een fa komt
voor in drie drieklanken, namelijk de drieklanken op toontrap IV (fa-la-do), II (re-fa-
la), en VII (si-re-fa). Echter, aangezien we de basnoot al kennen, is per toontrap maar
één omkering mogelijk. We bekomen dus de volgende becijferingen:
5IV
,6II
,64
V II
Bij de vierklanken hebben we één toontrap extra die mogelijk is. De mogelijke vier-
klanken zijn die op toontrap IV (fa-la-do-mi), II (re-fa-la-do), VII (si-re-fa-la) en V
(sol-si-re-fa). Ook hier is per toontrap maar één omkering mogelijk, en bekomen we
de volgende becijferingen:
7IV
,65II
,
43
V II
,2V
Conclusies:
• Voor één basnoot zijn verschillende toontrappen mogelijk.
• Voor een basnoot zijn per toontrap hoogstens twee becijferingen mogelijk, name-
lijk een drieklank en eventueel een vierklank, aangezien de basnoot de omkering
voor een bepaalde graad ondubbelzinnig vastlegt.
![Page 67: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/67.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 61
Figuur 6.3: Voorbeeld met één niet-basnoot gegeven
Voorbeeld 2: één niet-basnoot gegeven
Een ander type harmonie-oefening, is de oefening waarbij enkel de sopraanstem gegeven
is. Ook hier moeten we een beschrijving bepalen. Figuur 6.3 is een voorbeeld van een
cel uit een dergelijke oefening. Ook hier willen we de mogelijke beschrijvingen bepalen.
Analoge redeneringen gelden voor cellen waarbij een noot uit een andere niet-basstem
gegeven is.
We zien opnieuw een noot fa. Net zoals in het vorige voorbeeld kan de noot fa deel
uitmaken van de drieklanken op drie toontrappen: IV (fa-la-do), II (re-fa-la), en VII
(si-re-fa). Het verschil met het vorige voorbeeld, is dat hier de basnoot nog niet vastligt,
en dus voor elke toontrap elke omkering nog mogelijk is. Er zijn dus veel meer mogelijke
beschrijvingen:
5IV
,6
IV,
64
IV
,5II
,6II
,64II
,5
V II,
6V II
,64
V II
Bij de vierklanken ligt het anders. De mogelijke vierklanken zijn nog steeds die op
toontrap IV (fa-la-do-mi), II (re-fa-la-do), VII (si-re-fa-la) en V (sol-si-re-fa). Hoewel
de basnoot hier nog niet vastligt, zijn toch niet alle omkeringen mogelijk. Anders dan
bij een drieklank, moet in elk van de vier stemmen een verschillende noot komen om
de vierklank volledig te kunnen realiseren. Bvb. voor de vierklank op toontrap II (re-
fa-la-do) kan in de bas nog een re, la of do komen, maar geen fa aangezien de noot fa
dan 2x zou voorkomen en de plaats zou innemen van een andere noot. We bekomen
dus de volgende beschrijvingen:
65
IV
,
43
IV
,2
IV,
7II
,43II
,2II
,7
V II,
65
V II
,2
V II,
7V
,65V
,
43V
Conclusies:
• Voor één niet-basnoot zijn, net zoals bij een basnoot, verschillende toontrappen
mogelijk.
![Page 68: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/68.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 62
• Voor een niet-basnoot zijn bij de drieklanken per toontrap alle omkeringen mo-
gelijk.
• Voor een niet-basnoot zijn bij de vierklanken per toontrap niet alle omkeringen
mogelijk. De omkering waarbij de gegeven noot in de bas zou terechtkomen is
namelijk niet mogelijk.
Voorbeeld 3: meerdere noten gegeven
Figuur 6.4: Voorbeeld met twee noten gegeven
In Ramo is het ook mogelijk dat meerdere noten in een cel gegeven zijn, dus ook in
dit geval moeten de becijferingen kunnen bepaald worden. In Figuur 6.4 zien we een
voorbeeld waar twee noten ingevuld zijn, waaronder de basnoot.
Bij de drieklanken zijn we nu heel wat beperkter dan in de vorige voorbeelden. De
combinatie do-sol kan slechts in één drieklank voorkomen, en dat is in de drieklank op
toontrap I (do-mi-sol). Bovendien kennen we ook de becijfering, want do staat in de
bas. Het akkoord ligt dus in grondligging. Er is dus maar één mogelijke beschrijving:
5I
Bij de vierklanken zijn er iets meer mogelijkheden. De combinatie do-sol komt voor in
de vierklanken op toontrappen I (do-mi-sol-si) en VI (la-do-mi-sol). Ook hier liggen
de becijferingen al vast doordat de basnoot ingevuld is. We bekomen twee mogelijke
beschrijvingen:
7I
,65
V I
Conclusie:
• Wanneer meerdere noten gegeven zijn, worden de mogelijke drieklanken en vier-
klanken beperkt tot diegene waarin alle gegeven noten voorkomen. Dit kan het
aantal mogelijkheden aanzienlijk reduceren.
![Page 69: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/69.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 63
Figuur 6.5: Voorbeeld met twee gelijke noten gegeven
Voorbeeld 4: twee gelijke noten gegeven
Tot slot bekijken we nog een voorbeeld waarbij twee gelijke noten gegeven zijn. In
Figuur 6.5 zien we een cel waarbij zowel in de alt als in de tenor een do staat. Op
het eerste zicht lijkt er misschien niet zoveel aan de hand, maar ook dit legt extra
beperkingen op.
Bij de drieklanken zijn een aantal toontrappen mogelijk: I (do-mi-sol) , VI (la-do-mi)
en IV (fa-la-do). Maar om de cel te vervolledigen tot een drieklank moeten er nog
twee nieuwe noten ingevuld worden. Eén van beide zal dus onvermijdelijk in de bas
terechtkomen, waardoor er dus geen do in de bas kan staan en de mogelijkheden voor
de omkeringen beperkt worden zoals in voorbeeld 2. De mogelijke beschrijvingen zijn:
6I,
64I
,5
V I,
64
V I
,5
IV,
6IV
Vierklanken zijn hier niet mogelijk, of tenminste niet als we veronderstellen dat de
vierklank volledig moet zijn (zie 6.3 voor een uitzondering hierop).
Conclusie:
• Wanneer dezelfde noot meerdere keren voorkomt, legt dit ook bij de drieklanken
beperkingen op aan de mogelijke becijferingen.
6.2.3 Algoritme
Het algoritme om de beschrijvingen te genereren voor een cel verloopt in 3 stappen.
Eerst wordt de minimale tertsensequentie (zie 6.2.4) berekend voor de noten die in-
gevuld zijn in de cel. Hiervan gebruik makend worden vervolgens de mogelijke toon-
trappen berekend, om ten slotte de mogelijke omkeringen te bepalen. In de volgende
secties zetten we elk van deze drie stappen uiteen.
![Page 70: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/70.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 64
6.2.4 Minimale tertsensequentie bepalen
Voor een gegeven set noten S en een gegeven toonaard T noemen we de minimale
tertsensequentie (MTS) de kortste opeenvolging van tertsen in T die alle noten van
S bevat.
Deze minimale tertsensequentie is van belang omdat ze later zal gebruikt worden als
basis om akkoorden mee op te bouwen. De minimale tertsensequentie zal dan ook de
input zijn voor het algoritme dat de mogelijke toontrappen berekent.
We bekijken eerst een voorbeeld. Stel S = {do, mi, fa} , T = do groot.
Er zijn meerdere opeenvolgingen van tertsen te vinden in do groot die alle noten van
S bevatten:
• do - mi - sol - si - re - fa
• mi - sol - si - re - fa - la - do
• fa - la - do - mi
De laatste optie bevat duidelijk het kleinste aantal noten. Dit is dan ook de minimale
tertsensequentie voor S in do groot.
Figuur 6.6: Bepalen van kortste deellijst in een circulaire lijst
Voor een gegeven toonladder kunnen we een lijst L van tertsen opbouwen, te beginnen
bij de grondnoot. Deze lijst is 7 noten lang en bevat alle noten uit de toonladder. Het
bepalen van de minimale tertsensequentie voor een set S komt dan neer op het bepalen
![Page 71: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/71.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 65
van de kortste deellijst in L die alle noten uit S bevat, waarbij L als een circulaire lijst
beschouwd wordt. Figuur 6.6 illustreert dit idee. Deze kortste deellijst wordt bepaald
door voor elke noot in S zijn index in L te bepalen, en vervolgens uit deze indices de
beste startindex te bepalen. Dit is beschreven in Algoritme 2. De implementatie van
dit algoritme is te vinden in de klasse MinimalThirdSequenceGenerator.
Algoritme 2 Bepalen van minimale tertsensequentieParameters: set gezochteNoten, toonaard keyReturns: minimale tertsensequentie1: Stel tertsenInToonladder [0] ← tonica van key2: for i from 1 to 6 do
3: Stel tertsenInToonladder [i ]← tertsenInToonladder [i−1] + terts in key4: end for
5: Stel index ← 06: for i from 0 to 6 do
7: if gezochteNoten bevat tertsenInToonladder [i ] then
8: Stel indices [index++] ← i9: end if
10: end for
11: Stel startIndex ← indices [0]12: Stel minimumAantalNoten ← indices [indices.length−1] − indices [0] + 113: for i from 1 to indices.length− 1 do
14: Stel aantalNoten ← 8 − (indices [i]−indices [i−1])15: if (aantalNoten < minimumAantalNoten) then
16: Stel minimumAantalNoten ← aantalNoten17: Stel startIndex ← indices [i ]18: end if
19: end for
20: for i from 0 to minimumAantalNoten−1 do
21: Stel MTS [i ] ← tertsenInToonladder [(startIndex + i)mod7]22: end for
23: return MTS
6.2.5 Toontrappen genereren
Het genereren van toontrappen is gebaseerd op het idee dat de minimale tertsense-
quentie zeker moet aanwezig zijn in het akkoord, en dat we de MTS kunnen uitbreiden
met één of meer tertsen vooraan en/of achteraan om zo tot het juiste aantal noten te
komen. De reden waarom de MTS in het akkoord moet aanwezig zijn, is dat akkoor-
den een opeenstapeling zijn van tertsen, en dat alle noten die in de cel staan ook in
het akkoord moeten voorkomen. Aangezien de minimale tertsensequentie de kleinste
opeenstapeling is van tertsen die alle ingevulde noten bevat, moet die dus ook in het
akkoord voorkomen.
![Page 72: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/72.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 66
We beschouwen eerst het voorbeeld in Figuur 6.7. De toonaard is do groot en we willen
de toontrappen bepalen voor akkoorden met drie noten. De polyfonie is dus 3.
Figuur 6.7: Voorbeeld met MTS {do, mi} en 1 rust.
De MTS voor deze cel is do-mi, en er is 1 rust in de cel. Alle noten uit de MTS zijn
reeds aanwezig in de cel, dus daarvoor zijn geen extra plaatsen nodig. Om een akkoord
met polyfonie 3 te bouwen vertrekkend van deze MTS, kunnen we vooraan de MTS
een terts toevoegen of achteraan de MTS een terts toevoegen. Het resultaat hiervan is
weergegeven in Figuur 6.8. De mogelijke drieklanken zijn dus do-mi-sol en la-do-mi.
In do groot zijn dit de drieklanken op toontrappen I en VI.
Figuur 6.8: Drieklanken gebouwd op MTS met twee noten
Akkoorden met 4 noten, dus polyfonie 4, kunnen we in dit voorbeeld echter niet ge-
nereren. Daarvoor zouden we twee tertsen moeten toevoegen aan de MTS, maar er is
maar één rust in de cel. Vierklanken zijn hier dus niet mogelijk.
We bekijken nu het voorbeeld in Figuur 6.9. Hier zijn akkoorden met polyfonie 4 wel
mogelijk.
Figuur 6.9: Voorbeeld met MTS {sol, si, re} en 2 rusten.
De MTS voor deze cel is sol-si-re, en er zijn twee rusten in de cel. Een belangrijk punt
hierbij is dat er in de MTS een noot staat die nog niet in de cel voorkomt, namelijk de
noot si. Er zijn dan wel 2 rusten, maar één van hen zal zeker ingevuld worden met een
si. Er blijft dus maar één echte vrije plaats over. Dit is in dit voorbeeld echter geen
probleem: om een akkoord met 4 noten te maken, moeten we vooraan of achteraan
![Page 73: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/73.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 67
de MTS één terts toevoegen. Aangezien we één vrije plaats hebben, is dit mogelijk.
Het resultaat hiervan is weergegeven in Figuur 6.10. De mogelijke vierklanken zijn dus
sol-si-re-fa en mi-sol-si-re. In do groot zijn dit de vierklanken op toontrappen V en
III.
Figuur 6.10: Vierklanken gebouwd op MTS met 3 noten
Er zijn heel wat redenen waarom er geen enkele toontrap zou kunnen gegenereerd
worden. Het al of niet bestaan van geldige toontrappen hangt af van:
• het aantal rusten in de cel: R
• het vereiste aantal noten in het akkoord: de polyfonie P
• de lengte van de minimale tertsensequentie: L
• het aantal noten in de MTS die nog niet in de cel voorkwamen: A
Een eerste voorwaarde die moet voldaan zijn is:
P ≥ L
Als de lengte van de MTS groter is dan de polyfonie, zal het akkoord namelijk sowieso
teveel noten bevatten.
Een tweede voorwaarde is:
R− A ≥ P − L
Immers, zoals we in het voorbeeld al zagen, is het aantal noten dat we nog vrij kunnen
invullen in de cel niet R, maar wel R − A, aangezien niet noodzakelijk alle noten uit
de MTS al aanwezig zijn in de cel, en deze ook hun plaats moeten krijgen. Om een
akkoord met polyfonie P te kunnen bouwen, gebaseerd op een MTS met lengte L,
moeten we nog P −L tertsen toevoegen aan de MTS. Om dit te kunnen verwezenlijken
moeten er nog P − L vrije plaatsen zijn in de cel, vandaar R− A ≥ P − L.
Resteert nog de vraag hoeveel toontrappen we dan kunnen genereren. Indien de voor-
waarden voldaan zijn, kunnen we op de eerste toontrap van de MTS altijd een akkoord
bouwen. Op de overige toontrappen van de MTS kan dat niet, aangezien dan niet de
volledige MTS in het akkoord vervat zit. Verder mogen we nog P −L noten toevoegen.
Er kunnen dus minstens 0 en maximaal P −L tertsen vooraan toegevoegd worden, wat
een totaal geeft van P − L + 1 toontrappen.
Het algoritme waarmee we de toontrappen berekenen is beschreven in Algoritme 3. De
implementatie ervan is te vinden in de klasse DescriptionGenerator.
![Page 74: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/74.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 68
Algoritme 3 Berekenen van de mogelijke toontrappenParameters: cel met aantal rusten R, aantal verschillende pitchclasses N, toonaard
key, minimale tertsensequentie MTS met lengte L, polyfonie PReturns: lijst met mogelijke toontrappen1: Stel A ← L − N2: Stel T ← toontrap van MTS [0] in key3: if (P ≥ L and R - A ≥ P − L) then
4: for i from 0 to P − L do
5: voeg T toe aan toontrappen6: Stel T ← T − terts in key7: end for
8: end if
9: return toontrappen
6.2.6 Becijferingen genereren
Nu de toontrappen waarop de akkoorden gebouwd worden gekend zijn, moeten we
enkel nog de mogelijke becijferingen bepalen. Het algoritme hiervoor is beschreven in
Algoritme 4.
Dit algoritme vraagt wel enige uitleg. Bij de parameters hebben we o.a. de lijst met
gegenereerde toontrappen T. Dit is de output van algoritme 3. De set origineleToon-
trappen is een set met de toontrappen van de noten die in de cel aanwezig zijn. Om het
overzicht te bewaren werd de berekening hiervan achterwege gelaten in het algoritme.
In het algoritme wordt dan per gegenereerde toontrap uit T de becijferingen bepaald.
Het algoritme is het ingewikkeldst wanneer de basnoot nog niet ingevuld is. In dat
geval wordt berekend welke toontrappen voorkomen in een akkoord met de gegeven
polyfonie op de huidige toontrap, en wordt bepaald welke daarvan nog niet in de cel
voorkomen. Deze toontrappen worden opgeslagen in nogNodigeToontrappen. Er zijn
nu 2 mogelijkheden.
Een eerste mogelijkheid is dat het aantal nog nodige graden gelijk is aan het aantal
rusten. In dit geval zal elke rust ingevuld worden door één van de nog nodige gra-
den. Bovendien zitten we in het geval waar de basnoot een rust is. De basnoot zal
dus ingevuld worden met een toontrap uit nogNodigeToontrappen, en niet met één uit
origineleToontrappen. Enkel die becijferingen waarbij een toontrap uit nogNodigeToon-
trappen in de bas staat zijn dus mogelijk. Om deze becijferingen te genereren wordt
de createDescription methode gebruikt, waarop we zo dadelijk terugkomen.
De tweede mogelijkheid is dat het aantal nog nodige graden groter is dan het aantal
rusten. In dit geval moet de bas niet noodzakelijk ingevuld worden met één van de nog
nodige graden. Eender welke toontrap uit het akkoord kan dan in de bas staan, dus
alle omkeringen zijn mogelijk. Hiervoor wordt de createAllDescriptions methode
gebruikt.
![Page 75: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/75.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 69
Algoritme 4 Berekenen van mogelijke becijferingen voor gegeven toontrappenParameters: lijst met gegenereerde toontrappen T, set origineleToontrappen, basnoot
B, aantal rusten R, polyfonie PReturns: lijst met mogelijke beschrijvingen (toontrap - becijfering combinaties)1: for i from 0 to T.length - 1 do
2: if (B is rust) then
3: Stel huidig ← T [i ]4: for j from 0 to P - 1 do
5: if (!origineleToontrappen bevat huidig) then
6: voeg huidig toe aan nogNodigeToontrappen7: end if
8: Stel huidig ← huidig + terts9: end for
10: if (nogNodigeToontrappen.length == R) then
11: for j from 0 to nogNodigeToontrappen.length - 1 do
12: createDescription(T [i ], nogNodigeToontrappen[j ])13: end for
14: else
15: createAllDescriptions(T [i ])16: end if
17: else
18: createDescription(T [i ], toontrap van B)19: end if
20: end for
Het kan in elk geval niet voorkomen dat het aantal nog nodige graden kleiner is dan
het aantal rusten, want Algoritme 3 produceert geen toontrappen waarbij dit het geval
is.
Ten slotte is er nog het geval waarbij de basnoot al ingevuld was. In dit geval is er slechts
één becijfering mogelijk. Ook deze wordt gegenereerd met de createDescription
methode.
De hulpmethode createDescription bepaalt de omkering wanneer de graad van de
grondnoot en de graad van de basnoot gegeven zijn. Op basis van de omkering en
de polyfonie wordt dan de becijfering bepaald. Deze becijfering vormt samen met de
graad van de grondnoot de gegenereerde beschrijving.
De hulpmethode createAllDescriptions genereert gewoon alle becijferingen voor een
gegeven polyfonie en toontrap. Hier komt dus weinig rekenwerk aan te pas.
De implementatie van deze methoden en de implementatie van Algoritme 4 zijn te
vinden in de klasse DescriptionGenerator.
![Page 76: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/76.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 70
6.3 Productieregel voor onvolledige septiemakkoorden
In de voorgaande sectie werd steeds verondersteld dat een akkoord volledig moet zijn.
Meestal is dat ook zo, maar er is een uitzondering. Bij septiemakkoorden in grond-
ligging mag de kwint ontbreken. Dit betekent dat bvb. bij het septiemakkoord do-mi-
sol-si, indien do in de bas staat, de sol mag ontbreken. De realisatie in Figuur 6.11 is
dus een geldige realisatie voor de beschrijving7Iin do groot.
Figuur 6.11: Septiemakkoord in grondligging waarbij de kwint ontbreekt
Wanneer er nu een cel gegeven is zoals die in Figuur 6.12, zou de productieregel uit de
vorige sectie concluderen dat het septiemakkoord7I
niet mogelijk is. Er staan immers
enkel nog maar do's in de cel. Mi, sol en si zouden er nog bij moeten, terwijl er maar
twee vrije plaatsen meer zijn. Daarom werd een productieregel voorzien voor onvolle-
Figuur 6.12: Cel waarbij septiemakkoord in grondligging wel degelijk mogelijk is
dige septiemakkoorden, die hier wel degelijk de beschrijving7I
als een mogelijkheid
genereert. Om dubbels te vermijden, genereert de productieregel deze beschrijving ech-
ter enkel indien het septiemakkoord met ontbrekende kwint wel mogelijk is, maar het
volledige akkoord niet mogelijk is. Indien het volledige akkoord ook mogelijk is, zal de
productieregel uit de vorige sectie deze beschrijving immers al gegenereerd hebben. De
gebruiker kan deze productieregel activeren door �Kwint mag ontbreken bij vierklanken
in grondligging� aan te vinken.
6.4 Productieregels voor noten
De productieregels voor noten genereren een lijst met mogelijke noten per stem en per
beschrijving. Voor iedere stem wordt dus een aparte lijst gegenereerd. Dit is omdat
![Page 77: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/77.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 71
elke stem zijn eigen stembereik heeft, maar ook omdat de bas een aparte behandeling
nodig heeft. Het stembereik is per cel instelbaar door de gebruiker.
Bij het genereren van de lijst met mogelijke noten voor sopraan, alt of tenor, zijn steeds
alle noten uit het akkoord mogelijk, voor zover die binnen het stembereik liggen. Bvb.
voor de beschrijving5Iin do groot wordt de volgende lijst noten gegenereerd:
do (0) − mi (0) − sol (0) − do (1) − mi (1) − sol (1)
In de bas kan echter enkel een do staan. Bij de becijfering �5� moet de grondnoot
immers in de bas komen. Voor de bas wordt dus de volgende lijst noten gegenereerd:
do (−1) − do (0)
Merk ook op dat voor de sopraan, alt en tenor de becijfering niet uitmaakt. Alle noten
kunnen immers voorkomen in de drie bovenstemmen, ongeacht de omkering. Voor de
drie bovenstemmen worden de noten dus enkel bepaald door de toontrap en niet door
de becijfering. Bij de bas echter bepalen toontrap en becijfering samen de mogelijke
noten.
Het genereren van de notenlijsten is een berekening die heel vaak opnieuw moet gedaan
worden, maar waarbij de input eigenlijk vaak dezelfde is. Om te vermijden dat het al-
goritme zou vertragen door deze berekening telkens opnieuw te doen, wordt gebruik
gemaakt van een pitchlist cache. Dit is een boomstructuur waarin deze notenlijsten
opgeslagen worden. Alle notenlijsten die ooit berekend werden, komen hierin terecht.
Zo moeten ze geen tweede keer berekend worden. Figuur 6.13 toont een momentopna-
me van de pitchlist cache. Op dit moment zitten er nog maar vijf notenlijsten in. Dit
worden er uiteraard meer in de loop van de uitvoering van het algoritme. De notenlijs-
ten worden opgeslagen per toonaard, per toontrap en per stem. Bij de bas wordt ook
nog eens onderscheid gemaakt tussen de becijferingen.
Deze pitchlist cache kan in principe voor de hele duur van het programma blijven
bestaan. Er is geen reden om deze te wissen na het oplossen van één opgave. Wel
moet men er rekening mee houden dat de notenlijsten niet meer correct zijn wanneer
de gebruiker de stembereiken verandert.
Tot slot kunnen we nog opmerken dat de becijferingen 5 en 7 in feite dezelfde basnoot
impliceren. Zowel bij het akkoord do - mi - sol als bij het akkoord do - mi - sol - si
is de grondnoot namelijk dezelfde. Hetzelfde geldt voor de becijferingen 6 en 6
5en de
becijferingen 6
4en 4
3. In de implementatie werd hiermee rekening gehouden door
deze gevallen samen te nemen, wat de boom iets kleiner maakt.
![Page 78: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/78.jpg)
HOOFDSTUK 6. PRODUCTIEREGELS 72
Figuur 6.13: Pitchlist cache (S = sopraan, A = alt, T = tenor, B = bas)
6.5 Productieregels in verband met de tonica
In verband met de tonica zijn er vier productieregels, die de gebruiker allemaal kan
activeren in het settingsvenster:
1. De eerste beschrijving moet5I
zijn.
2. De laatste beschrijving moet5Izijn.
3. De eerste noot in de sopraan moet de tonica zijn.
4. De laatste noot in de sopraan moet de tonica zijn.
De productieregels voor de tonica zijn exclusieve productieregels. Wanneer deze productie-
regels actief zijn, mag geen enkele andere productieregel beschrijvingen of noten toe-
voegen aan de gegenereerde lijst. Deze productieregels bepalen immers dat de tonica
de enige geldige beschrijving of noot is. Andere mogelijkheden zijn dus niet toegelaten.
![Page 79: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/79.jpg)
Hoofdstuk 7
Heuristische regels
7.1 Bedoeling
Sommige harmonieregels zijn vrij strikt, zoals bvb. de regel van de parallelle kwinten en
octaven. Er zijn echter ook regels die minder strikt zijn, en die wel mogen overtreden
worden. Dit zijn eerder �aanwijzingen� die bepalen wat er in bepaalde situaties goed is,
zonder dat het verplichte regels zijn, bvb. �veel grote sprongen na elkaar is niet goed�.
Deze aanwijzingen zijn een probleem in onze algoritmen. Indien ze geïmplementeerd
worden als controleregels, dan moet er ook echt aan voldaan worden. Een opgave kan
dan onoplosbaar zijn, alleen maar doordat niet voldaan is aan een regel die in feite
niet verplicht is. Het is echter ook geen goed idee deze aanwijzingen dan maar volledig
achterwege te laten. Het algoritme dat de opgaven oplost, zal dan geen enkele reden
hebben om er nog rekening mee te houden, waardoor er slechts bij toeval aan zal voldaan
zijn. Er is dus een gulden middenweg nodig, die deze aanwijzingen opvolgt indien het
kan, zonder echter de opgave onoplosbaar te verklaren indien het niet kan. Hiervoor
werd nog een nieuwe soort regels toegevoegd aan Ramo, namelijk de heuristische regels.
Deze zijn een soort vuistregels die bepalen wat de beste keuze is indien er meerdere
geldige mogelijkheden zijn.
7.2 Werking
Een objectie�unctie is een functie die in optimalisatieproblemen bepaalt hoe goed een
(deel-) oplossing is, door er een score aan toe te kennen. Ook hier gaan we op deze
manier te werk. Elke heuristische regel evalueert zijn eigen criterium, en kent een score
toe aan de deeloplossing naargelang de mate waarin aan dit criterium voldaan is. De
waarde van de objectie�unctie is dan de som van de scores die de heuristische regels
toegekend hebben.
73
![Page 80: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/80.jpg)
HOOFDSTUK 7. HEURISTISCHE REGELS 74
De heuristische regels werken op een gelijkaardige manier als de controleregels, maar in
plaats van true of false retourneren ze een getal dat de score aangeeft. De implementatie
van de heuristische regels is te vinden in de package ramo.solve.criteria. Elke
heuristische regel implementeert een methode van de vorm
double evaluate(Cell[] cells, Maatcijfer m);
die in de interface Criterium gedeclareerd is. Ook kan aan elke heuristische regel een
gewicht toegekend worden.
7.3 Soorten heuristische regels
7.3.1 Beschrijvingen
Bepaalde beschrijvingen worden in de harmonie frequenter gebruikt dan andere. We
willen bij het oplossen van de opgaven dan ook dat deze beschrijvingen frequenter
voorkomen dan andere. Er zijn dus heuristische regels voorzien die een score toekennen
aan deze frequente beschrijvingen.
In [3] vinden we een opsomming van de beschrijvingen die als frequent worden be-
schouwd, namelijk 5
I, 5
II, 5
IV, 5
V, 5
V I, 6
I, 6
II, 6
IV, 6
Ven
6
4
I
. Het is dan ook
aan deze beschrijvingen dat in Ramo een score wordt toegekend. Wanneer we aan elke
frequente beschrijving de score 1.0 toekennen, zal aan de maat in Figuur 7.1 de score
2.0 toegekend worden. Er zijn immers 2 frequente beschrijvingen en 2 niet-frequente.
Figuur 7.1: Voorbeeldopgave voor heuristische regels
Ook zijn er heuristische regels die scores toekennen aan sequenties van beschrijvingen.
Sequenties waaraan scores toegekend worden, zijn bvb.
5
IV- 5
V, 5
V- 5
V I, 5
I- 6
V II- 6
I, 5
I-
6
4
V
- 6
I...
![Page 81: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/81.jpg)
HOOFDSTUK 7. HEURISTISCHE REGELS 75
7.3.2 Noten
De heuristische regels voor noten kennen een score toe aan melodieën die als �mooi�
beschouwd worden. Omdat men liever kleine intervallen heeft dan grote, wordt er bvb.
een score toegekend aan secunden en tertsen in de sopraan. De grotere sprongen zijn
dan benadeeld omdat die geen score krijgen. Overigens wordt ook geen score toegekend
aan een prime. Dat is dan wel een klein interval, maar het is ook niet de bedoeling dat
de stemmen voortdurend blijven liggen.
Er is ook een heuristische regel die een score toekent voor tegenbeweging tussen sopraan
en bas. Bij het evalueren van deze heuristische regel, wordt per 2 cellen nagegaan of de
bas en sopraan tegenbeweging maken of niet. Indien voor elke keer dat er tegenbeweging
is de score 1.0 wordt toegekend, krijgt het voorbeeld in Figuur 7.1 een score van 3.0.
De sopraan is in dit voorbeeld immers steeds in tegenbeweging met de bas.
7.3.3 Modulaties
Na een modulatie, een verandering van toonaard, is het goed als er een toonaard-
bevestiging is. Dit houdt in dat men zo snel mogelijk de noten die nieuw zijn in de
nieuwe toonaard laat horen, zodat de luisteraar hoort dat er van toonaard veranderd
is. Meestal gebeurt dit in de vorm van een cadens.
In [3] is een hele lijst regels opgesomd die aangeven hoe de modulatie het best kan
gebeuren. Deze regels zijn echter zeer speci�ek en kennen enorm veel verschillende
gevallen. Aanvankelijk werden deze regels als controleregels geïmplementeerd, maar
deze regels bleken veel te streng. Zodra men een voorbeeld uit een ander harmonieboek
invoerde, was dit al ongeldig. Er werd dus afgestapt van het idee de regels voor
modulatie als controleregels te implementeren. Toch zijn deze regels waardevol en is het
goed er in de mate van het mogelijke naar te streven. Hier bleken de heuristische regels
zeer nuttig te zijn. Er werden dan ook een aantal heuristische regels geïmplementeerd
die een score toekennen aan bepaalde sequenties van beschrijvingen indien ze net na
een modulatie voorkomen. Min of meer gebaseerd op [3], zijn dit de beschrijvingen die
de heuristische regels in Ramo als de meest wenselijke beschouwen na een modulatie:
• Eerst een beschrijving met toontrap II, IV of VI, maar enkel indien dit akkoord
een noot bevat die in de vorige toonaard niet voorkwam;
• Vervolgens 5
V;
• Ten slotte 5
Iof 5
V I.
De meest wenselijke combinatie van 3 beschrijvingen is echter niet altijd mogelijk.
Daarom kennen de heuristische regels ook een score toe aan bvb. 5
V- 5
I, maar dan
wel een lagere score.
![Page 82: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/82.jpg)
HOOFDSTUK 7. HEURISTISCHE REGELS 76
7.3.4 Cadenzen
Voor de cadenzen geldt hetzelfde als voor de modulaties. De regels zijn niet eenduidig
en strikt genoeg om ze als controleregels te implementeren, maar toch is het belangrijk
dat er naar een goede slotcadens gestreefd wordt. Er zijn dus een aantal sequenties die
een score krijgen, maar enkel wanneer ze voorkomen aan het einde van een muziekblad.
Voorbeelden hiervan zijn 5
V- 5
I, 5
IV- 5
V- 5
I,
6
4
I
- 5
V- 5
I, ...
7.4 Opmerking over de subjectiviteit
Daar het hier niet om strikte regels gaat, is de keuze van de heuristische regels en hun
gewichten nog subjectiever dan de keuze van de controleregels. Bij voorkeur zou de
gebruiker ze zelf moeten kunnen opgeven, of zouden ze moeten afgeleid worden uit een
groot aantal muziekstukken. De vraag wélke heuristische regels hier precies zouden
moeten gebruikt worden, vraagt nader musicologisch onderzoek, wat buiten het bestek
van deze thesis valt. In elk geval is het mechanisme er, en werden bij wijze van �proof
of concept� een aantal voorbeelden van heuristische regels geïmplementeerd. Hoewel
de keuze van de heuristische regels hier eerder subjectief is, zal in Hoofdstuk 8 blijken
dat ze wel degelijk tot betere resultaten leiden. Andere experimentatoren kunnen
met andere heuristische regels komen tot resultaten die eveneens algemeen als beter
beschouwd worden, maar die naar hun eigen subjectieve perceptie als nog beter of �de
beste� beschouwd worden. De betere resultaten zijn een argument om de heuristische
regels zeker te gebruiken.
![Page 83: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/83.jpg)
Hoofdstuk 8
Backtracking-algoritmen
8.1 Inleiding
In dit hoofdstuk geven we een overzicht van de verschillende backtracking-algoritmen.
De algoritmen zoeken een oplossing voor een harmonieopgave, en maken daarbij gebruik
van de eerder besproken controleregels, productieregels en - optioneel - de heuristische
regels. Daarbij laat het algoritme de reeds door de gebruiker ingevulde noten, toon-
trappen en becijferingen ongewijzigd, en vervolledigt het de opgave tot een partituur
die aan de harmonieregels voldoet. Het concept �harmonieopgave� wordt dus iets alge-
mener opgevat dan de typische opgaven uit 2.6. Het algoritme kan klassieke opgaven
zoals een gegeven bas of een gegeven sopraan oplossen, maar ook minder traditionele
opgaven zijn mogelijk. Zo zijn bvb. opgaven mogelijk waarbij enkel de beschrijvingen
of een deel ervan gegeven zijn, of waarbij één of meer stemmen deels ingevuld zijn enz.
Het enige wat vereist is, is dat de toonaarden volledig ingevuld zijn. Uiteraard is het
wel zo dat een opgave die op zich al fouten bevat, nooit tot een correcte oplossing zal
leiden. In dat geval is de opgave dus niet oplosbaar.
Het uitgangspunt dat de opgave verder aangevuld wordt tot een geldige partituur,
maakt nog een aantal extra dingen mogelijk. Men kan bvb. ook de vier stemmen zelf
volledig invullen en het algoritme de beschrijvingen laten genereren. Ook kan men het
algoritme �from scratch� muziek laten genereren door, op de toonaarden na, helemaal
niets in te vullen in de opgave.
Volgens dit idee werden drie algoritmen geïmplementeerd:
• Het eerste algoritme probeert de beschrijvingen en noten die door de productie-
regels gegenereerd worden in willekeurige volgorde, en aanvaardt de eerste oplos-
sing die aan de harmonieregels voldoet.
• Het tweede algoritme bepaalt door vooruitkijken en door heuristische regels de
beste keuze voor de beschrijvingen, en probeert de noten in willekeurige volgorde.
77
![Page 84: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/84.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 78
• Het derde algoritme bepaalt door vooruitkijken en door heuristische regels de
beste keuze voor de beschrijvingen én de noten.
Het derde algoritme biedt nog een aantal extra mogelijkheden voor modulaties en
cadenzen, en kan versneld worden door zich te beperken tot vaak voorkomende be-
schrijvingen. Ook is er bij alle drie de algoritmen de mogelijkheid tot �beperkte back-
tracking�.
In Ramo kan de gebruiker het algoritme en de extra opties instellen in het settings-
venster1. Figuur 8.1 toont een screenshot van dit settingsvenster. Er zijn overigens
tooltips voorzien die de settings verduidelijken.
Figuur 8.1: Settings voor de algoritmen in Ramo
In de volgende secties beschrijven en evalueren we deze drie algoritmen en de extra
opties. Om een vergelijking mogelijk te maken, testen we elk algoritme uit op dezelf-
de reeks standaardvoorbeelden. In Figuur 8.2 zien we de vier standaardvoorbeelden,
namelijk een gegeven bas, een gegeven sopraan, een voorbeeld met modulaties en een
voorbeeld dat lege cellen bevat. Daar waar twee dezelfde noten elkaar opvolgen, wer-
den deze samengenomen als één langere noot. Deze standaardvoorbeelden zijn ook
te vinden op de bijgeleverde cd in de map �Test�les/Standaardvoorbeelden�. Tenzij
waar anders vermeld, werden alle testen gedaan met de standaardinstellingen voor de
productieregels, die men bekomt via de knop �Standaardwaarden�.
1menu �Oplossen� → �Instellingen...�
![Page 85: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/85.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 79
Figuur 8.2: De vier standaardvoorbeelden
![Page 86: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/86.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 80
8.2 Willekeurig algoritme
8.2.1 Bedoeling
Het willekeurig algoritme is het eerste algoritme dat ontworpen werd. Het heeft als doel
zo snel mogelijk een oplossing te vinden die aan alle regels voldoet. Het algoritme houdt
enkel rekening met de strikte harmonieregels. Er wordt hier dus geen gebruik gemaakt
van heuristische regels. De door de productieregels gegenereerde beschrijvingen en
noten worden in willekeurige volgorde geprobeerd, zodat telkens een andere oplossing
bekomen wordt. Dit algoritme is het eenvoudigste van de drie algoritmen en ook het
snelste, maar leidt wel tot de minst �muzikale� resultaten.
8.2.2 Algoritme
Voorbeeld
Om dit algoritme te beschrijven, bekijken we het voorbeeld in Figuur 8.3. Het betreft
hier een momentopname waarbij de eerste twee cellen reeds ingevuld zijn door het
algoritme (zie deel�guur a). De opgave is een baslijn in do groot, dus de sol in de bas
in cel 3 maakt deel uit van de opgave. We willen cel 3 verder aanvullen op een geldige
manier.
Eerst en vooral moet er een beschrijving vastgelegd worden voor de cel. Wanneer
we enkel met drieklanken werken, hebben de productieregels volgende beschrijvingen
gegenereerd:
5V
,6
III,
64I
In dit algoritme zullen we de beschrijvingen in willekeurige volgorde overlopen. In het
voorbeeld is deze willekeurige volgorde de volgende:
6III
,5V
,
64I
Als eerste wordt dus de beschrijving6
IIIin de cel geplaatst (b). Omdat we zo snel
mogelijk willen snoeien, worden nu al de regels gecheckt die enkel betrekking hebben op
de beschrijvingen en niet op de noten. Deze regels hebben we hier beschrijvingsregels
genoemd. Uit deze check blijkt dat6
IIIgeen goede keuze was, want
5IV
-6
IIIis
een ongeldige verbinding (c). We beginnen dus niet de noten in te vullen voor de
![Page 87: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/87.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 81
beschrijving6
III, maar kiezen onmiddellijk een andere beschrijving. De volgende
beschrijving die in de cel geplaatst wordt is5V
(d), waarbij de beschrijvingsregels deze
keer wel slagen (e).
Nu kunnen we dus wel noten invullen in de cel. De bas was gegeven dus daar hoeft
geen noot ingevuld te worden. We vullen de noten in van onder naar boven, dus de
volgende stem die we invullen is de tenor. Voor de tenor en beschrijving5V
genereren
de productieregels de volgende noten2, reeds in willekeurige volgorde geplaatst:
Eerst wordt dus een hoge re in de tenorstem geplaatst (f). Zoals we reeds zagen in
5.2.1 zijn er sommige akkoordregels die al kunnen gecontroleerd worden nog voor de
cel volledig ingevuld is. Deze akkoordregels worden dus nu gecheckt, en er blijkt een
overtreding te zijn. Er is namelijk een stemoverschrijding tussen tenor en alt (g). In
plaats van verder te gaan met de altstem, proberen we dus de tweede mogelijke noot
voor de tenor, namelijk sol (h). Opnieuw evalueren we deze akkoordregels, en er blijkt
geen overtreding te zijn (i).
We kunnen nu dus de alt invullen. De noten die door de productieregels gegenereerd
werden voor de alt en beschrijving5V
zijn in willekeurige volgorde:
De eerste mogelijke noot, re, wordt geprobeerd (j) en de akkoordregels slagen (k).
We gaan verder met de sopraan. De productieregels genereerden voor de sopraan en
beschrijving5V
de volgende beschrijvingen, in willekeurige volgorde:
In de sopraan wordt eerst de noot sol ingevuld (l). Omdat de cel nu volledig ingevuld
is, worden behalve de akkoordregels ook alle overige regels geëvalueerd. Nu worden
2De �guur geeft de verschillende mogelijke noten weer, geen melodie!
![Page 88: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/88.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 82
dus alle regels geëvalueerd behalve de beschrijvingsregels, die al gecontroleerd werden
na het invullen van de beschrijving zelf. Er blijken echter fouten te zijn (m). De
terts ontbreekt in het akkoord want de cel bevat 2 keer sol en 2 keer re, maar geen si.
Bovendien is er een parallel octaaf tussen bas en sopraan.
We proberen dus een andere noot voor de sopraan. De volgende mogelijkheid uit de lijst
is si. Deze noot wordt in de cel geplaatst (n). Opnieuw worden zowel de akkoordregels
als de overige regels gecontroleerd. Weer blijkt er een overtreding te zijn: het interval
tussen de sopraannoten van cel 2 en 3 is een vermeerderde kwart (o). De vermeerderde
kwart, ook tritonus genoemd, is een verboden melodisch interval. Achtereenvolgens
worden nu de lage re, hoge re en hoge sol geprobeerd voor de sopraan. Allemaal blijken
ze tot overtredingen te leiden. Voor de overzichtelijkheid is dit achterwege gelaten in
de �guur.
Aangezien geen enkele noot voor de sopraan hier tot een oplossing zal leiden, zit er
niets anders op dan terug te keren (te backtracken) naar de vorige stap en daar een
andere keuze te maken. De vorige stap was de altstem, dus daar zullen we een nieuwe
noot moeten invullen. Er stond een re, die we nu vervangen door de volgende noot uit
de lijst met mogelijke noten voor de alt, namelijk een lage si (p). De akkoordregels
slagen (q) en we kunnen opnieuw de sopraan proberen invullen.
De sopraan begint nu met een schone lei. Ondanks het feit dat de noten bij de vorige
poging allemaal faalden, is het wel degelijk mogelijk dat ze nu toch slagen, doordat de
context veranderd is. We moeten dus opnieuw alle noten uitproberen voor de sopraan.
Om het algoritme een zo willekeurig mogelijk karakter te geven, kiezen we eerst een
nieuwe willekeurige volgorde voor de mogelijke noten voor de sopraan:
De eerste noot, de lage re, wordt in de sopraan geplaatst (r). Alle regels worden
gecontroleerd, behalve de beschrijvingsregels. Er blijkt geen enkele regel overtreden te
zijn (s). We hebben dus een geldige volledige invulling gevonden voor cel 3, waarmee
het proces voor deze cel beëindigd is. Er kan nu verdergegaan worden met de volgende
cel, waarbij opnieuw eerst de beschrijving en vervolgens de stemmen van laag naar
hoog ingevuld worden. Indien nodig, wordt er ook gebacktrackt over de cellen heen,
waarbij een nieuwe invulling gekozen wordt voor de voorgaande cel. Op deze manier
wordt verdergegaan tot het einde van het muziekblad bereikt is.
![Page 89: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/89.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 83
Figuur 8.3: Verloop van het willekeurig algoritme
![Page 90: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/90.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 84
Algoritme in pseudocode
Dit algoritme werd opgevat als twee verschillende methoden. De eerste methode,
probeerBeschrijvingen(int celindex) itereert over de verschillende beschrijvin-
gen voor de cel met de gegeven index. Wanneer een beschrijving voldoet aan de be-
schrijvingsregels, wordt de methode probeerNoten(int celindex, int stemindex)
opgeroepen, die de stemmen probeert in te vullen volgens deze beschrijving. De
probeerNoten methode itereert over de mogelijke noten voor die stem, rekening hou-
dend met de gekozen beschrijving. Wanneer een noot wordt gevonden die geldig is
volgens de akkoordregels, worden de andere stemmen recursief ingevuld. Wanneer de
cel volledig ingevuld is, worden de overige regels gecontroleerd. Als ook deze slagen,
wordt de probeerBeschrijvingen methode opgeroepen voor de volgende cel. De twee
methoden zijn dus mutueel recursief , wat betekent dat ze allebei de andere oproepen.
De algoritmen voor beide methoden zijn weergegeven in Algoritme 5 en Algoritme 6.
De parameter celindex is het chronologisch volgnummer van de cel in het muziekblad.
In deze tekst wordt de celindex steeds geteld vanaf 1. De parameter stemindex geeft
aan welke stem er moet ingevuld worden. De bas heeft stemindex 0, de tenor 1, de alt
2 en de sopraan 3. Er is ook een globale variabele cellen, namelijk een array met de
cellen die moeten ingevuld worden.
In de algoritmen in pseudocode die in deze tekst beschreven worden, geldt steeds dat
voor and en or het rechterlid slechts geëvalueerd wordt indien nodig. Voor x or y
betekent dit dat y niet wordt geëvalueerd indien x waar is. Voor x and y houdt dit in
dat y niet wordt geëvalueerd indien x vals is.
8.2.3 Opmerkingen
Lokaliteit van de regels
In het algoritme dat we beschreven, worden de cellen altijd van links naar rechts inge-
vuld. Nochtans is het in backtracking-algoritmen meestal een goed idee de variabelen
met het kleinste aantal mogelijkheden als eerste te proberen invullen. Op die manier
kan men hoog in de zoekboom grote takken snoeien. In het harmonisatieprobleem zou
dit erop neer komen dat de cellen waar al het meest is ingevuld, eerst worden bekeken,
en als laatste de cellen waar het minst is ingevuld. Dit zou ertoe leiden dat de cellen
niet van links naar rechts worden overlopen, maar dat er van de ene cel naar de andere
wordt gesprongen. Dit heeft echter een groot nadeel. De harmonieregels zijn namelijk
zeer lokaal. Als ze op meerdere cellen betrekking hebben, zijn dit vrijwel altijd cellen
die naast elkaar liggen. Wanneer men dan de cellen in een niet-aansluitende volgorde
gaat overlopen, zal men veel regels niet kunnen uitvoeren doordat de buren van de
![Page 91: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/91.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 85
Algoritme 5 Willekeurig algoritme - probeerBeschrijvingen(int celindex)Parameters: index v/d huidige cel celindexReturns: true indien succes, anders false1: Stel L ← lijst van beschrijvingen gegenereerd door productieregels2: for elke beschrijving B in L do
3: cellen[celindex ].zetBeschrijving(B)4: if beschrijvingRegelsGeslaagd(cellen, celindex ) then
5: if probeerNoten(celindex, 0) then
6: return true7: end if
8: end if
9: end for
10: return false {geen enkele beschrijving leidde tot een oplossing}
Algoritme 6 Willekeurig algoritme - probeerNoten(int celindex, int stemindex )Parameters: index v/d huidige cel celindex, index v/d huidige stem stemindexReturns: true indien succes, anders false1: Stel L ← lijst van noten gegenereerd door productieregels2: for elke noot N in L do
3: cellen[celindex ].zetNoot(N )4: if akkoordregelsGeslaagd(cellen[celindex ], stemindex ) then
5: if stemindex < 3 then
6: if probeerNoten(celindex, stemindex+1) then
7: return true8: end if
9: else if overigeRegelsGeslaagd(cellen, celindex ) then
10: if celindex = cellen.length−1 or probeerBeschrijvingen(celindex+1) then
11: return true12: end if
13: end if
14: end if
15: end for
16: return false {geen enkele noot leidde tot een oplossing}
![Page 92: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/92.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 86
huidige cel nog niet ingevuld zijn. Het gevolg is dus dat er juist veel lager in de zoek-
boom pas kan gesnoeid worden! Wegens de lokaliteit van de regels hebben we voor dit
speci�eke probleem dus niet in volgorde van het aantal mogelijkheden gewerkt.
Snoeien
Het snoeien gebeurt hier door de harmonieregels te evalueren en niet verder te gaan met
de huidige deeloplossing indien er overtredingen zijn. Het is belangrijk op te merken
dat het snoeien in dit algoritme niet vrijblijvend is. Om e�ciëntieredenen evalueren
de regels steeds enkel de laatste cel en het aantal voorgangers van de laatste cel dat
nodig is om de regel te kunnen evalueren. Het is dus niet zo dat elke check de hele
deeloplossing tot nu toe evalueert. Dat zou te veel tijd innemen. Omdat een cel,
eens er naar een volgende cel is overgegaan, niet meer wordt gecontroleerd, is men dus
verplicht in elke stap steeds de regels te evalueren en te snoeien waar mogelijk.
Backjumping
Backjumping zou in deze context betekenen dat er meerdere stemmen of meerdere
cellen in één keer teruggekeerd wordt. In 5.2 hebben we er echter voor gezorgd dat elke
fout zo vroeg mogelijk wordt gedetecteerd. Wanneer een regel bvb. betrekking heeft
op drie cellen, en het gaat in de tweede cel al fout, zal dit dan al gedetecteerd worden.
Men kan dan meteen terugkeren van cel 2 naar cel 1, waardoor achteraf een jump van
cel 3 naar cel 1 niet nodig is. Om deze reden is het niet noodzakelijk in dit algoritme
van backjumping gebruik te maken.
Policy
Er wordt in dit algoritme geïtereerd over beschrijvingen en over noten, in een bepaalde
volgorde. Deze volgorde wordt van buitenaf vastgelegd door een policy. Hier hebben
we een random policy gebruikt die een willekeurige volgorde toekent aan de beschrij-
vingen en aan de noten. Er zijn echter ook andere policies mogelijk, bvb. op basis van
prioriteiten. In het volgende algoritme zullen we daarvan een voorbeeld zien.
8.2.4 Resultaten
De resultaten die met het willekeurig algoritme bekomen werden voor de vier stan-
daardvoorbeelden, zijn weergegeven in Figuur 8.4. Ook de tijden zijn erbij vermeld.
We bekijken de positieve en negatieve kenmerken van de resultaten voor elk voorbeeld.
![Page 93: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/93.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 87
Voorbeeld 1: Gegeven bas
Deze baslijn van 16 maten lang werd correct geharmoniseerd in amper 62 ms. Alle
akkoorden zijn correct verboden, bvb. bij de5
IV-
5V
verbindingen in maten 7 en 15
dalen de drie bovenstemmen inderdaad, zoals het hoort. Ook zijn er nergens parallelle
kwinten of parallelle octaven te vinden, en komen er geen ongeldige sequenties van
beschrijvingen voor, zoals bvb.5V
-5
IV. Wat dat betreft, snoeit het regelsysteem dus
wel degelijk alle ongeldige mogelijkheden.
Wel worden niet altijd de meest voor de hand liggende beschrijvingen gekozen. In maat
4 wordt bvb. 2 keer de beschrijving6
IIIgebruikt. De meeste muzikanten zouden hier
echter de voorkeur geven aan de beschrijving5V
. Ook voor de beschrijvingen5
V II
en6
V Izijn er alternatieven die vaker gebruikt worden. Verder is de melodie ook zeer
willekeurig. Er zijn veel onverwachte sprongen, en vooral de sprong in de sopraan op
het slotakkoord is geen goed idee. Het slotakkoord hoort immers een akkoord van rust
te zijn, waarop niet meer gesprongen wordt.
Met dergelijke zaken houdt dit algoritme echter geen rekening, wat meteen ook de
reden is waarom het zo snel is. Merk op dat er hier wel degelijk een slotcadens is, maar
dit is toeval. Er zal zeker niet altijd automatisch een goede slotcadens gekozen worden,
zie bvb. het volgende voorbeeld.
Voorbeeld 2: Gegeven sopraan
Deze sopraan werd geharmoniseerd in 31 ms. Dit is sneller dan voorbeeld 1, omdat
het hier over een korter stukje gaat. Bij een gegeven sopraan is de zoekruimte groter
dan bij een gegeven bas, omdat er meer verschillende beschrijvingen mogelijk zijn per
cel. Toch is het algoritme niet minder snel voor een sopraan dan voor een bas, omdat
sowieso de eerste beschrijving die slaagt gekozen wordt.
Ook hier is alles correct verbonden. De5V
-5
V Iverbinding is geen triviale verbinding,
want bij deze verbinding moet de terts van het5
V Iakkoord verdubbeld worden ipv
de grondnoot, wat nochtans niet altijd het geval is voor het5
V Iakkoord. In maat 4
zien we dat dit correct gebeurt.
Het belangrijkste minpunt aan deze oplossing, is de keuze van de beschrijvingen in de
laatste maat, die absoluut geen goede slotcadens vormen. Ook moet bij een gegeven
sopraan de baslijn nog door het algoritme gecomponeerd worden. Een aaneensluitende
bas met kleine intervallen zou beter geweest zijn dan de willekeurig springende bas die
![Page 94: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/94.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 88
we hier vinden. Wat dit betreft hadden vooral de cellen 6 t.e.m. 8, waar we twee grote
sprongen na elkaar in dezelfde richting zien in de bas, beter gekund.
Voorbeeld 3: Modulatie
In dit voorbeeld zien we dat de modulatie correct wordt uitgevoerd. Er is bij elke
modulatie een spilakkoord, dat inderdaad in de beide toonaarden kan voorkomen, en
de twee toontrappen van het spilakkoord zijn correct. Wel is er na de modulaties
geen goede toonaardbevestiging. De ene modulatie wordt gevolgd door5V
-6
V Ien de
andere door5
IV-
5V
-6
V I, terwijl
5V
-5I
en5
IV-
5V
-5I
beter zouden geweest zijn.
Voorbeeld 4: Lege cellen
Aan de tijdmeting te zien, heeft het algoritme weinig last van de lege cellen. Dit is ook
logisch, aangezien de lege cellen gewoon willekeurig worden ingevuld. Wat er wordt
ingevuld in de lege cellen, blijkt dan ook niet echt de beste keuze te zijn. Bovendien
ontbreekt ook hier een goede slotcadens.
Algemeen
In het algemeen presteert dit algoritme zeer goed qua snelheid. De combinatorische
explosie blijkt minder een probleem te zijn dan verwacht. Dit is te verklaren door het
feit dat er zeer veel verschillende oplossingen zijn in de zoekruimte, en er dus altijd wel
snel een van die oplossingen gevonden wordt.
Een andere voordeel van dit algoritme is dat het telkens een andere oplossing geeft. Dit
is handig wanneer men meerdere totaal verschillende oplossingen wil. Wat men ook
kan doen, is datgene wat men goed vindt aan een oplossing behouden, de andere cellen
leegmaken, en het algoritme opnieuw uitvoeren. Men krijgt dan een nieuwe invulling
voor de cellen die niet naar wens waren.
Wel zijn de resultaten, hoewel steeds correct, soms wat onlogisch op muzikaal gebied.
Zoals te verwachten was, is iets wat aan de harmonieregels voldoet nog niet noodzakelijk
muzikaal.
![Page 95: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/95.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 89
Figuur 8.4: Resultaten van het willekeurig algoritme
![Page 96: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/96.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 90
8.2.5 Uitbreidingen
Beperkte backtracking
Zoals uit de experimenten blijkt, vindt het willekeurig algoritme meestal snel een op-
lossing. Door het snoeien, en doordat er veel oplossingen mogelijk zijn, moet daarbij
nooit de hele zoekruimte doorzocht worden. Wanneer er echter geen oplossing bestaat,
zal op het snoeien na wel de hele zoekruimte doorzocht worden. Dit neemt zeer veel
tijd in beslag. Dit neemt zelfs zodanig veel tijd in, dat het niet realistisch is dat een
gebruiker zal willen wachten tot de héle zoekruimte doorzocht is, om dan pas melding
te krijgen dat er geen oplossing kon gevonden worden. Er werd dus gezocht naar een
manier om het zoekproces sneller te stoppen.
Hiervoor bekijken we het proces van backtracking eens van naderbij. Door de in-
dex van de cel die momenteel bekeken wordt te vergelijken met de hoogste index
van een cel die al bereikt werd, kunnen we nagaan hoe ver er teruggekeerd wordt.
Hiervoor wordt een globale variabele hoogstBereikteCelIndex bijgehouden. Bij el-
ke oproep van de methode probeerBeschrijvingen of probeerNoten, wordt de cel-
index vergeleken met hoogstBereikteCelIndex. Indien de celindex groter is dan
hoogstBereikteCelIndex, wordt hoogstBereikteCelIndex gelijkgesteld aan de cel-
index.
Figuur 8.5: Backtracking informatie voor het standaardvoorbeeld met gegeven bas
Figuur 8.5 toont een (ingekort) stukje van de output die dit oplevert voor het standaard-
voorbeeld met de gegeven bas. We zien hier dat er voor cellen 14 t.e.m. 19 helemaal
niet wordt teruggekeerd naar vorige cellen. Vanaf cel 12 wordt wel teruggekeerd naar
cel 11, en vanaf cel 13 wordt twee stappen teruggekeerd tot cel 11.
Een belangrijke vaststelling is dat er bijna nooit ver teruggekeerd wordt. De verklaring
hiervoor ligt in het feit dat de harmonieregels zeer lokaal zijn, en het dus gewoonlijk
volstaat slechts 1 of 2 cellen terug te keren om een overtreding te herstellen.
De methode die we gebruiken om het zoekproces sneller te stoppen, is gebaseerd op
deze vaststelling. In plaats van helemaal tot cel 1 te backtracken, wordt slechts een
![Page 97: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/97.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 91
beperkt aantal cellen teruggekeerd, bvb. 3. Wanneer we d het aantal cellen noemen
dat er mag teruggekeerd worden, kan dit idee ook als volgt verwoord worden:
Wanneer in de zoekboom een nakomeling bereikt is van top v, die op een afstand d ligt
van v, worden alle nog niet geprobeerde kinderen van v gesnoeid.
Figuur 8.6 illustreert dit idee voor d = 3.
Figuur 8.6: Beperkte backtracking
Door deze techniek wordt met d = 3 binnen aanvaardbare tijd gemeld dat er geen
oplossing kan gevonden worden. Doordat niet de hele zoekruimte doorzocht wordt,
verliest men hier wel de garantie dat een melding dat er geen oplossing kon gevonden
worden ook werkelijk betekent dat er geen oplossing bestaat. Uit experimenten blijkt
echter dat voor d = 3 bijna altijd een oplossing gevonden wordt, indien er één bestaat.
De gebruiker kan in Ramo aanvinken of er al dan niet gebruik gemaakt wordt van
beperkte backtracking. Ook de waarde d is instelbaar. Deze waarde d kan men be-
schouwen als een maat voor hoe lang de gebruiker wil wachten vooraleer te concluderen
dat er geen oplossing meer zal gevonden worden.
Deze optie kan ook gebruikt worden bij de twee andere backtracking-algoritmen die we
nog zullen bespreken.
Aantal oplossingen bepalen
Het beschreven algoritme kan via een eenvoudige aanpassing ook gebruikt worden om
het aantal mogelijke oplossingen te tellen. Het algoritme stopt dan niet wanneer één
oplossing gevonden is. In plaats daarvan, wordt een teller verhoogd die het aantal
gevonden oplossingen bijhoudt, en wordt er verder gezocht. Op die manier wordt de
hele zoekruimte afgelopen, met snoeien uiteraard. Dit kan uitgevoerd worden in Ramo
via het menu �Oplossen� → �Bepaal aantal oplossingen�.
In Figuur 8.7 zien we enkele voorbeelden. Deze voorbeelden zijn ook te vinden op de
bijgeleverde cd in de map �Test�les/BepaalAantalOplossingen�. Het algoritme kan bvb.
gebruikt worden om te bepalen op hoeveel manieren een bepaalde beschrijving in een
![Page 98: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/98.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 92
cel kan gerealiseerd worden (Voorbeeld 1). Voor dit voorbeeld werden de opties voor de
productieregels uitgevinkt die bepalen dat er moet gestart en geëindigd worden op de
tonica, omdat dit het aantal oplossingen zou beperken. De andere 2 voorbeelden werden
wel met de standaardproductieregels opgelost. Tabel 8.1 geeft de resultaten weer voor
elk van deze voorbeelden, incl. de tijd die nodig was om het aantal oplossingen te
bepalen.
Figuur 8.7: Testopgaven waarvoor het aantal oplossingen bepaald wordt
Opgave Aantal oplossingen Tijd
Voorbeeld 1 15 16 msVoorbeeld 2 419 2958 msVoorbeeld 3 136172 475375 ms
Tabel 8.1: Aantal oplossingen + tijdmeting voor enkele testopgaven
Dat er zoveel mogelijke harmonisaties zijn voor een korte sopraan van slechts 8 noten,
is wel een interessante observatie. Als harmoniestudent heeft men vaak het gevoel dat
er slechts enkele oplossingen mogelijk zijn. Dat blijkt dus niet zo te zijn!
Doordat er zoveel oplossingen mogelijk zijn, hebben we niet geprobeerd álle oplossin-
gen te genereren. Dit zou veel geheugen vragen, en het zijn sowieso toch veel meer
oplossingen dan de gebruiker ooit zal bekijken. Daarom hebben we ons beperkt tot
het tellen van het aantal oplossingen. Indien de gebruiker meerdere oplossingen wenst,
kan hij het willekeurig algoritme gewoon meerdere keren na elkaar uitvoeren.
![Page 99: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/99.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 93
8.3 Algoritme met vooruitkijken voor beschrijvingen
8.3.1 Bedoeling
In het vorige algoritme was de keuze van de beschrijvingen soms niet echt logisch.
Wanneer er bvb. in do groot een sol in de bas staat, is5V
de meest logische beschrijving
voor deze cel. Het is zeer ongebruikelijk om in dit geval de beschrijving6
IIIaan de
cel toe te kennen. Toch zal het willekeurig algoritme aan deze beide beschrijvingen
dezelfde kans geven. In het algoritme dat we hier bespreken, is het de bedoeling de
keuze voor de beschrijvingen te verbeteren. Onlogische beschrijvingen willen we in de
mate van het mogelijke vermijden, door prioriteit te geven aan de meest �muzikale�
keuze.
8.3.2 Benaderingen
Om de keuze van de beschrijvingen te verbeteren, zijn verschillende benaderingen mo-
gelijk. Een eerste mogelijkheid is per cel de mogelijke beschrijvingen te sorteren met
behulp van de heuristische regels, zodat de beste keuze eerst komt en de minst logische
keuzes op het einde. Een tweede mogelijkheid is te werken met een harmonisatieplan
(zie ook 4.2.3). Dit zou inhouden dat we eerst alle beschrijvingen vastleggen, rekening
houdend met de heuristische regels, en dan pas de noten invullen. Deze benaderingen
bleken echter allebei niet goed te presteren. We beschrijven eerst de problemen die
deze benaderingen met zich meebrachten, en zetten daarna de gebruikte benadering
uiteen.
Beschrijvingen sorteren per cel
Per cel kan men aan elke mogelijke beschrijving een score laten toekennen door de heu-
ristische regels. Vervolgens kan men de beschrijvingen dan volgens deze score sorteren
in a�opende volgorde. Op die manier worden de beschrijvingen met de hoogste score
eerst geprobeerd.
In Figuur 8.8 zien we een voorbeeld in do groot waarin de beschrijvingen moeten ge-
kozen worden. Onder elke basnoot staan verticaal de mogelijke beschrijvingen voor
die basnoot weergegeven. De heuristische regels zouden - terecht - voor cel 1 de be-
schrijving5I
verkiezen en voor cel 3 beschrijving de6Iverkiezen. Voor cel 2 zou de
beschrijving5II
gekozen worden, wat op zich geen slechte beschrijving is. De heuris-
tische regels geven echter een hogere score aan de sequentie5I-
6V II
-6I
dan aan de
![Page 100: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/100.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 94
sequentie5I-
5II
-6I, waardoor het in deze context beter zou zijn toch voor
6V II
te
kiezen. Wanneer we de beschrijvingen enkel per cel sorteren, wordt er geen rekening
gehouden met de sequenties die men in de gegeven context zou kunnen vormen. We
hebben dus een benadering nodig die niet enkel met de huidige cel rekening houdt,
maar ook met de andere cellen eromheen.
Figuur 8.8: Voorbeeld: 3 cellen met hun mogelijke beschrijvingen
Volledig harmonisatieplan
Een benadering die wel rekening houdt met de andere cellen, is een benadering waarbij
een harmonisatieplan wordt opgesteld. Men legt dan eerst alle beschrijvingen vast,
rekening houdend met de heuristische regels. Daarna worden de noten ingevuld.
Het probleem met deze benadering is dat de opgave niet altijd oplosbaar is met de
vastgelegde beschrijvingen. Uit experimenten bleek dat slechts bij een gegeven bas en
wanneer enkel kwintakkoorden gebruikt worden, er een redelijke kans bestaat dat de
opgave na het vastleggen van de beschrijvingen nog oplosbaar zal zijn.
Wanneer een andere stem dan de bas gegeven is, bvb. de sopraan, is de opgave na het
vastleggen van de beschrijvingen vaak niet oplosbaar. Een verklaring hiervoor is dat
de verbindingsregels veel strikter zijn voor de sopraan en voor de middenstemmen dan
voor de bas. Als dan een andere stem dan de bas gegeven is, kan vaak geen geldige
verbinding meer gevonden worden. In Figuur 8.9 zien we een voorbeeld in do groot
waarbij de sopraan gegeven is en het harmonisatieplan reeds volledig ingevuld is. In
het harmonisatieplan vinden we voor cel 3 en 4 resp. de beschrijvingen5
IVen
5V
. Dit
zijn wel plausibele beschrijvingen, maar de verbinding5
IV-
5V
eist dat de sopraan, alt
en tenor dalen. Doordat in de sopraan reeds de stijgende noten fa - sol zijn ingevuld,
is deze opgave dus niet oplosbaar.
Ook bij het gebruik van septiemakkoorden, zelfs voor een gegeven bas, blijken de regels
meestal te streng te zijn, waardoor de opgave onoplosbaar wordt.
![Page 101: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/101.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 95
Figuur 8.9: Harmonisatieplan dat de opgave onoplosbaar maakt
Oplossing: lokaal harmonisatieplan
Uit het voorgaande blijkt dat we best rekening houden met de context om de beschrij-
vingen te kiezen, maar dat alle beschrijvingen in één keer vastleggen ook niet goed
werkt. We hebben dus een meer lokale aanpak nodig die zich echter niet beperkt tot
één cel. Ook willen we de beschrijvingen niet onherroepelijk vastleggen, maar willen
we erop kunnen terugkomen indien nodig. De oplossing bestond erin te werken met
een lokaal harmonisatieplan. Dit is een harmonisatieplan dat op slechts enkele cellen
betrekking heeft, en dat voor elke cel herzien wordt. In het backtracking-algoritme
wordt hiervoor gebruik gemaakt van vooruitkijken. Dit betekent dat, behalve de huidi-
ge cel, ook nog een aantal volgende cellen worden bekeken en in rekening genomen bij
het nemen van de beslissing voor de huidige cel. Het aantal cellen dat vooruitgekeken
wordt, is variabel en kan door de gebruiker ingesteld worden in Ramo.
8.3.3 Algoritme
Voorbeeld
Om dit algoritme te illustreren, bekijken we het voorbeeld in Figuur 8.10. Ook hier is
de opgave een bas in do groot en werken we enkel met kwintakkoorden. De eerste vijf
cellen zijn al ingevuld. We moeten nu starten met het invullen van cel 6. Zoals bij het
vorige algoritme, kiezen we ook hier eerst de beschrijving voor de cel. We kiezen de
beschrijving deze keer echter niet willekeurig, maar door het opstellen van een lokaal
harmonisatieplan. Hiervoor kijken we bvb. 2 cellen vooruit, wat betekent dat we cel 6
tot en met 8 in rekening nemen om de beschrijving voor cel 6 te kiezen.
In Figuur 8.11 zijn verticaal onder de basnoten de mogelijke beschrijvingen voor cel
6, 7 en 8 weergegeven. Uit de beschrijvingen genereren we nu alle geldige combina-
ties. Aangezien er voor elk van de 3 cellen 3 mogelijke beschrijvingen zijn, zijn er in
totaal 33 = 27 combinaties, maar die zijn niet allemaal geldig. Zo is onder andere64II
-64
III
een ongeldige verbinding. Het genereren van deze geldige combinaties ge-
beurt ook door backtracking met snoeien, waarbij voor het snoeien uiteraard enkel de
![Page 102: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/102.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 96
Figuur 8.10: Voorbeeldopgave voor algoritme met vooruitkijken voor beschrijvingen
Figuur 8.11: Beschrijvingen gegenereerd door de productieregels voor cel 6, 7 en 8
beschrijvingsregels gebruikt worden. Hierbij worden enkel de verbindingen binnen de
cellen 6, 7 en 8 gecheckt. De verbinding met de voorgaande cellen wordt pas later
gecontroleerd. De reden hiervoor is dat we deze combinaties willen cachen, om even-
tueel later opnieuw te gebruiken bij een andere invulling voor de cellen 1 t.e.m. 5. Het
genereren van de combinaties gebeurt immers maar één keer, terwijl ze later misschien
wel meerdere keren in verschillende contexten zullen geëvalueerd worden. We bekomen
op deze manier 20 geldige combinaties:
5
V I
5
V II
5
I
5
V I
6
V
6
4
IV
6
IV
5
V II
6
4
IV
6
4
II
5
V II
6
V I
5
V I
5
V II
6
V I
5
V I
6
4
III
6
V I
6
IV
6
V
5
I
6
4
II
5
V II
6
4
IV
5
V I
5
V II
6
4
IV
5
V I
6
4
III
6
4
IV
6
IV
6
V
6
V I
6
4
II
6
V
5
I
5
V I
6
V
5
I
6
IV
5
V II
5
I
6
IV
6
V
6
4
IV
6
4
II
6
V
6
V I
5
V I
6
V
6
V I
6
IV
5
V II
6
V I
6
4
II
5
V II
5
I
6
4
II
6
V
6
4
IV
We willen al deze combinaties nu rangschikken van �goed� naar �slecht�. Dit doen
we door quoteringen toe te kennen, voorgesteld door een geheel getal. Hoe hoger de
quotering, hoe beter de combinatie. Om deze quotering toe te kennen, bekijken we
niet enkel de combinatie zelf, maar ook de 3 beschrijvingen die eraan voorafgaan. In
dit geval zijn dat de beschrijvingen uit cellen 3 tot 5, namelijk5V
5I
5V
. Voor elke
![Page 103: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/103.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 97
combinatie moet dus5V
5I
5V
gezet worden. Op deze manier wordt ook rekening
gehouden met eventuele sequenties die ontstaan in combinatie met de voorgangers. Er
worden 3 voorgangers bekeken, en niet meer dan 3, omdat de heuristische regels die tot
nu toe geïmplementeerd werden, geen quoteringen toekennen aan langere sequenties.
Zoals reeds eerder gezegd, werden de beschrijvingsregels bij het genereren van deze
combinaties enkel gecheckt voor de beschrijvingen binnen de combinatie zelf. We eva-
lueren nu ook de verbinding van de combinatie met zijn voorgangers aan de hand van
deze beschrijvingsregels. Voor sommige combinaties zal blijken dat de verbinding met
zijn voorgangers ongeldig is. Deze combinaties krijgen dan −1 als quotering. Voor de
overige combinaties wordt de quotering bepaald door de heuristische regels. Vervolgens
sorteren we de combinaties volgens a�opende quotering en we bekomen:
1.
5
V
5
I
5
V
6
IV
6
V
5
I(score: 29.0) 11.
5
V
5
I
5
V
5
V I
6
V
6
4
IV
(score: −1.0)
2. 5
V
5
I
5
V
5
V I
6
V
5
I(score: 26.0) 12.
5
V
5
I
5
V
6
IV
5
V II
6
4
IV
(score: −1.0)
3. 5
V
5
I
5
V
6
IV
6
V
6
V I(score: 24.0) 13.
5
V
5
I
5
V
5
V I
5
V II
6
4
IV
(score: −1.0)
4. 5
V
5
I
5
V
5
V I
6
V
6
V I(score: 21.0) 14.
5
V
5
I
5
V
6
IV
6
V
6
4
IV
(score: −1.0)
5. 5
V
5
I
5
V
6
IV
5
V II
5
I(score: 21.0) 15.
5
V
5
I
5
V
6
4
II
6
V
6
4
IV
(score: −1.0)
6. 5
V
5
I
5
V
6
4
II
6
V
5
I(score: 21.0) 16.
5
V
5
I
5
V
6
4
II
5
V II
6
4
IV
(score: −1.0)
7. 5
V
5
I
5
V
5
V I
5
V II
5
I(score: 21.0) 17.
5
V
5
I
5
V
5
V I
6
4
III
6
V I(score: −1.0)
8. 5
V
5
I
5
V
5
V I
5
V II
6
V I(score: 19.0) 18.
5
V
5
I
5
V
5
V I
6
4
III
6
4
IV
(score: −1.0)
9.
5
V
5
I
5
V
6
IV
5
V II
6
V I(score: 19.0) 19.
5
V
5
I
5
V
6
4
II
5
V II
6
V I(score: −1.0)
10. 5
V
5
I
5
V
6
4
II
6
V
6
V I(score: 16.0) 20.
5
V
5
I
5
V
6
4
II
5
V II
5
I(score: −1.0)
In geval van gelijkstand werd een willekeurige volgorde genomen. Op basis van deze
gesorteerde combinaties kunnen we nu een sortering opstellen van de beschrijvingen
voor cel 6. Daarvoor overlopen we alle combinaties van boven naar onder, en voegen
telkens de beschrijving voor cel 6 toe aan een lijst, voor zover die beschrijving nog niet
in de lijst voorkomt.
We starten met de eerste combinatie, namelijk 6
IV
6
V
5
I. Dit is de combinatie die we
als optimaal beschouwen voor de cellen 6 tot en met 8., want deze heeft de hoogste score
gekregen. Deze combinatie noemen we dan ook het lokaal harmonisatieplan voor de
cellen 6 tot en met 8. Dit is namelijk de combinatie die we bij voorkeur willen realiseren.
Om deze combinatie te kunnen realiseren, moeten we dus ook de beschrijving voor cel
6 uit deze combinatie als eerste keuze nemen voor cel 6. Deze beschrijving is6
IV. We
voegen deze als eerste toe aan de lijst:
![Page 104: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/104.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 98
6IV
Vervolgens bekijken we de tweede combinatie. Dit is de tweede keuze, voor het geval de
eerste combinatie niet realiseerbaar blijkt. In deze combinatie vinden we beschrijving5
V Ivoor cel 6. Deze beschrijving komt nog niet voor in de lijst, dus we voegen ze toe:
6IV
,5
V I
Vervolgens vinden we in de derde combinatie de beschrijving6
IVvoor cel 6. Deze
komt wel al voor in de lijst. Het heeft geen zin een beschrijving 2x op te nemen in
een gesorteerde lijst, dus we voegen de beschrijving niet toe aan de lijst. Hetzelfde
geldt voor combinatie 4 en combinatie 5. In combinatie 6 vinden we dan de beschrij-
ving64II
voor cel 6. Deze beschrijving kwam nog niet voor in de lijst, en wordt dus
toegevoegd:
6IV
,5
V I,
64II
In combinaties 7 t.e.m. 20 vinden we geen beschrijvingen meer voor cel 6 die niet in de
lijst voorkomen. De volgorde waarin de beschrijvingen voor cel 6 geprobeerd worden,
ligt dus nu vast. De beschrijvingen zullen in deze volgorde geprobeerd worden, en de
noten worden ingevuld op dezelfde manier als in het willekeurig algoritme.
Merk op dat we hier enkel een volgorde vastleggen voor cel 6, en dat we niets vastleggen
voor cel 7 en 8. We kijken dus meer dan 1 cel vooruit, om de beschrijving voor slechts 1
cel vast te leggen. Op die manier kan het harmonisatieplan voortdurend herzien worden.
Voor cel 7 wordt dezelfde procedure gewoon opnieuw gestart, waarbij vooruitgekeken
wordt tot en met cel 9. Doordat er dan een cel verder vooruitgekeken wordt, is er
informatie voorhanden die we in de vorige stap niet hadden. Het is perfect mogelijk
dat de combinatie die we voor cel 6 tot en met 8 als eerste keuze beschouwden, namelijk6
IV
6
V
5
I, op basis van deze nieuwe informatie toch niet optimaal blijkt te zijn. De
sortering van de beschrijvingen voor cel 7 wordt dan opgesteld op basis van de nieuwe
sortering van combinaties. Er wordt hierbij geen rekening meer gehouden met wat we
in de vorige stap, toen de volgorde van de beschrijvingen voor cel 6 werd bepaald, als
beste keuze beschouwden.
![Page 105: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/105.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 99
Algoritme in pseudocode
Voor het algoritme in pseudocode verwijzen we naar Algoritme 5 en Algoritme 6. Dit
algoritme werkt in feite op juist dezelfde manier als het willekeurige algoritme. Enkel
de volgorde waarin de beschrijvingen geprobeerd worden is anders, maar deze volgorde
wordt van buitenaf bepaald door de policy. Het algoritme in pseudocode voor het
bepalen van de volgorde van de beschrijvingen, is weergegeven in Algoritme 7.
Op lijn 1 vinden we de methodeoproep genereerCombinaties(celindex, aantalVooruit-
kijken). Hier worden alle geldige combinaties gegenereerd voor de cellen vanaf celindex
tot en met celindex + aantalVooruitkijken. De gegenereerde combinaties zullen dus
aantalVooruitkijken + 1 cellen lang zijn.
Op lijn 3 vinden we de methodeoproep evalueer(C, celindex, 3). Dit betekent dat de
combinatie geldt voor positie celindex en volgende, en dat de drie cellen voor celindex
ook in rekening moeten genomen worden bij de evaluatie. Uiteraard worden er minder
voorafgaande cellen in rekening genomen wanneer celindex < 3. Bij het evalueren wordt
eerst de geldigheid van de verbinding nagegaan. Indien ongeldig krijgt de combinatie
de score −1. Indien geldig, bepalen de heuristische regels de score.
Algoritme 7 Bepalen van de volgorde voor de beschrijvingenParameters: index van de huidige cel celindex, aantal cellen vooruitkijken aantal-
VooruitkijkenReturns: gesorteerde lijst met beschrijvingen voor cel celindex1: Stel combinatieLijst ← genereerCombinaties(celindex, aantalVooruitkijken)2: for elke combinatie C in combinatieLijst do
3: evalueer(C, celindex, 3)4: end for
5: sorteerVolgensScore(combinatieLijst)6: for elke combinatie C in combinatieLijst do
7: Stel B ← eerste beschrijving in C8: if not gesorteerdeLijst.contains(B) then
9: gesorteerdeLijst.add(B)10: end if
11: end for
12: return gesorteerdeLijst
8.3.4 Resultaten
De resultaten van dit algoritme voor de vier standaardvoorbeelden, zijn weergegeven
in Figuur 8.12.
![Page 106: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/106.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 100
Figuur 8.12: Resultaten van het algoritme met vooruitkijken voor beschrijvingen
![Page 107: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/107.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 101
Voorbeeld 1: Gegeven bas
Dit algoritme geeft duidelijk een betere keuze voor de beschrijvingen bij de bas dan het
willekeurige algoritme. Zo wordt er bvb. nu wel degelijk 5
Vgekozen in maat 4, waar
het vorige algoritme soms 6
IIIkoos. Dat de noten nog steeds in willekeurige volgorde
gekozen worden, is echter goed te merken. Zo wordt er in het slotakkoord gesprongen
met de middenstemmen, die nochtans ook zouden kunnen blijven liggen. Ook in maten
4, 8 en 12 hadden de stemmen kunnen blijven liggen in plaats van te springen, om zo
een rustpunt in te lassen op het einde van een muzikale zin.
Voorbeeld 2: Gegeven sopraan
Het algoritme doet er hier 1779 ms over om de sopraan te harmoniseren, wat veel langer
is dan de 172 ms die nodig waren om een bas te harmoniseren. Dit komt doordat hier
combinaties van beschrijvingen gegenereerd worden, en dit er bij een sopraan veel meer
zijn dan bij een bas. Hier speelt het dus voor de uitvoeringstijd wel een rol dat het om
een gegeven sopraan gaat.
Ook hier is de keuze van de beschrijvingen beter dan bij het willekeurige algoritme,
maar opvallend is dat er toch geen goede slotcadens is. Nochtans is een goede slotcadens
hier wel degelijk de eerste keuze, maar het algoritme slaagt er niet in deze eerste keuze
te realiseren. Dit is een van de problemen die we zullen aanpakken in het volgende
algoritme.
Voorbeeld 3: Modulatie
Ook hier vinden we een betere keuze van de beschrijvingen. Bij de modulaties is het
spilakkoord correct, maar is er nog steeds geen goede toonaardbevestiging. Zoals bij
de slotcadens in het voorbeeld met de sopraan, slaagt het algoritme er niet in de beste
keuze te realiseren. Bij het volgende algoritme zal een extra optie voorzien worden
om de kans te vergroten dat de toonaardbevestiging na een modulatie kan gerealiseerd
worden.
Voorbeeld 4: Lege cellen
Het algoritme doet er 5484 ms over om deze sopraan te harmoniseren, waarin drie noten
ontbreken. De lege cellen hebben hier duidelijk grote invloed op de tijd die nodig is
om de sopraan te harmoniseren. Wel worden de lege cellen ingevuld met een sequentie
die van de heuristische regels een hoge score krijgt. De invulling van de lege cellen is
dus veel beter dan bij het willekeurig algoritme.
![Page 108: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/108.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 102
Algemeen
De keuze van de beschrijvingen is in dit algoritme duidelijk muzikaler dan in het vorige
algoritme. Wel vertonen de noten nog hetzelfde �willekeurige� gedrag als het willekeurig
algoritme. Wat de snelheid betreft, is dit algoritme trager dan het willekeurig algoritme,
en heeft het aantal combinaties een duidelijk merkbare invloed op de uitvoeringstijd.
De tijden om een opgave te harmoniseren blijven echter altijd aanvaardbaar.
![Page 109: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/109.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 103
8.4 Algoritme met vooruitkijken voor beschrijvingen
en noten
8.4.1 Bedoeling
Dit algoritme heeft twee bedoelingen. De eerste bedoeling is het verbeteren van de
keuze voor de noten. Het vorige algoritme zorgde dan wel voor een betere keuze van
de beschrijvingen, maar de noten werden nog steeds in willekeurige volgorde overlopen.
Het zou logisch zijn ook voor de noten de voorkeur te geven aan bepaalde noten om
zo een �mooie� melodie te bekomen. We kunnen bvb. grote sprongen in de sopraan
vermijden, streven naar tegenbeweging tussen bas en sopraan etc.
De tweede bedoeling is de kans vergroten dat het lokaal harmonisatieplan ook echt
kan gerealiseerd worden in de cellen. Bij het vorige algoritme treedt hierbij soms een
probleem op, dat we hier eerst toelichten.
In Figuur 8.13 zien we de eerste maat van een gegeven sopraan in re groot. We passen
hierop nu het vorige algoritme toe. Alle geldige combinaties van beschrijvingen worden
dus gegenereerd voor de eerste drie cellen, en deze worden gesorteerd volgens a�opende
score.
Figuur 8.13: Voorbeeldopgave: gegeven sopraan in re groot
Omdat het aantal combinaties vrij groot is, geven we hier enkel de eerste 10 weer:
1. 5
I
6
V II
6
I(score: 13.0) 6. 5
I
5
IV
6
4
I
(score: 9.0)
2. 5
I
6
IV
6
I(score: 9.0) 7. 5
I
6
V II
5
IV(score: 9.0)
3. 5
I
6
V II
6
IV(score: 9.0) 8. 5
I
6
V II
6
4
I
(score: 9.0)
4. 5
I
6
V II
5
V I(score: 9.0) 9. 5
I
6
IV
5
I(score: 9.0)
5. 5
I
6
II
6
4
I
(score: 9.0) 10. 5
I
6
IV
5
V I(score: 9.0)
Het lokaal harmonisatieplan voor cellen 1 tot en met 3 is dus 5
I
6
V II
6
I. We streven er
dus naar deze combinatie van beschrijvingen te realiseren. Volgens het vorige algoritme
kiezen we beschrijving 5
Ivoor de eerste cel. Vervolgens worden de noten ingevuld, die
in willekeurige volgorde geprobeerd worden. Het resultaat hiervan zien we in Figuur
8.14.
![Page 110: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/110.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 104
Figuur 8.14: Voorbeeldopgave: eerste cel is ingevuld.
Dit proces herhaalt zich nu voor cel 2. De combinaties worden nu geëvalueerd met de
eerste cel als voorganger. De eerste 10 gesorteerde combinaties zijn de volgende:
1. 5
I
6
V II
6
I
5
IV(score: 19.0) 6. 5
I
5
II
6
I
5
IV(score: 15.0)
2. 5
I
6
V II
6
I
6
I(score: 16.0) 7. 5
I
6
IV
6
I
5
IV(score: 15.0)
3. 5
I
6
V II
6
I
5
V I(score: 16.0) 8. 5
I
6
V II
6
I
6
V I(score: 14.0)
4. 5
I
6
V II
6
I
5
I(score: 16.0) 9. 5
I
5
IV
6
I
5
IV(score: 13.0)
5. 5
I
6
V II
6
I
6
IV(score: 16.0) 10. 5
I
6
II
6
I
5
IV(score: 13.0)
De eerste keuze voor cellen 2 tot en met 4 is 6
V II
6
I
5
IV. Het lokaal harmonisatieplan
uit de vorige stap, 5
I
6
V II
6
I, is dus nog steeds een goede keuze. De eerste beschrij-
vingen die we proberen voor cel 2, zijn dus 6
V II, 5
II, 6
IV, 5
IVen 6
II. Het is hier
dat het probleem zich situeert. Wanneer we de eerste keuze 6
V IIproberen, blijkt dit
te falen. De beschrijving 6
V IIvraagt in re groot namelijk een mi in de bas. Een hoge
mi is echter geen optie, want die valt buiten het stembereik van de bas. Een lage mi
is ook geen optie, want in cel 1 staat er een hoge re in de bas. Dat zou leiden tot een
septimesprong in de bas, wat een verboden interval is. Er is dus geen mogelijkheid om
deze beschrijving te realiseren. De volgende beschrijving 5
IIvereist ook een mi in de
bas, dus hier hebben we juist hetzelfde probleem. De derde beschrijving 6
IVslaagt wel
en leidt uiteindelijk tot de oplossing die weergegeven is in Figuur 8.15. Deze oplossing
is echter duidelijk suboptimaal, want de gebruikte combinatie van beschrijvingen is
slechts zevende in de sortering. Het algoritme is er niet in geslaagd de eerste keuze te
realiseren.
Figuur 8.15: Voorbeeldopgave: suboptimale oplossing
![Page 111: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/111.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 105
Veronderstel nu dat in Figuur 8.14 in cel 1 in de bas geen hoge re stond, maar een lage
re. Dan hadden we in de tweede cel probleemloos een lage mi in de bas kunnen zetten.
De lage mi is niet buiten stembereik voor de bas, en vormt ook geen verboden interval
met de lage re in cel 1. De eerste keuze voor de beschrijving voor cel 1, 6
V II, kan dan
wel degelijk gerealiseerd worden, en leidt bvb. tot de oplossing in Figuur 8.16. Deze
oplossing is beter, want hier wordt de eerste keuze wel gerealiseerd.
Figuur 8.16: Voorbeeldopgave: betere oplossing
Het probleem hier is dus in feite dat het lokaal harmonisatieplan niet kan gerealiseerd
worden, terwijl het met een andere keuze voor de noten in cel 1 wel mogelijk was
geweest. Door in de keuze van de noten ook hiermee rekening te houden, willen we
dergelijke problemen vermijden.
8.4.2 Algoritme
Dit algoritme heeft twee interessante eigenschappen, namelijk het vergroten van de
kans dat het lokaal harmonisatieplan kan gerealiseerd worden, en het verbeteren van
de keuze voor de noten. Omdat deze eerste eigenschap het best tot zijn recht komt bij
een gegeven sopraan, en de tweede eigenschap beter tot zijn recht komt bij een gegeven
bas, bespreken we dit algoritme aan de hand van twee voorbeelden. Het betreft hier
andere (kortere) voorbeelden dan de standaardvoorbeelden.
Voorbeeld 1: Gegeven sopraan
We hernemen het voorbeeld uit de vorige sectie. In de vorige sectie bleek dat het
algoritme met vooruitkijken voor enkel de beschrijvingen er hier niet altijd in slaagde
de beste combinatie te realiseren. We zullen zien dat het algoritme met vooruitkijken
voor beschrijvingen en noten hier wel in slaagt. Een ander belangrijk verschil met het
vorige algoritme, is dat er niet meer over beschrijvingen en noten geïtereerd wordt,
maar wel over combinaties van beschrijvingen en over realisaties van akkoorden.
De opgave van het voorbeeld is te zien in Figuur 8.13. Eerst worden alle combinaties
voor de beschrijvingen gegenereerd en gesorteerd, op dezelfde manier als in het vorige
![Page 112: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/112.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 106
algoritme. Het resultaat hiervan is dezelfde gesorteerde lijst met combinaties als de
lijst op pagina 103.
De volgende stap is nu het genereren van alle combinaties voor de noten. Dit is echter
minder evident dan het genereren van alle combinaties voor de beschrijvingen. Voor
welke beschrijvingen moeten we immers de combinaties van noten genereren?
De oplossing bestond erin af te stappen van het itereren over een gesorteerde lijst
beschrijvingen voor één cel, maar over de volledige combinaties van beschrijvingen
te itereren. Bij het genereren van alle combinaties van noten, wordt dan telkens de
huidige combinatie van beschrijvingen doorgegeven, zodat het algoritme weet voor
welke beschrijvingen de combinaties van noten moeten gegenereerd worden.
De eerste combinatie van beschrijvingen die geprobeerd wordt, is logischerwijs de com-
binatie die bovenaan de rangschikking staat, namelijk 5
I
6
V II
6
I. Men zou nu kunnen
exhaustief alle combinaties van noten genereren voor de gekozen beschrijvingen. We
gaan echter op een iets andere manier te werk, waarbij er gemakkelijker tussenresulta-
ten kunnen opgeslagen worden.
Eerst worden voor elke cel afzonderlijk alle geldige realisaties gegenereerd van de be-
schrijving die moet gerealiseerd worden. Hierbij worden dus enkel akkoordregels geë-
valueerd. Voor cel 1 bestaan er 4 mogelijke realisaties voor de beschrijving 5
I. Voor
cel 2 is er slechts één geldige realisatie voor de beschrijving 6
V IIen voor cel 3 zijn er
10 realisaties mogelijk voor de beschrijving 6
I. Al deze mogelijke realisaties voor de
cellen 1, 2 en 3 zijn weergegeven in Figuur 8.17.
Deze realisaties worden opgeslagen in een realisatiecataloog . Voor elke cel wordt een
dergelijke realisatiecataloog bijgehouden die beschrijvingen mapt op een lijst van re-
alisaties. In de implementatie is dit een Map van het type HashMap<Description,
List<Realisation> >. Indien de huidige poging niet slaagt, zullen er waarschijnlijk
nog andere beschrijvingen voor deze cel geprobeerd worden. Ook voor deze beschrijvin-
gen worden dan de mogelijke realisaties gegenereerd en in de realisatiecataloog opgesla-
gen. Wanneer we dan een volgende keer (na backtracking) de realisaties nodig hebben
voor dezelfde beschrijving voor dezelfde cel, hoeven we ze niet opnieuw te genereren,
maar kunnen we ze gewoon in realisatiecataloog opzoeken. De realisatiecataloog dient
dus als een soort cache, die de e�ciëntie ten goede komt.
We kennen nu de geldige realisaties voor de drie cellen, maar we weten nog niet welke
er op een geldige manier met elkaar kunnen verbonden worden. Via backtracking
worden nu de geldige combinaties van deze realisaties bepaald. Hierbij moeten de
beschrijvingsregels niet gecheckt worden, want die zijn al gecheckt op het moment dat
de combinaties van beschrijvingen gegenereerd werden. Ook de akkoordregels moeten
niet gecheckt worden, want die zijn gecheckt bij het genereren van de realisaties. Slechts
![Page 113: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/113.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 107
Figuur 8.17: Mogelijke realisaties voor cellen 1, 2 en 3
4 combinaties van realisaties blijken geldig te zijn. Deze zijn weergegeven in Figuur
8.18.
Net zoals we bij het vorige algoritme twee cellen vooruitkeken om de beschrijvingen
voor één cel te bepalen, kijken we nu twee cellen vooruit om de realisaties voor één cel
te bepalen. Alle combinaties in Figuur 8.18 blijken dezelfde invulling te hebben voor
cel 1. Slechts één van de vier 5
Irealisaties voor cel 1 blijkt dus te leiden naar een
realisatie van de combinatie 5
I
6
V II
6
I. Dit is de realisatie die omkaderd is in Figuur
8.17. We zullen dan ook enkel deze realisatie als mogelijkheid behouden, omdat we
van de andere realisaties nu al weten dat ze het lokaal harmonisatieplan niet kunnen
realiseren. De gekozen realisatie wordt dan ingevuld in de cel, waarna het proces zich
herhaalt voor cel 2 enz. tot het einde bereikt is. Uiteraard wordt er ook teruggekeerd
naar de vorige cellen indien een deeloplossing niet tot een globale oplossing leidt.
Merk op dat de andere realisaties daarom niet weggegooid worden. Indien het huidige
lokaal harmonisatieplan na backtracking toch niet tot een oplossing blijkt te leiden,
zullen andere combinaties van beschrijvingen geprobeerd worden voor de cellen 1 tot
en met 3. Indien die realisaties voor deze andere combinaties wel goed blijken te zijn,
zullen ze dan wel geprobeerd worden. Er worden in dit algoritme dus zeker nooit
geldige mogelijkheden overboord gegooid.
Wanneer we bij het selecteren van de realisaties voor het luxeprobleem staan dat meer-
dere realisaties het lokaal harmonisatieplan kunnen realiseren, kunnen we ook nog
prioriteit geven aan de realisatie die tot de meest muzikale invulling leidt. Wat de
![Page 114: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/114.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 108
Figuur 8.18: Alle realisaties voor de combinatie 5I
6V II
6I
meest muzikale invulling is, wordt bepaald door de heuristische regels. Deze situatie
doet zich echter vaker voor bij een bas dan bij een sopraan, dus bekijken we nu een
voorbeeld met een gegeven bas.
Voorbeeld 2: Gegeven bas
De voorbeeldopgave met gegeven bas is weergegeven in Figuur 8.19. Cel 1 is al ingevuld
door het algoritme. Er moet dus nu gestart worden met het invullen van cel 2.
Figuur 8.19: Voorbeeldopgave met gegeven bas
Opnieuw worden alle geldige combinaties voor de beschrijvingen bepaald. Deze wor-
den geëvalueerd, waarbij ook cel 1 in rekening genomen wordt. Er blijken slechts 4
combinaties geldig te zijn:
1. 5
I
5
I
6
I
6
II(score: 13.0)
2. 5
I
5
I
6
I
5
IV(score: 13.0)
![Page 115: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/115.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 109
3. 5
I
5
I
5
III
5
IV(score: 8.0)
4. 5
I
6
V I
5
III
5
IV(score: 6.0)
De eerste keuze voor de beschrijvingen voor cel 2 tot en met 4 blijkt 5
I
6
I
6
IIte
zijn. Vervolgens worden op dezelfde manier als in het vorige voorbeeld alle realisaties
gegenereerd voor cellen 2, 3 en 4, en worden de geldige combinaties van realisaties
gegenereerd. We laten de details hiervan achterwege. Er blijken twee realisaties van5
Ite zijn voor cel 2 die tot een geldige invulling van het lokaal harmonisatieplan leiden.
Deze twee realisaties zijn weergegeven in Figuur 8.20.
Figuur 8.20: Realisaties voor cel 2 die het lokaal harmonisatieplan doen slagen
In totaal blijken er 34 combinaties van realisaties te zijn die een geldige invulling zijn
voor de beschrijvingen 5
I
6
I
6
II. In Figuur 8.21 zijn enkele hiervan weergegeven, met
hun rangnummer in de sortering en hun score. We zien bvb. dat de heuristische regels
voorrang geven aan tegenbeweging tussen sopraan en bas. De dalende beweging mi-do
in de sopraan in cellen 2 en 3 in de combinatie met rangnummer 1 is bvb. beter dan
de stijgende beweging mi-sol die we op dezelfde plaats vinden in de combinatie met
rangnummer 25. Anderzijds worden ook de parallelle sexten tussen sopraan en bas als
goed beschouwd. Deze zijn te zien in cellen 3 en 4 in de combinaties met rangnummer
1 en 11.
Het is ook hier de bedoeling door meerdere cellen vooruit te kijken, een volgorde voor
de realisaties voor slechts één cel te bepalen, namelijk cel 2. De beschrijvingen voor cel
2 die het lokaal harmonisatieplan kunnen realiseren hebben we al gevonden, dat zijn
de beschrijvingen in Figuur 8.20. Aangezien we hier twee mogelijkheden hebben die
het lokaal harmonisatieplan kunnen realiseren, gaan we ze ook nog sorteren naargelang
welke het lokaal harmonisatieplan �op de mooiste manier� kan realiseren. De realisaties
worden gesorteerd op dezelfde manier als de beschrijvingen in het vorige algoritme. De
eerste keuze zal dus de realisatie zijn die gebruikt wordt in de beste combinatie in
Figuur 8.21. We bekomen dan de sortering in Figuur 8.22. De eerste keuze voor de
realisatie wordt dan ingevuld in cel 2, waarna het proces zich herhaalt voor cel 3.
![Page 116: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/116.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 110
Figuur 8.21: Enkele geldige combinaties van realisaties voor 5I
6I
6II
Figuur 8.22: Sortering van de realisaties voor cel 2.
Algoritme in pseudocode
Hier gebruiken we een ander algoritme dan Algoritme 5 en 6, aangezien er niet over
beschrijvingen en noten maar wel over combinaties en realisaties geïtereerd wordt. Er
wordt ook niet meer gebruik gemaakt van mutueel recursieve methoden, maar van
slechts één recursieve methode probeerCombinaties(int celindex). Het algoritme
in pseudocode is weergegeven in Algoritme 8. Merk op dat in dit algoritme nergens
regels gecontroleerd worden! De realisaties in de lijst realisaties zijn immers altijd gel-
dig, doordat de regels bij het selecteren van de realisaties al gecheckt zijn. Indien geen
enkele realisatie kon gevonden worden die aan de regels voldoet, is de lijst realisaties
gewoon leeg.
![Page 117: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/117.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 111
Algoritme 8 Algoritme met vooruitkijken voor beschrijvingen en noten -probeerCombinaties(int celindex )Parameters: index v/d huidige cel celindexReturns: true indien succes, anders false1: { genereer alle geldige combinaties van beschrijvingen}2: Stel combinaties ← genereerBeschrijvingenCombinaties(celindex )3: { itereer over de combinaties }4: for elke combinatie huidigeCombinatie in combinaties do
5: { bepaal alle realisaties die huidigeCombinatie kunnen realiseren en sorteer vol-gens score }
6: Stel realisaties← getGesorteerdeRealisaties(celindex, huidigeCombinatie)7: { itereer over de realisaties }8: for elke realisatie R in realisaties do
9: cel.zetRealisatie(R) { zet zowel beschrijving als noten in de cel }10: if celindex = cellen.length − 1 or probeerCombinaties(celindex + 1) then
11: return true12: end if
13: end for
14: end for
15: return false
8.4.3 Opmerkingen
Combinatie uit vorige stap
Bij het vorige algoritme werd in geval van ex aequo tussen combinaties van beschrij-
vingen een willekeurige volgorde toegekend. Bij dit algoritme is het echter beter in dat
geval rekening te houden met de combinatie die voor de vorige cel werd gekozen.
Stel bvb. dat voor cel 1 de combinatie A B C de beste combinatie van beschrijvingen
was die kon gerealiseerd worden, en dat bij het rangschikken van de combinaties voor
cel 2 er een ex aequo is tussen B C D en B' C' D. Het is in dit geval beter voor B
C D te kiezen, omdat de realisatie van de beschrijving A in cel 1 zo gekozen is dat
die A B C op een zo mooi mogelijke manier kan realiseren. Om deze reden wordt bij
het opvragen van de combinaties van beschrijvingen ook telkens de combinatie uit de
vorige stap meegegeven.
Desactiveren van realisaties
Zoals reeds eerder beschreven, worden alle gegenereerde realisaties opgeslagen in een
realisatiecataloog. Een optimalisatie die we hier kunnen doorvoeren, is dat niet altijd
alle realisaties moeten geprobeerd worden. Van realisaties die al eerder geprobeerd
zijn, is immers al geweten dat die niet tot een oplossing geleid hebben. Stel bvb. dat in
een opgave voor cel 1 eerst de combinatie van beschrijvingen A B C wordt geprobeerd.
Stel dat er 10 mogelijke realisaties zijn voor beschrijving A, waarvan er drie het lokaal
![Page 118: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/118.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 112
harmonisatieplan doen slagen en deze 3 dus geprobeerd worden. Indien deze realisaties
uiteindelijk toch niet tot een oplossing leiden, wordt de volgende combinatie voor cel
1 geprobeerd, bvb. A B' C'. Het heeft nu geen zin die 3 realisaties nog opnieuw te
proberen, want we weten al dat die falen. We beperken ons dus nu tot de overige 7
realisaties voor A. Dit is goed voor de e�ciëntie omdat er naarmate men verder komt
in de lijst met combinaties, steeds minder realisaties moeten geprobeerd worden.
Deze realisaties worden echter niet uit de lijst verwijderd. Wanneer men na back-
tracking weer op dezelfde cel uitkomt, begint het proces immers weer van voor af aan,
en moeten wel degelijk alle realisaties geprobeerd worden. Daarom kunnen realisaties
als actief of niet actief gemarkeerd worden. Bij het overlopen van de realisaties, worden
niet actieve realisaties overgeslagen. Wanneer het proces start voor een cel, worden alle
realisaties (opnieuw) als actief gemarkeerd.
8.4.4 Resultaten
De resultaten van dit algoritme voor de vier standaardvoorbeelden zijn weergegeven in
Figuur 8.23.
Voorbeeld 1: Gegeven bas
Hier vinden we een goede keuze van de beschrijvingen, en de melodie is ook �muzikaler�.
Er zijn bvb. minder grote sprongen dan in de vorige oplossingen voor deze opgave. Wat
vooral opvalt, is dat er nu niet meer gesprongen wordt op de rustpunten. Zowel in het
slotakkoord, als in maten 4, 8 en 12 blijven de stemmen liggen.
Voorbeeld 2: Gegeven sopraan
Hier vinden we een betere keuze van de beschrijvingen dan bij het vorige algoritme,
ondanks het feit dat het vorige algoritme ook vooruitkijkt voor de beschrijvingen. Het
huidige algoritme slaagt er immers in de slotcadens te realiseren. Ook hier wordt er op
het slotakkoord niet gesprongen.
Verder valt hier ook de aaneensluitende bas op. De melodie van deze bas is veel minder
�willekeurig� dan die bij het willekeurige algoritme. Er zijn bvb. veel stijgende secunden
in de bas, wat door de heuristische regels als goed wordt beschouwd.
Voorbeeld 3: Modulatie
Net zoals de slotcadens in het voorbeeld met de sopraan, slaagt het algoritme er hier
ook in de toonaardbevestiging na de modulaties te realiseren.
![Page 119: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/119.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 113
Voorbeeld 4: Lege cellen
Dit algoritme vult de lege cellen wel in met een goede keuze voor de beschrijvingen en
noten, maar heeft nog meer last van het aantal combinaties dan het vorige algoritme.
Het algoritme deed er 15766 ms over om deze sopraan te harmoniseren, wat toch wel
vrij lang is.
Algemeen
Dit algoritme presteert duidelijk veel beter dan het willekeurig algoritme qua muzika-
liteit. Het algoritme moet echter niet enkel geëvalueerd worden in termen van muzi-
kaliteit, maar ook in termen van het al of niet realiseren van de eerste keuze voor de
beschrijvingen. Dat dit algoritme hier beter in slaagt dan het vorige algoritme, blijkt
onder andere uit de slotcadenzen en de toonaardbevestigingen na modulaties. Het eni-
ge probleem is de tijd wanneer er lege cellen zijn. In de volgende sectie zullen we een
optie voorzien om hieraan te verhelpen.
![Page 120: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/120.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 114
Figuur 8.23: Resultaten v/h algoritme met vooruitkijken voor beschrijvingen en noten
![Page 121: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/121.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 115
8.4.5 Uitbreidingen
Modulaties
Bij dit algoritme is er een optie �Extra vooruitkijken voor modulaties�. In Ramo kan
deze optie door de gebruiker aangevinkt worden. Zoals we zagen bij de testvoorbeelden,
lukt de toonaardbevestiging vaak wel, maar dit is niet altijd het geval. De bedoeling van
deze optie is de kans te vergroten dat na een modulatie een goede toonaardbevestiging
kan gerealiseerd worden. Wanneer bij het vooruitkijken een cel wordt gedetecteerd
met een modulatie, m.a.w. waar de twee toonaarden niet aan elkaar gelijk zijn, wordt
er nog verder vooruitgekeken dan het normale aantal cellen. Er is echter geen vast
aantal cellen waarnaar extra vooruitgekeken wordt. Er wordt steeds vooruitgekeken
tot en met de derde cel na de modulatie, omdat de heuristische regels voor modulaties
betrekking hebben op maximum vier cellen, de cel met de modulatie inbegrepen.
Door dit extra vooruitkijken, wordt het aantal combinaties van beschrijvingen wel erg
groot. Om hieraan tegemoet te komen, proberen we voor de drie cellen na de modulatie
eerst een beperkte set van beschrijvingen, namelijk de beschrijvingen die typisch in een
modulatie voorkomen. Dit verkleint het aantal mogelijkheden aanzienlijk. Indien dit
faalt, is er geen toonaardbevestiging mogelijk. Het extra vooruitkijken heeft dan ook
geen zin meer. In dat geval wordt een tweede poging gedaan zonder extra vooruitkijken,
en waarbij wel alle beschrijvingen in beschouwing worden genomen.
De beschrijvingen die we als typisch beschouwen na modulaties, zijn 5
I, 5
II, 5
IV, 5
V, 5
V I
en 6
II.
In Figuur 8.24 zien we een voorbeeldopgave met een modulatie. Er wordt standaard
twee cellen vooruitgekeken. Ter illustratie geven we hier per cel de strategie voor het
vooruitkijken:
Figuur 8.24: Voorbeeldopgave met modulatie
• Cel 1: kijkt eerst vooruit tot en met cel 3→ geen modulatie gedetecteerd→ alle
beschrijvingen voor cel 1 t.e.m. 3
![Page 122: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/122.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 116
• Cel 2: kijkt eerst vooruit tot en met cel 4 → modulatie gedetecteerd in cel 4 →alle beschrijvingen voor cel 2 t.e.m. 4 en beperkte set beschrijvingen voor cel 5
t.e.m. 7 (indien dit faalt: alle beschrijvingen voor cel 2 t.e.m. 4)
• Cel 3: kijkt eerst vooruit tot en met cel 5 → modulatie gedetecteerd in cel 4 →alle beschrijvingen voor cel 3 t.e.m. 4 en beperkte set beschrijvingen voor cel 5
t.e.m. 7 (indien dit faalt: alle beschrijvingen voor cel 3 t.e.m. 5)
• Cel 4: kijkt eerst vooruit tot en met cel 6 → modulatie gedetecteerd in cel 4 →alle beschrijvingen voor cel 4 en beperkte set beschrijvingen voor cel 5 t.e.m. 7
(indien dit faalt: alle beschrijvingen voor cel 4 t.e.m. 6)
• Cel 5: kijkt eerst vooruit tot en met cel 7→ geen modulatie gedetecteerd→ alle
beschrijvingen voor cel 5 t.e.m. 7
• Cel 6: kijkt eerst vooruit tot en met cel 8→ geen modulatie gedetecteerd→ alle
beschrijvingen voor cel 6 t.e.m. 8
• Cel 7: kijkt eerst vooruit tot en met cel 8→ geen modulatie gedetecteerd→ alle
beschrijvingen voor cel 7 t.e.m. 8
• Cel 8: kijkt eerst vooruit tot en met cel 8→ geen modulatie gedetecteerd→ alle
beschrijvingen voor cel 8 t.e.m. 8
Cadenzen
Een gelijkaardige optie is voorzien voor cadenzen. Om de kans op een goede slotcadens
te vergroten, is het mogelijk voor een gegeven aantal cellen aan het slot alle combina-
ties te genereren. De gebruiker kan dit aantal cellen instellen in Ramo, bvb. 5. Om
het aantal combinaties beheersbaar te houden, wordt hier voor de laatste twee cellen
gebruik gemaakt van een beperkte set beschrijvingen, namelijk de beschrijvingen die
typisch zijn voor een cadens. We doen dit slechts voor de laatste 2 cellen omdat de
kleinste cadens, 5
V- 5
I, slechts 2 cellen lang is. Tot en met de derde laatste cel kunnen
dus ook nog andere beschrijvingen voorkomen. Ook hier wordt, indien dit faalt, over-
geschakeld op de gewone strategie, waarbij zonder extra vooruitkijken de combinaties
van alle beschrijvingen gegenereerd wordt.
De beschrijvingen die we als typisch beschouwen voor cadenzen, zijn 5
I, 5
II, 5
IV, 5
V, 6
II
en6
4
I
.
![Page 123: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/123.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 117
Lege cellen
Wanneer er lege cellen zijn in een opgave, treedt er bij de algoritmen die vooruitkijken
altijd een probleem op van combinatorische explosie. Alle mogelijke beschrijvingen
worden dan immers geprobeerd voor elke lege cel, wat het aantal combinaties zeer groot
maakt. Hiervoor is er de optie �Probeer eerst frequente beschrijvingen voor lege cellen�.
Met deze optie worden eerst enkel die beschrijvingen gebruikt die in de harmonie het
vaakst gebruikt worden. Door zich tot deze verkleinde set beschrijvingen te beperken,
wordt het aantal combinaties veel kleiner. Pas indien dit faalt, wordt overgeschakeld
op het genereren van alle combinaties, maar dat blijkt meestal niet nodig te zijn.
Voor het standaardvoorbeeld met de lege cellen duurde het zonder deze optie 15766
ms om de sopraan te harmoniseren. Wanneer we deze optie wel gebruiken, duurt het
nog 2985 ms om diezelfde sopraan te harmoniseren. Deze optie levert dus een grote
snelheidswinst op.
Hier vindt natuurlijk wel een trade-o� plaats tussen het exhaustief uitproberen van alle
mogelijkheden en de e�ciëntie. Door alle mogelijke beschrijvingen te proberen kunnen
combinaties gevonden worden waaraan de heuristische regels een hoge score toekennen,
maar die ook niet-frequente beschrijvingen bevatten. Het is aan de gebruiker om te
bepalen of hij deze setting wenst of niet. Ook deze optie is aanvinkbaar in Ramo.
De beschrijvingen die we als frequent beschouwen, zijn 5
I, 5
II, 5
IV, 5
V, 5
V I, 6
I,
6
II, 6
IV, 6
Ven
6
4
I
.
![Page 124: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/124.jpg)
HOOFDSTUK 8. BACKTRACKING-ALGORITMEN 118
8.5 Complexiteit
Wegens de enorme combinatorische explosie die zich bij dit probleem voordoet, zou men
verwachten dat naarmate de opgaven langer worden, de uitvoeringstijden exponentieel
de hoogte in schieten. In sommige gevallen is dit ook zo, vooral wanneer er geen geldige
oplossing bestaat, omdat dan de hele zoekruimte moet doorzocht worden.
We hebben al een aantal tijdmetingen gedaan om de algoritmen onderling met elkaar
te vergelijken. De tijdmetingen die we nu doen, hebben echter als doel het verloop van
de uitvoeringstijd t.o.v. de lengte van de opgave te achterhalen. De opgave is steeds
een gegeven bas, zonder lege cellen, van een aantal 4/4 maten lang. De resultaten zijn
opmerkelijk. In Tabel 8.2 is voor verschillende lengtes de uitvoeringstijd weergegeven
van het willekeurig algoritme (hier Algoritme 1 genoemd), het algoritme met voor-
uitkijken voor beschrijvingen (Algoritme 2) en het algoritme met vooruitkijken voor
beschrijvingen en noten (Algoritme 3).
Aantal 4/4 maten Algoritme 1 Algoritme 2 Algoritme 3
2 15 ms 62 ms 93 ms4 31 ms 94 ms 171 ms8 78 ms 234 ms 563 ms16 141 ms 454 ms 1125 ms32 266 ms 891 ms 2875 ms64 531 ms 1766 ms 5765 ms128 1078 ms 3500 ms 11484 ms
Tabel 8.2: Tijdmetingen voor bassen met verschillende lengte
Telkens als de lengte van de opgave verdubbelt, zien we dat ook de uitvoeringstijd
ongeveer verdubbelt. Dit zou wijzen op lineaire tijd. Hoe is het mogelijk dat een
exponentieel backtracking-algoritme toch in lineaire tijd presteert? De verklaring is
wellicht het feit dat er, zoals we reeds zagen in 8.2.5, vaak slechts enkele niveaus
teruggekeerd wordt in het proces van backtracking. Het aantal niveaus dat er maximum
mag teruggekeerd worden, kan ook door de gebruiker ingesteld worden. Wanneer we
dit aantal niveaus bvb. vastleggen op 3, kan het algoritme veel opgaven nog steeds
oplossen. Doordat er in die gevallen een constante bovengrens geldt voor het aantal
niveaus dat er teruggekeerd wordt, blijkt het algoritme in sommige gevallen lineair te
presteren. We willen echter onderstrepen dat dit enkel in de meest gunstige gevallen zo
is. Er zijn ook opgaven die complexer van aard zijn, waarbij er wel verder teruggekeerd
wordt in het backtrackingproces.
![Page 125: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/125.jpg)
Hoofdstuk 9
Eindbeschouwingen
9.1 Conclusie
De bedoeling van dit werk was automatische harmonisatie mogelijk te maken in Ramo.
Hiervoor hebben we de nodige aanpassingen aan het regelsysteem gedaan, en werden
productieregels en heuristische regels aan het systeem toegevoegd. Vervolgens werden
drie backtracking-algoritmen geïmplementeerd die de opgaven kunnen oplossen, en er
daarbij nooit langer over doen dan enkele seconden.
�Het is en blijft natuurlijk wel computermuziek�, is een vaak gehoorde kritiek op der-
gelijke algoritmen. Over de kwaliteit van een harmonisatie schrijft Geeurickx:
�Na realisatie zou men niet meer mogen kunnen uitmaken of de bas dan
wel de sopraan gegeven was. Dit vergt een lang aangehouden training die
over meerdere jaren loopt.� [10]
Of Ramo, en eender welke automatische harmonizer, ooit zal slagen voor de Turing-
test is dus nog maar de vraag. Een andere vraag die we kunnen stellen, is �Willen we
het resultaat van het componeren nabootsen, of het proces van het componeren zelf?�
We kunnen moeilijk stellen dat componisten op dezelfde manier te werk gaan als de
algoritmen die we hier gebruiken.
Dit is een realiteit die we moeten aanvaarden, maar waarbinnen toch mogelijkheden
bestaan om goede resultaten te bekomen. We zijn er in geslaagd muziek te genereren
die aan alle verbindingsregels voldoet, terwijl veel harmonizers zich nog beperken tot
het louter kiezen van akkoorden. Bovendien hebben we ook een algoritme dat een
muzikale intentie heeft, en resultaten oplevert die qua muzikaliteit merkbaar beter zijn
dan wanneer men enkel wil voldoen aan de harmonieregels. Ook in de toekomst zijn
er nog heel wat mogelijkheden om Ramo uit te breiden en te verbeteren.
119
![Page 126: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/126.jpg)
HOOFDSTUK 9. EINDBESCHOUWINGEN 120
9.2 Mogelijkheden voor verdere ontwikkeling
Optimalisatie
Er zijn nog mogelijkheden voor optimalisatie van de geïmplementeerde algoritmen,
zowel wat de kwaliteit van de resultaten betreft als wat de snelheid betreft. Er zijn nu
twee manieren om de volgorde te bepalen waarin beschrijvingen en noten uitgeprobeerd
worden, namelijk willekeurig en op basis van prioriteiten die door vooruitkijken bepaald
worden. Er kan echter gemakkelijk geëxperimenteerd worden met andere volgorden en
met andere manieren om de volgorde te bepalen. Door een implementatie van bvb.
de interface DescriptionIteratorPolicy te schrijven, kan men zijn eigen volgorde in
het systeem inpluggen.
Wellicht zou er ook een snelheidswinst kunnen bekomen worden door vaker gebruik
te maken van beperkte sets beschrijvingen om het aantal combinaties te reduceren.
Momenteel wordt dit enkel gedaan wanneer er lege cellen zijn, maar wellicht zou het
interessant zijn dit ook te proberen voor niet-lege cellen, bvb. bij een gegeven sopraan.
Toonaarddetectie
Momenteel moet de gebruiker steeds zelf de toonaarden en eventuele modulaties aange-
ven. Het zou interessant zijn als Ramo deze toonaarden zelf zou kunnen bepalen. Dit
is zeker niet triviaal wanneer er ook modulaties automatisch moeten bepaald worden.
Waarschijnlijk zijn er in de context van toonaarddetectie te veel mogelijkheden om via
backtracking alle mogelijkheden uit te proberen, dus zijn we aangewezen op heuristische
methoden, zoals bvb. lokaal zoeken of variable neighbourhood search. Er zijn nu reeds
een aantal heuristische regels geïmplementeerd die een score geven aan de kwaliteit van
de toonaardkeuze. Deze heuristische regels hanteren criteria zoals bvb. het voorkomen
van de tonicanoot in de bas. Door deze objectie�unctie te maximaliseren, zou men tot
een toonaardkeuze kunnen komen. In [21] zijn een aantal interessante ideeën te vinden
hieromtrent, waarop verder kan gebouwd worden.
Flexibiliteit
Er was een �exibel regelsysteem voorhanden voor Ramo, maar hiervan zijn we moeten
afstappen omwille van de snelheid. Een regelsysteem dat enerzijds �exibel is, maar
anderzijds ook snel genoeg, zou het beste van twee werelden combineren. Het zou
interessant zijn als hierbij ook de productieregels en heuristische regels zouden kunnen
extern opgeslagen en ingeladen worden.
![Page 127: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/127.jpg)
HOOFDSTUK 9. EINDBESCHOUWINGEN 121
Melden van fouten in de opgave
Op gebied van software-ontwikkeling zou de intelligentie die Ramo gekregen heeft, nog
beter in het geheel kunnen geïntegreerd worden. Wanneer een opgave op zich reeds
fouten bevat, krijgt de gebruiker nu de melding dat de opgave niet kon opgelost worden.
Het zou voor de gebruiker interessanter zijn als hij dan ook de beschrijvingen van de
fouten en de annotaties te zien zou krijgen. Dit is om twee redenen nog niet voorzien.
Enerzijds is het regelsysteem door de aanpassingen die eraan gebeurd zijn niet meer
helemaal compatibel met de GUI die voor de annotaties zorgt. Anderzijds is er nu
reeds een nieuwe editor in ontwikkeling, waardoor het niet zinvol is nog in de GUI van
de oude editor te investeren.
Tolereren van fouten
Eén van de uitdagingen voor de toekomst is het zoeken naar oplossingen waarbij fouten
in beperkte mate getolereerd worden. Een opgave waarvoor geen oplossing bestaat die
aan alle regels voldoet, zou dan toch kunnen opgelost worden op een zodanige manier
dat er zo weinig mogelijk ernstige overtredingen zijn. Hiervoor zal wellicht een systeem
met strafpunten nodig zijn, zoals ook gebruikt wordt in [24].
Suggesties voor verbetering
Ramo was oorspronkelijk bedoeld voor het muziekonderwijs. De algoritmen die we
ontwierpen, zouden ook een pedagogische toepassing kunnen hebben, namelijk voor
het geven van suggesties voor verbetering wanneer een student een fout heeft in zijn
opgave. Een mogelijke strategie zou erin kunnen bestaan één van de backtracking-
algoritmen herhaaldelijk uit te voeren, waarbij telkens delen weggelaten worden uit de
oplossing van de student. Er zou kunnen gestart worden met het weglaten van heel
kleine stukjes, bvb. één noot uit de cel die de fout bevat, en progressief meer noten
weglaten tot wanneer een correcte oplossing gevonden wordt. De bedoeling is dus een
correcte oplossing te vinden die zo weinig mogelijk verandert aan de oplossing van de
student. Dat het algoritme meerdere keren moet uitgevoerd worden, zou geen probleem
mogen vormen. Voor opgaven waarbij bijna alles al ingevuld is op enkele noten na, is
het algoritme zeker snel genoeg om dit aan te kunnen.
![Page 128: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/128.jpg)
Index
aantal oplossingen bepalen, 91
akkoordregels, 16
algoritmische compositie, 29
atonaliteit, 6
backjumping, 38, 86
BackTalk, 37
backtracking, 34
Backtracking Speci�cation Language, 37
Bean Scripting Framework, 27
BeanShell, 27
becijfering, 12
becijferingen genereren, 68
beperkte backtracking, 90
beschrijving, 13
beschrijving van een regel, 25
BSF, 27
BSL, 37
canon, 29
celregels, 53
CHORAL, 37
complexiteit, 118
COMPOzE, 37
consonant, 4
Constraint Satisfaction Problem, 31
constraints, 31
crossover, 42
desactiveren van realisaties, 111
diatonische modulatie, 15
dissonant, 4
dominant septiemakkoord, 12
doorgangsakkoord, 19
driecellenregels, 55
drieklanken, 9
Ebcioglu, 37
eindige toestandsautomaat, 48
enge ligging, 11
errorticket, 27
evolutionaire algoritmen, 41
exclusieve productieregels, 72
�tnessfunctie, 41
gebroken cadens, 14
gelijke beweging, 13
gemengde ligging, 11
generationeel genetisch algoritme, 42
genetische algoritmen, 41
gesyncopeerde harmonie, 19
graad, 7
grondligging, 11
grondnoot, 9
grote tertstoonladder, 7
halve cadens, 14
hard constraints, 31
harmonieregels, 5
harmonisatieplan, 37, 94
harmonische wijze, 8
heuristische regels, 39, 73
homoritmisch, 23
hoofdakkoorden, 10
Illiac suite, 49
instanties van regels, 26
interactief genetisch algoritme, 41
kleine tertstoonladder, 7
koralen, 37
kwartsextakkoord, 12
122
![Page 129: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/129.jpg)
INDEX 123
kwintakkoord, 12
kwintakkoorden, 9
kwintsextakkoord, 12
lege cellen, 117
leidtoon, 9
lokaal harmonisatieplan, 95
lokaal zoeken, 120
melodieregels, 17, 53
melodische wijze, 8
metrumregels, 18
minimale tertsensequentie, 64
modale muziek, 6
modi, 6
modulatie, 15, 115
MTS, 64
mutatie, 41
mutueel recursief, 84
muziekbladregels, 55
nevenakkoorden, 10
none-akkoorden, 9
noteneditor, 22
ondertonica, 9
oude wijze, 8
pitchlist cache, 71
plagale cadens, 14
policy, 86
polyfonie, 12
productieregels, 38, 57
productieregels voor de tonica, 72
productieregels voor noten, 70
pruning, 35
Rameau, Jean-Philippe, 4
realisatie, 11
realisatiecataloog, 106
regelsysteem, 25
safe jump, 38
secundeakkoord, 12
septiemakkoorden, 9
sextakkoord, 12
slotcadens, 116
snoeien, 35, 86
soft constraints, 31
spilakkoord, 15
steady-state genetisch algoritme, 42
stembereik, 7
stochastische methoden, 48
tegenbeweging, 13
tertskwartakkoord, 12
tolereren van fouten, 121
tonale muziek, 5
tonica, 5
toonaardbevestiging, 75
toontrap, 7
toontrappen genereren, 65
traktaat, 4
tweecellenregels, 54
variable neighbourhood search, 120
verbindingsregels, 17
verdubbeling, 11
vierklanken, 9
vijfklanken, 9
volledig harmonisatieplan, 94
volmaakte cadens, 14
voorslagakkoord, 19
vooruitkijken, 95
wijde ligging, 11
willekeurig algoritme, 80
wisselakkoord, 19
zijdelingse beweging, 13
zoekboom, 34
![Page 130: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/130.jpg)
Bibliogra�e
[1] Alpern, A. (1995) Techniques for Algorithmic Composition of Music
[2] Bass, L., Clements, P., Kazman, R. (2003) Software architecture in practice,
Addison-Wesley, pp. 19-46
[3] Bitsch, M. (1957) Précis d'Harmonie Tonale, Éditions Musicales
[4] Brasseur, A. (2005 - 2006) Een regelgebaseerd softwareraamwerk voor het redeneren
over muziekschriftuur, Licentiaatsthesis (promotor: K. Coolsaet)
[5] Brinkmann, G. (2006) Metaheuristieken, Cursusnota 's Algoritmen en Datastruc-
turen III
[6] Dasgupta, S., Papadimitriou, C., Vazirani, U. (2006), Algorithms, McGraw-Hill
Higher Education
[7] Fack, V. (2004) Datastructuren en Algoritmen I, Academia Press
[8] Fack, V., Brinkmann, G. (2004) Datastructuren en Algoritmen II, Academia Press
[9] Gamma, E., Helm, R., Johnson, R., Vlissides, J. (1995) Design Patterns: Elements
of Reusable Object-Oriented Software, Addison-Wesley, pp. 257-271
[10] Geeurickx, E. (1985) Functionele Harmonie 1, Uitgeverij De Notenboom
[11] Geeurickx, E. (2003) Functionele Harmonie 2, Uitgeverij Metropolis
[12] Gistelinck, D. (1997) Vademecum van de algemene muziekleer, Aniscore
[13] Henz, M., Lauer, S., Zimmermann, D. (1996) COMPOzE � Intention-based Music
Composition through Constraint Programming, 8th IEEE International Conference
on Tools with AI, Toulouse
[14] Maurer, J. (1999) A Brief History of Algorithmic Composition,
http://ccrma.stanford.edu/~blackrse/algorithm.html
[15] Michalewicz, Z., Fogel, D.B. (2004), How to Solve It: Modern Heuristics, Second
Edition, Springer
124
![Page 131: Backtrackalgoritmen voor regelgebaseerde vierstemmige …lib.ugent.be/fulltxt/RUG01/001/312/021/RUG01-001312021... · 2010. 6. 7. · Tijdens de romantiek (ca. 1815-1920) en de twintigste](https://reader035.fdocument.pub/reader035/viewer/2022081617/60451c6a3c2e2b45810c943f/html5/thumbnails/131.jpg)
BIBLIOGRAFIE 125
[16] Nelleke, B. (1981) Eenvoudige algemene muziekleer, Edition Heuwekemeijer
[17] Pachet, F., Roy, P. (1995) Mixing Constraints and Objects: a Case Study in Au-
tomatic Harmonization, TOOLS Europe '95, Prentice-Hall pp. 119-126
[18] Pachet, F., Roy, P. (2001) Musical Harmonization with Constraints: A Survey,
Constraints, Volume 6, Number 1, January 2001: pp. 7-19
[19] Papadopoulos, G., Wiggins, G. (1999) AI Methods for Algorithmic Compositi-
on: A Survey, a Critical View and Future Prospects, Proceedings of the AISB'99
Symposium on Musical Creativity
[20] Phon-Amnuaisuk, S., Wiggins, G. (1999) The Four-Part Harmonisation Problem:
A comparison between Genetic Algorithms and a Rule-Based System, Proceedings
of the AISB'99 Symposium on Musical Creativity, publ. AISB
[21] Ramirez, R., Peralta, J. (1998) A constraint-based melody harmonizer, ECAI'98
Workshop on Constraints and Artistic Applications, Brighton
[22] Rizo, D., Iñesta, J.M. (2006) Tree Model of Symbolic Music for Tonality Guessing,
Arti�cial Intelligence and Applications 2006: pp. 299-304
[23] Rogiers, W. (2004 - 2005) Ramo softwareraamwerk voor muzieknotatie, Licenti-
aatsthesis (promotor: K. Coolsaet)
[24] Schottstaedt, B. (1984) Automatic species counterpoint, Tech. Rep. STAN-M-19,
Stanford University CCRMA.
[25] Schouten, H. (2004) Harmonieleer, Strengholt
[26] Ste�elaar, W. (1999) Muzikale stijlgeschiedenis, Uitgeverij Nieuwezijds
[27] Wiggins, G. (1998) The Use of Constraint Systems for Musical Composition,
ECAI98 workshop on Constraints and Artistic Applications, Brighton
[28] Wiggins, G., Papadopoulos, G., Phon-Amnuaisuk, S., Tuson, A. (1999) Evolu-
tionary Methods for Musical Composition, International Journal of Computing
Anticipatory Systems
[29] Threads: An Introduction to Computer-Aided Composition,
http://library.thinkquest.org/3343/web-docs/index.html