|
|
|
Prolog-program til rytmemodeller
Versrytme
Reglerne for versrytme udgøres dels af de generelle regler a-e, dels af følgende regler:
f) Metrummet er [ , , , ]
g1) En „standardrytme“ er en rytme, der består af standardtoner
g2) Standardtone: Toners længde kan være og 
g3) Standardtone: En tone med trykket kan falde på 1, 2, 3 eller 4
g4) Standardtone: En tone med trykket kan falde på „4og“ eller „2og“ (lift)
g5) Standardtone: En tone med trykket kan falde på „1og“, 2, „3og“ eller 4
g6) Standardtone: En tone med trykket kan falde på „4og“ eller „2og“ som en 
h) Polyrytme: Trykstærk stavelse på „2og“ efterfulgt af to tryksvage stavelser på 3 og „3og“
i) Versrytme: består af (nul, en eller flere) standardrytmer og polyrytmer
Disse regler vil nu blive omformet til Prolog.
1. Trykstærke og tryksvage stavelser
Da regel g3-6 og h gør brug af „trykstærke“ og „tryksvage“ stavelser, må disse begreber defineres i Prolog. Da teksttryk er repræsenteret ved heltallene 1 ( ), 2 ( ), 3 ( ), 4 ( ), 5 ( ) og 6 ( ) er 1-3 altså tryksvage stavelser, mens 4-6 er trykstærke:
tryksvag(1). tryksvag(2). tryksvag(3).
trykstaerk(4). trykstaerk(5). trykstaerk(6).
2. Metrum (regel f)
Et metrum i en versrytme skal have formen [ , , , ], hvilket i den valgte repræsentation kan udtrykkes [8,4,2,1]:
metrumIVersrytme( [8,4,2,1] ).
3. Standardrytme (regel g1-6)
Standardrytme (regel g1)
g1) En „standardrytme“ er en rytme, der består af standardtoner
Regel g1 lader sig ret let udtrykke i Prolog, idet den først omformes til en rekursiv definition:
g1+) Hvis en rytme R er en standardrytme, og en tone T er en standardtone, er rytmen af T og R en standardrytme
g1°) En tom rytme, [], er en standardrytme
Herefter lader reglen sig let formulere i Prolog:
standardrytme( [T|R] ) :-
standardtone( T ),
standardrytme( R ).
standardrytme( [] ).
Standardlængde (regel g2)
g2) Standardtone: Toners længde kan være og 
Tilsvarende er reglen om standardtoners længde ganske uproblematisk, da og jo repræsenteres af 1 og 2:
standardtonelaengde( 1 ).
standardtonelaengde( 2 ).
Standardtone (regel g3)
g3) Standardtone: En tone med trykket kan falde på 1, 2, 3 eller 4
Positionerne 1, 2, 3 og 4 i en takt i er i den valgte repræsentation kendetegnet af, at der er tale om et lige tal. 1-slaget i første takt repræsenteres jo af tallet 0, „1og“ af tallet 1, 2 af tallet 2 osv.:

