Backtrackalgoritmen voor regelgebaseerde vierstemmige...

131

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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