Jesper Juellund Jensen      

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 [ helnode  ,  halvnode  ,  fjerdedelsnode  ,  8.-delsnode  ]

 

g1) En „standardrytme“ er en rytme, der består af standardtoner

g2) Standardtone: Toners længde kan være 8.-delsnode og fjerdedelsnode

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 u kan falde på „1og“, 2, „3og“ eller 4

g6) Standardtone: En tone med trykket u kan falde på „4og“ eller „2og“ som en 8.-delsnode

 

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 (u`), 2 (u), 3 (u´), 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 [ helnode  , halvnode  , fjerdedelsnode  , 8.-delsnode  ], 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 8.-delsnode og fjerdedelsnode

Tilsvarende er reglen om standardtoners længde ganske uproblematisk, da fjerdedelsnode og 8.-delsnode 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 4/4 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.:

Oversigt over rytmiske positioner

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 u 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 u kan falde på „4og“ eller „2og“ som en 8.-delsnode

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 u u - u u - u. 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“:

Indtast tekstrytme og kopier mål i Rytmegenerator

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:

Valg i forbindelse med modellen for versrytme