Et lige tal kan i Prolog udtrykkes som et tal, hvis to-rest er nul (X mod 2 =:= 0), og reglen kan derfor udtrykkes således:
standardtone( tone(Teksttryk,Position,Laengde) ) :-
trykstaerk( Teksttryk ),
Position mod 2 =:= 0,
standardtonelaengde( Laengde ).
Standardtone (regel g4)
g4) Standardtone: En tone med trykket kan falde på „4og“ eller „2og“ (lift)
Positionerne „2og“ og „4og“ er i Prolog-repræsentationen 3, 7, 11, 15 osv. – altså tal, hvis 4-rest er 3:
standardtone( tone(Teksttryk,Position,Laengde) ) :-
trykstaerk( Teksttryk ),
Position mod 4 =:= 3,
standardtonelaengde( Laengde ).
Standardtone (regel g5)
g5) Standardtone: En tone med trykket kan falde på „1og“, 2, „3og“ eller 4
Positionerne „1og“, „2“, „3og“ og „4“ er i Prolog-repræsentationen 1, 2, 5, 6, 9, 10, 13, 14 osv. – altså tal, hvis 4-rest er 1 eller 2:
standardtone( tone(Teksttryk,Position,Laengde) ) :-
tryksvag( Teksttryk ),
Position mod 4 =:= 1,
standardtonelaengde( Laengde ).
standardtone( tone(Teksttryk,Position,Laengde) ) :-
tryksvag( Teksttryk ),
Position mod 4 =:= 2,
standardtonelaengde( Laengde ).
Standardtone (regel g6)
g6) Standardtone: En tone med trykket kan falde på „4og“ eller „2og“ som en 
Som vi så ovenfor, er positionerne „2og“ og „4og“ i Prolog-repræsentationen tal, hvis 4-rest er 3:
standardtone( tone(Teksttryk,Position,1) ) :-
tryksvag( Teksttryk ),
Position mod 4 =:= 3.
4. Polyrytme (regel h)
h) Polyrytme: Trykstærk stavelse på „2og“ efterfulgt af to tryksvage stavelser på 3 og „3og“
Positionen „2og“ er i Prolog-repræsentationen 3, 11, 19 osv. – altså tal, hvis 8-rest er 3:
polyrytme( [tone(T1,Startposition,1), tone(T2,_,1), tone(T3,_,1)] ) :-
trykstaerk( T1 ),
tryksvag( T2 ),
tryksvag( T3 ),
Startposition mod 8 =:= 3.
5. Overordnet rytmesammensætning
i) Versrytme: består af (nul, en eller flere) standardrytmer og polyrytmer
Men hertil skal man også huske, at versrytme skal være en „rytme med start i første periode“. Regel i omformuleres derfor ved hjælp af endnu en type rytme, der kaldes en delrytme, der defineres rekursivt:
i1) Versrytme: en rytme med start i første periode, der også er en delrytme
i2+x) Hvis T er en standardtone og R er en delrytme, er rytmen af T og R en delrytme
i2+y) Hvis P er en polyrytme og R er en delrytme, er rytmen af P og R en delrytme
i2°) En tom rytme [] er en delrytme
Dette er i Prolog implementeret således:
versrytme( Rytme ) :-
metrumIVersrytme(Metrum),
rytmeMedStartIFoerstePeriode(Rytme, Metrum),
delrytme( Rytme ).
delrytme( [T|R] ) :-
standardtone( T ),
delrytme( R ).
delrytme( PogR ) :-
erSammenstykketAf( PogR, P, R ),
polyrytme( P ),
delrytme( R ).
delrytme( [] ).
Relationen erSammenstykketAf er ret simpel og vil ikke blive gennemgået her.
Som ved simpel melodirytme defineres nu til sidst en relation mellem en tekstrytme og en versrytme (i et metrum), der har samme tekstrytme. Denne relation kaldes ikke overraskende versrytmeMedTekstrytmen.
Programmet for versrytme kan findes i dokumentet „Versrytme.pro“. Husk at det skal anvedes sammen med grundreglerne for rytme.
Generering af rytmer med versrytme
Prolog-programmet for versrytme kan – præcis som Prolog-programmet for simpel melodirytme – anvendes sammen med programmet Rytmegenerator. Lad os for eksempel sige, at vi ønsker at generere alle rytmer for teksten »There’ll be swinging and swaying« med tekstrytmen . Disse oplysninger indtastes nu i Rytmegenrator, hvor man vælger normen „versrytme“ og til sidst vælger „Kopier mål til skuffen“ fra „Prolog-menuen“:

