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:

  1. seznámil jsem se s věstavěnnými predikáty, především pak predikátem BEEP.
  2. Po zjištění jak funguje predikát BEEP jsem na internetu vyhledal přibližnou frekvenci not a rozsah pro délku not.
  3. Začal sem nastavovat jednotlivé predikáty Nota(nota,frekvence).
  4. Vytvoření predikátu delkaNoty(delka,delka_ms).
  5. Vytvoření jednoduchých predikátů zahrajNotu(nota) a zahrajNotu(nota,delka).
  6. Sepsaní melodií jako pomůcka pro testovaní a lepší použitelnost programu.
  7. Vytvoření predikátu hraj([N,D|[]]) včetně rekurze pro hraní více not(melodií).
  8. Vytvoření predikátu pro hraní melodií.
  9. Vylepšení a nápad v podobě rychlosti přehrávaných not. Implementace predikátu hraj([N,D|T],Rychlost).
  10. Možnost zadat rychlost přehrávání i pro melodie pomocí predikátu.
  11. Kontrola správné funkčnosti programu a jeho vyladění.
  12. 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í

  1. není nutno
  2. kočka leze dírou
  3. ovčáci čtveráci
  4. C dur v oktave 1
  5. C dur v oktave 2
  6. C dur v oktave 3

8) Příloha: Stažení programu

program.pl

Radek Bartuška