% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ % SIMPLE DATA % ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ % teksttryk( Teksttryk ) % ====================== % Teksttryk er et teksttryk for en stavelse/tone. teksttryk(1). teksttryk(2). teksttryk(3). teksttryk(4). teksttryk(5). teksttryk(6). % laengde( Laengde ) % ================== % Laengde er en længde for en tone. laengde(1). laengde(2). laengde(3). % ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ % RYTME % ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ % rytme ( Rytme , Metrum ) % ======================== % Rytme er blot en eller anden rytme (ikke i en bestemt norm) rytme( [X,Y|R], Metrum ) :- X = tone(Xteksttryk,Xposition,Xlaengde), teksttryk(Xteksttryk), laengde(Xlaengde), Y = tone(Yteksttryk,Yposition,Ylaengde), teksttryk(Yteksttryk), Yposition is Xposition + Xlaengde, laengde(Ylaengde), rytme([Y|R], Metrum ). rytme( [X], Metrum) :- teksttryk(Xteksttryk), laengde(Xlaengde), X = tone(Xteksttryk,Xposition,Xlaengde), Slutposition is Xposition+Xlaengde, tilhoererNaestlavesteMetriskeLag(Slutposition,Metrum). % rytmeMedStartIFoerstePeriode( Rytme , Metrum ) % ============================================== % Rytme er en rytme, der starter i første "periode", dvs.: % - Den første tones position er i første periode % - Rytmen er i øvrigt en rytme  rytmeMedStartIFoerstePeriode([Tone|RestRytme], Metrum) :- iFoerstePeriode(P, Metrum), Tone = tone(_,P,_), rytme([Tone|RestRytme],Metrum). % iFoerstePeriode( Position , Metrum ) % ==================================== % Er Position i første "periode" af Metrum? % Den første "periode" er [0 .. S-1], hvor S er det højeste lag i metrummet. iFoerstePeriode(Position, [S|_]) :- Max is S-1, talIInterval(0,Max,Position). % talIInterval( Min , Max , Tal ) % =============================== % Tal er et tal i intervallet fra Min til Max % % Min og Max skal være angivet. talIInterval(Min,_,Min). talIInterval(Min,Max,Tal) :- MinQmax. % erMereEllerLigesaaBetonet( P , Q , Metrum ) % =========================================== % Er positionen P mere eller lige så metrisk betonet som positionen Q? erMereEllerLigesaaBetonet(P, Q, Metrum) :- hoejesteMetriskeLag(P, Metrum, Pmax), hoejesteMetriskeLag(Q, Metrum, Qmax), Pmax>=Qmax.