I Prolog kan man nu sætte det kopierede mål ind:
?- versrytmeMedTekstrytmen( Rytme , [2,2,5,2,2,5,2] ).
Prolog vil herefter kunne generere følgende rytmer:
Rytme = [tone(2,1,1),tone(2,2,1),tone(5,3,1),tone(2,4,1),tone(2,5,1),tone(5,6,1),tone(2,7,1)] ;
Rytme = [tone(2,1,1),tone(2,2,1),tone(5,3,2),tone(2,5,1),tone(2,6,1),tone(5,7,2),tone(2,9,1)] ;
Rytme = [tone(2,1,1),tone(2,2,1),tone(5,3,2),tone(2,5,1),tone(2,6,2),tone(5,8,1),tone(2,9,1)] ;
Rytme = [tone(2,1,1),tone(2,2,1),tone(5,3,2),tone(2,5,1),tone(2,6,2),tone(5,8,2),tone(2,10,2)] ;
Rytme = [tone(2,1,1),tone(2,2,1),tone(5,3,2),tone(2,5,2),tone(2,7,1),tone(5,8,1),tone(2,9,1)] ;
Rytme = [tone(2,1,1),tone(2,2,1),tone(5,3,2),tone(2,5,2),tone(2,7,1),tone(5,8,2),tone(2,10,2)] ;
Rytme = [tone(2,1,1),tone(2,2,2),tone(5,4,1),tone(2,5,1),tone(2,6,1),tone(5,7,2),tone(2,9,1)] ;
Rytme = [tone(2,1,1),tone(2,2,2),tone(5,4,1),tone(2,5,1),tone(2,6,2),tone(5,8,1),tone(2,9,1)] ;
Rytme = [tone(2,1,1),tone(2,2,2),tone(5,4,1),tone(2,5,1),tone(2,6,2),tone(5,8,2),tone(2,10,2)] ;
Rytme = [tone(2,1,1),tone(2,2,2),tone(5,4,1),tone(2,5,2),tone(2,7,1),tone(5,8,1),tone(2,9,1)] ;
Rytme = [tone(2,1,1),tone(2,2,2),tone(5,4,1),tone(2,5,2),tone(2,7,1),tone(5,8,2),tone(2,10,2)] ;
Rytme = [tone(2,1,1),tone(2,2,2),tone(5,4,2),tone(2,6,1),tone(2,7,1),tone(5,8,1),tone(2,9,1)] ;
Rytme = [tone(2,1,1),tone(2,2,2),tone(5,4,2),tone(2,6,1),tone(2,7,1),tone(5,8,2),tone(2,10,2)] ;
Rytme = [tone(2,1,2),tone(2,3,1),tone(5,4,1),tone(2,5,1),tone(2,6,1),tone(5,7,2),tone(2,9,1)] ;
Rytme = [tone(2,1,2),tone(2,3,1),tone(5,4,1),tone(2,5,1),tone(2,6,2),tone(5,8,1),tone(2,9,1)] ;
Rytme = [tone(2,1,2),tone(2,3,1),tone(5,4,1),tone(2,5,1),tone(2,6,2),tone(5,8,2),tone(2,10,2)] ;
Rytme = [tone(2,1,2),tone(2,3,1),tone(5,4,1),tone(2,5,2),tone(2,7,1),tone(5,8,1),tone(2,9,1)] ;
Rytme = [tone(2,1,2),tone(2,3,1),tone(5,4,1),tone(2,5,2),tone(2,7,1),tone(5,8,2),tone(2,10,2)] ;
Rytme = [tone(2,1,2),tone(2,3,1),tone(5,4,2),tone(2,6,1),tone(2,7,1),tone(5,8,1),tone(2,9,1)] ;
Rytme = [tone(2,1,2),tone(2,3,1),tone(5,4,2),tone(2,6,1),tone(2,7,1),tone(5,8,2),tone(2,10,2)] ;
Rytme = [tone(2,2,1),tone(2,3,1),tone(5,4,1),tone(2,5,1),tone(2,6,1),tone(5,7,2),tone(2,9,1)] ;
Rytme = [tone(2,2,1),tone(2,3,1),tone(5,4,1),tone(2,5,1),tone(2,6,2),tone(5,8,1),tone(2,9,1)] ;
Rytme = [tone(2,2,1),tone(2,3,1),tone(5,4,1),tone(2,5,1),tone(2,6,2),tone(5,8,2),tone(2,10,2)] ;
Rytme = [tone(2,2,1),tone(2,3,1),tone(5,4,1),tone(2,5,2),tone(2,7,1),tone(5,8,1),tone(2,9,1)] ;
Rytme = [tone(2,2,1),tone(2,3,1),tone(5,4,1),tone(2,5,2),tone(2,7,1),tone(5,8,2),tone(2,10,2)] ;
Rytme = [tone(2,2,1),tone(2,3,1),tone(5,4,2),tone(2,6,1),tone(2,7,1),tone(5,8,1),tone(2,9,1)] ;
Rytme = [tone(2,2,1),tone(2,3,1),tone(5,4,2),tone(2,6,1),tone(2,7,1),tone(5,8,2),tone(2,10,2)] ;
Rytme = [tone(2,5,1),tone(2,6,1),tone(5,7,2),tone(2,9,1),tone(2,10,1),tone(5,11,2),tone(2,13,1)] ;
Rytme = [tone(2,5,1),tone(2,6,1),tone(5,7,2),tone(2,9,1),tone(2,10,2),tone(5,12,1),tone(2,13,1)] ;
Rytme = [tone(2,5,1),tone(2,6,1),tone(5,7,2),tone(2,9,1),tone(2,10,2),tone(5,12,2),tone(2,14,2)] ;
Rytme = [tone(2,5,1),tone(2,6,1),tone(5,7,2),tone(2,9,2),tone(2,11,1),tone(5,12,1),tone(2,13,1)] ;
Rytme = [tone(2,5,1),tone(2,6,1),tone(5,7,2),tone(2,9,2),tone(2,11,1),tone(5,12,2),tone(2,14,2)] ;
Rytme = [tone(2,5,1),tone(2,6,2),tone(5,8,1),tone(2,9,1),tone(2,10,1),tone(5,11,2),tone(2,13,1)] ;
Rytme = [tone(2,5,1),tone(2,6,2),tone(5,8,1),tone(2,9,1),tone(2,10,2),tone(5,12,1),tone(2,13,1)] ;
Rytme = [tone(2,5,1),tone(2,6,2),tone(5,8,1),tone(2,9,1),tone(2,10,2),tone(5,12,2),tone(2,14,2)] ;
Rytme = [tone(2,5,1),tone(2,6,2),tone(5,8,1),tone(2,9,2),tone(2,11,1),tone(5,12,1),tone(2,13,1)] ;
Rytme = [tone(2,5,1),tone(2,6,2),tone(5,8,1),tone(2,9,2),tone(2,11,1),tone(5,12,2),tone(2,14,2)] ;
Rytme = [tone(2,5,1),tone(2,6,2),tone(5,8,2),tone(2,10,1),tone(2,11,1),tone(5,12,1),tone(2,13,1)] ;
Rytme = [tone(2,5,1),tone(2,6,2),tone(5,8,2),tone(2,10,1),tone(2,11,1),tone(5,12,2),tone(2,14,2)] ;
Rytme = [tone(2,5,2),tone(2,7,1),tone(5,8,1),tone(2,9,1),tone(2,10,1),tone(5,11,2),tone(2,13,1)] ;
Rytme = [tone(2,5,2),tone(2,7,1),tone(5,8,1),tone(2,9,1),tone(2,10,2),tone(5,12,1),tone(2,13,1)] ;
Rytme = [tone(2,5,2),tone(2,7,1),tone(5,8,1),tone(2,9,1),tone(2,10,2),tone(5,12,2),tone(2,14,2)] ;
Rytme = [tone(2,5,2),tone(2,7,1),tone(5,8,1),tone(2,9,2),tone(2,11,1),tone(5,12,1),tone(2,13,1)] ;
Rytme = [tone(2,5,2),tone(2,7,1),tone(5,8,1),tone(2,9,2),tone(2,11,1),tone(5,12,2),tone(2,14,2)] ;
Rytme = [tone(2,5,2),tone(2,7,1),tone(5,8,2),tone(2,10,1),tone(2,11,1),tone(5,12,1),tone(2,13,1)] ;
Rytme = [tone(2,5,2),tone(2,7,1),tone(5,8,2),tone(2,10,1),tone(2,11,1),tone(5,12,2),tone(2,14,2)] ;
Rytme = [tone(2,6,1),tone(2,7,1),tone(5,8,1),tone(2,9,1),tone(2,10,1),tone(5,11,2),tone(2,13,1)] ;
Rytme = [tone(2,6,1),tone(2,7,1),tone(5,8,1),tone(2,9,1),tone(2,10,2),tone(5,12,1),tone(2,13,1)] ;
Rytme = [tone(2,6,1),tone(2,7,1),tone(5,8,1),tone(2,9,1),tone(2,10,2),tone(5,12,2),tone(2,14,2)] ;
Rytme = [tone(2,6,1),tone(2,7,1),tone(5,8,1),tone(2,9,2),tone(2,11,1),tone(5,12,1),tone(2,13,1)] ;
Rytme = [tone(2,6,1),tone(2,7,1),tone(5,8,1),tone(2,9,2),tone(2,11,1),tone(5,12,2),tone(2,14,2)] ;
Rytme = [tone(2,6,1),tone(2,7,1),tone(5,8,2),tone(2,10,1),tone(2,11,1),tone(5,12,1),tone(2,13,1)] ;
Rytme = [tone(2,6,1),tone(2,7,1),tone(5,8,2),tone(2,10,1),tone(2,11,1),tone(5,12,2),tone(2,14,2)] ;
no
Igen kan man bruge programmet Rytmegenerator til at få disse rytmer vist ved at kopiere al teksten og vælge „Vis rytmer i skuffen“ (Macinosh) eller „Vis rytmer i udklipsholder“ (Windows) fra „Prolog“-menuen. Resultaterne vil så blive vist i almindelig rytmenotation.
Man kunne selvfølgelig igen også bare anvende Rytmegenerator til at generere rytmer ud fra normen versrytme. I dette program har jeg endvidere inkluderet en mulighed for at vælge forskellige varianter af normen for versrytme:

|