% Zapoctovy program prehravac not
% autor: Radek Bartuska
% radekbartuska@molbud.cz


% seznam melodi

%	neni nutno
melodie(1,[g1,pu,g1,pu,f1,pu,e1,pu,g1,pu,g1,pu,f1,pu,e1,pu,g1,pu,g1,pu,f1,pu,e1,pu,g1,pu,e1,pu,f1,pu,g1,pu,d1,ce]).

%	kocka leze dirou
melodie(2,[c1,pu,d1,pu,e1,pu,f1,pu,g1,ce,g1,ce,a1,ce,a1,ce,g1,ce,x,pu,a1,ce,a1,ce,g1,ce,x,ct,f1,pu,f1,pu,f1,pu,f1,pu,e1,ce,e1,ce,d1,ce,d1,ce,c1,ce]).

% 	ovcaci ctveraci
melodie(3,[c1,pu,e1,pu,g1,pu,x,ct,c1,pu,e1,pu,g1,pu,x,ct,e1,ct,e1,ct,d1,ct,e1,ct,f1,pu,d1,pu,e1,ct,e1,ct,d1,ct,e1,ct,f1,pu,d1,pu,e1,pu,d1,pu,c1,pu]).

%	C dur v oktave 1
melodie(4,[c1,os,cis1,os,d1,os,dis1,os,e1,os,f1,os,fis1,os,g1,os,gis1,os,a1,os,ais1,os,h1,os,his1,os]).

%	C dur v oktave 2
melodie(5,[c2,os,cis2,os,d2,os,dis2,os,e2,os,f2,os,fis2,os,g2,os,gis2,os,a2,os,ais2,os,h2,os,his2,os]).

%	C dur v oktave 3
melodie(6,[c3,os,cis3,os,d3,os,dis3,os,e3,os,f3,os,fis3,os,g3,os,gis3,os,a3,os,ais3,os,h3,os,his3,os]).


%	definice delky not(ce,pu,ct,oc)

delkaNoty(ce,1200).
delkaNoty(pu,600).
delkaNoty(ct,300).
delkaNoty(os,150).


%	definice jednotlivych not

nota('x',20000).
nota('c1',261).
nota('cis1',276).
nota('d1',295).
nota('dis1',312).
nota('e1',330).
nota('f1',350).
nota('fis1',370).
nota('g1',394).
nota('gis1',418).
nota('a1',445).
nota('ais1',467).
nota('h1',492).
nota('his1',519).

nota('c2',525).
nota('cis2',556).
nota('d2',587).
nota('dis2',628).
nota('e2',663).
nota('f2',700).
nota('fis2',740).
nota('g2',784).
nota('gis2',838).
nota('a2',880).
nota('ais2',937).
nota('h2',989).
nota('his2',1055).

nota('c3',1059).
nota('cis3',1121).
nota('d3',1171).
nota('dis3',1239).
nota('e3',1328).
nota('f3',1412).
nota('fis3',1475).
nota('g3',1580).
nota('gis3',1661).
nota('a3',1765).
nota('ais3',1882).
nota('h3',1984).
nota('his3',2092).


%	zahraje jednu notu s delkou pulove noty

zahrajNotu(Nota):-
			nota(Nota,F),
			beep(F,1200).


%	zahrajete jednu notu, ale se zvolenou delkou noty(ce,pu,ct,os)

zahrajNotu(Nota,DelkaNoty):-
			delkaNoty(DelkaNoty,D),
			nota(Nota,F),
			beep(F,D).


%	hraje pokud seznam obsahuje pouze jednu notu a pripadne ukonci hrani

hraj([N,D|[]]):-
			zahrajNotu(N,D).


%	hraje dle zadaneho seznamu pomoci rekurze

hraj([N,D|T]):-
			zahrajNotu(N,D),
			hraj(T).


%	hraje dle zadaneho seznamu pomoci rekurze, ale se zvolenou rychlosti melodie

hraj([N,D|T],Rychlost):-
			delkaNoty(D,P),
			Delkanoty is P*Rychlost,
			nota(N,No),
			beep(No,Delkanoty),
			hraj(T,Rychlost).


%	hraje zvolenou melodii ze seznamu melodii

hrajMelodii(C):-
			melodie(C,S),
			hraj(S).

%	hraje melodii ze seznamu a se zadanou rychlosti hrani(cisla 0-5 => rychlost*delka=delka noty)

hrajMelodii(C,Rychlost):-
			melodie(C,S),
			hraj(S,Rychlost).


% Spousteci prikaz

spustit:-
			nl,write('  '),
			nl,write('  Dobry den Vazeny(a) pane(i),'),
			nl,write('  Vita Vas program pro prehravani not nebo celych melodii.'),
			nl,write('  '),
			nl,write('  NOTA se zadava malymi pismeny ve formatu {c,d,e,f,g,a,h,x}, oktava{0 - 3}, pripadne muzete pouzit {cis,dis} atd.'),
 			nl,write('  x znamena zadna nota, tedy pauza'),
			nl,write('  priklad: c1,cis2,e3,his2, atd..'),
			nl,write('  DELKA NOTY se zadava {ce,pu,ct,os} (cela,pulova,ctvrtinova,osminova)'),
			nl,write('  Program v sobe obsahuje celkem 6 melodii, ktere si muzete nechat zahrat'),
			nl,write('  K hrani pouzijte tyto PREDIKATY:'),
			nl,write(''),
 			nl,write('  zahrajNotu(NOTA). - priklad: zahrajNotu(gis2). - zahraje jednu notu s delkou pulove noty'),
			nl,write('  zahrajNotu(NOTA,DELKANOTY). - priklad:  zahrajNotu(c2,ct). - zahrajete jednu notu, ale se zvolenou delkou noty'),
			nl,write('  hraj([SEZNAM_NOT]). - priklad: hraj([c3,ce,a1,pu,gis1,ce]). - hraje dle zadaneho seznamu'),
			nl,write('  hraj([SEZNAM_NOT],RYCHLOST). - priklad: hraj([c3,ce,a1,pu,gis1,ce],4). - hraje dle zadaneho seznamu a rychlosti(0-5)'),
			nl,write('  hrajMelodii(CISLOMELODIE). - priklad: hrajMelodii(3). - hraje zvolenou melodii ze seznamu melodii(1-6)'),
			nl,write('  hrajMelodii(CISLOMELODIE,RYCHLOST). - priklad: hrajMelodii(1,0.5). - hraje melodii ze seznamu a se zadanou rychlosti'),
 			nl,write('  hrani(cisla 0-5 => rychlost*delka=delka noty)'),
			nl,write(' '),
			nl,write(' ').

