ZÁPOČTOVÝ PROGRAM - přehrávač not
1) Zadání
Napsat program v prologu, který dokáže zahrát jakékoliv noty od C až po H a to ve třech oktávách. Vytvořit přehrávač not, který bude hrát podle not zadaných uživatelem. Uživatel má možnost zadat více not(seznam not) a nechat si zahrát třeba celou melodii nebo pouze jednu notu. Uživatel může pro každou notu nastavit její délku(půlová, atd..)
Program má v sobě implementováno několik meledií, pro snadnější hraní a ukázku not.
2) popis problematiky zadání
Bylo nutné nastudovat a vyhledat jak funguje stupnice not a v prologu jak funguje hraní not pomocí příkazu BEEP. Dále promyslet jak použít rekurzi a použití seznamu not na hraní melodií.
3) popis řešení
Při řešení jsem postupoval takto:
- seznámil jsem se s věstavěnnými predikáty, především pak predikátem BEEP.
- Po zjištění jak funguje predikát BEEP jsem na internetu vyhledal přibližnou frekvenci not a rozsah pro délku not.
- Začal sem nastavovat jednotlivé predikáty Nota(nota,frekvence).
- Vytvoření predikátu delkaNoty(delka,delka_ms).
- Vytvoření jednoduchých predikátů zahrajNotu(nota) a zahrajNotu(nota,delka).
- Sepsaní melodií jako pomůcka pro testovaní a lepší použitelnost programu.
- Vytvoření predikátu hraj([N,D|[]]) včetně rekurze pro hraní více not(melodií).
- Vytvoření predikátu pro hraní melodií.
- Vylepšení a nápad v podobě rychlosti přehrávaných not. Implementace predikátu hraj([N,D|T],Rychlost).
- Možnost zadat rychlost přehrávání i pro melodie pomocí predikátu.
- Kontrola správné funkčnosti programu a jeho vyladění.
- Sepsání uvítáni programu a nápovědy.
4) popis predikátů
- melodie(cislo,['NOTA','DELKA']). - seznam not danné melodie
- delkaNoty(DELKA,DELKA_ms). - definování delky not(ce,pu,ct,os)
- nota('NOTA',FREKVENCE). - definování jednotlivych not
- zahrajNotu(NOTA). - zahraje jednu notu s délkou půlové noty
- zahrajNotu(NOTA,DELKA). - zahrajete jednu notu, ale se zvolenou délkou noty(ce,pu,ct,os)
- hraj([NOTA,DELKA|[]]). - hraje pokud seznam obsahuje pouze jednu notu a případně ukončí hraní
- hraj([N,D|T]) - hraje dle zadaneho seznamu pomoci rekurze
- hraj([N,D|T],Rychlost) - hraje dle zadaneho seznamu pomoci rekurze, ale se zvolenou rychlosti melodie
- hrajMelodii(C) - hraje zvolenou melodii ze seznamu melodii
- hrajMelodii(C,Rychlost) - hraje melodii ze seznamu a se zadanou rychlosti hraní(cisla 0-5 => rychlost*delka=delka noty)
- spustit - napoveda pro uzivatele programu
5) ukázka volání s konkrétními hodnotami a výsledky
zahrajNotu(gis2). - zahraje jednu notu s délkou půlové noty
zahrajNotu(c2,ct). - zahraje jednu notu, ale se zvolenou délkou noty
hraj([c3,ce,a1,pu,gis1,ce]). - hraje dle zadaného seznamu
hraj([c3,ce,a1,pu,gis1,ce],4). - hraje dle zadaného seznamu a rychlosti(0-5)
hrajMelodii(3). - hraje zvolenou melodii ze seznamu melodií(1-5)
hrajMelodii(1,0.5). - hraje melodii ze seznamu a se zadanou rychlostí hrani(cisla 0-5 => rychlost*delka=delka noty)
6) zhodnocení pracnosti, efektivity výpočtu, elegance programu, použitého řešení atp.
Program mi zabral spoustu času a energie, hlavne kvůli zjištění frekvence not a jejich vyladěníi, aby to hrálo aspoň približně podle skutečnosti. Efektivita výpočtu je podle mě relativně vysoká a víc zjědnodušit už se mi ji nepovedlo. Použité řešení mi připadá jednoduché a zároveň celkem efektivní a pro danný případ jedno z lepších.
7) Příloha: Seznam melodií
- není nutno
- kočka leze dírou
- ovčáci čtveráci
- C dur v oktave 1
- C dur v oktave 2
- C dur v oktave 3
8) Příloha: Stažení programu
program.pl
Radek Bartuška