Praktikum iz bjektn-rijentisang prgramiranja (13S112POOP) Prjektni zadatak Java Napisati skup klasa sa dgvarajućim metdama, knstruktrima, peratrima i destruktrima za realizaciju sftverskg sistema za sviranje klavira. Ptrebn je bezbediti mgućnst sviranja pmću tastature ili miša, ka i učitavanje i snimanje kmpzicija. Pdržani frmati fajlva treba da budu TXT i MIDI a treba predvideti i mgućnst prširenja drugim frmatima. Opis frmata navedenih fajlva je dat u prilgu vg dkumenta. Krisnik (naručilac) sftvera, želi da sftver pruži sledeće funkcinalnsti: Interakciju sa krisnikm putem grafičkg krisničkg interfejsa Učitavanje pdataka Osnvnu bradu učitavanje pdataka kmpziciji učitavanje pdataka ntama prikaz pdataka kmpziciji sviranje pmću tastature ili miša snimanje kmpzicije Eksprtvanje kmpzicije Kraj rada frmatiranje fajlva p TXT ili MIDI frmatu Za uspešn rešenje zadatka ptrebn je izvršiti analizu zahteva. Ka rezultat analize, ptrebn je dpuniti i precizirati funkcinalnu specifikaciju sftverskg alata. Na snvu specifikacije, ptrebn je napisati sistem klasa u jeziku Java kje realizuju traženi sftver. U nastavku su navedeni neki elementi specifikacije. Od studenata se čekuje da dpune ne stavke kje nisu dvljn precizn frmulisane, dnsn ddaju nve stavke (tam gde t ima smisla) uklik uče prstr za unapređenje. Izmene i dpune specifikacije mgu da dnekle dudaraju d zahteva naručica sftvera u nj meri u kjj t neće narušiti traženu funkcinalnst. Takđe, prilženi UML dijagram kji pisuje zahtevani sftver se ne mra bavezn pštvati, već sam predstavlja skicu ptencijalng rešenja. Prilikm izrade specifikacije vditi računa ptencijalnm unapređenju sftvera na snvu naknadnih zahteva. Prilikm izrade rešenja, d studenata se čekuje intenzivn krišćenje svih nih mgućnsti kje pružaju specifikacija i bibliteke jezika Java, ka št su klekcije, algritmi, regularni izrazi, iteratri, lambda izrazi i sl. Rešenja kja ne vde računa vm aspektu neće mći da dbiju maksimalan brj pena. Takđe, vditi računa bjektn rijentisanm dizajnu rešenja, čistći, čitksti i kmentarisanju prgramskg kda. 1
Osnvni pjmvi Kmpzicija se sastji d muzičkih simbla. Muzički simbli su nta i pauza. Muzički simbl ima svje trajanje kje se zadaju u vidu razlmka. Nta je pisana ktavm (ce brj u psegu 2-6) i visinm (C, D, E, F, G, A, B, pznatije ka: DO, RE, MI, FA, SOL, LA, SI). Izgled upršćene verzije klavira kja se kristi u vm prjektu sa značenim ktavama dat je na slici 1. Slika 1. Izgled klavira Ntu je mguće pvisiti ddavanjem zanaka # (pvisilica), te je pvišena nta C u stvari C# (tuda i naziv prgramskg jezika). Pvišene nte se na klaviru sviraju na crnim dirkama desn d snvne nte. Slžena nta (dvzvuk ili akrd) se sastji d više drugih nta kje se sviraju istvremen, a sve mraju biti istg trajanja. C D E F G A B Na slici 2. dat je uvećan prikaz jedne ktave sa značenim tnvima. Crnim slvima su na dirkama značeni tnvi kje predstavljaju bele dirke, dk su crvenim slvima značeni tnvi kje predstavljaju crne dirke iznad njih, tj. pvišeni tnvi (snizilice nećem razmatrati u vm prjektu). Raspred tnva je u isti u svim ktavama, a radi jednstavnsti uzet je da se klavir sastji d 5 celih ktava. Slika 2. Izgled jedne ktave 2
Funkcinalna specifikacija U nastavku je zadat de krisničkih zahteva kje treba razraditi i, p ptrebi, dpuniti tak da se dbije funkcinalna aplikacija. Interakcija sa krisnikm Krisnik mže da interaguje sa prgramm izbrm u datm trenutku dstupnih pcija putem grafičkg krisničkg interfejsa. Interakcija mže da se vrši putem tastature ili miša. U zavisnsti d izabrane pcije i njenih parametara, prgram izvršava zadatu pciju ili ispisuje pruku greške. Pruka greške treba da bude št je mguće detaljnija da bi krisniku pmgla da grešku tklni. Sve eventualne parametre kji su ptrebni prilikm rada aplikacije je ptrebn zatražiti d krisnika. Uklik krisnik ne zada ništa, kristiti vrednsti fiksirane u prgramu. Učitavanje pdataka Predvideti pstjanje knfiguracing fajla sa ptrebnim mapiranjima karaktera na nte i MIDI brjeve. U svakm redu datteke nalaze se pdaci za p jedan ulazni karakter i t: karakter kji se pisuje, tekstualni pis nte i MIDI brj nte, dvjeni znakm zareza, ka u navedenm primeru, kji pisuje karakter t kji se mapira na ntu C4 čiji je MIDI brj 60: t,c4,60 Dat mapiranje ptrebn je iskristiti prilikm iscrtavanja klavira. Na zahtev krisnika na svakj dirki klavira se iscrtava karakter kji je ptrebn pritisnuti na tastaturi da bi se prizve tn te dirke, št će detaljnije biti pisan u nastavku dkumenta. Krisnik dabirm pnuđene pcije iz menija i unsm putanje d ulazng fajla mže zahtevati učitavanje kmpzicije. Prilikm učitavanja dvljn je pdržati sam tekstualni frmat fajla. Ulazni fajl se sastji d sekvence karaktera kji pisuju muzičke simble. Mže sadržati prelaze u nvi red, ali njih treba ignrisati. Dekdvanje ulazng fajla i pretvaranje karaktera u muzičke simble se vrši uz pmć mapiranja kje se učitava p pkretanju prgrama. Na snvu mapiranja se dređuje visina i ktava u kjj se nta nalazi. Prilikm parsiranja fajla pauze i trajanja nta se dređuju prema sledećim pravilima: blank znak značava pauzu u trajanju 1/8 znak između simbla značava pauzu u trajanju 1/4 trajanje nta navedenih unutar uglastih zagrada sa znakm razmaka između svake nte je 1/8 navđenje nta unutar uglastih zagrada bez znaka razmaka između njih značava da sve nte treba dsvirati u istm trenutku i sve nte su trajanja 1/4 trajanje nta navedenih van zagrada je 1/4 3
U nastavku je dat primer dela ulazng fajla, a u tabeli ispd i tumačenje svakg d simbla: [Yui] t Yu [t u y] Ulazni simbli Simbli kje značavaju Trajanje simbla [Yui] nte D#4, E4 i F4 1/4 (sviraju se istvremen) _ (blank znak) pauza 1/8 t nta C4 1/4 pauza 1/4 Yu nte D#4 i E4 1/4 (sviraju se jedna za drugm) _ (blank znak) pauza 1/8 [t u y] nte C4, E4 i D4 1/8 (sviraju se jedna za drugm) Prilikm učitavanja pdataka kmpzicijama i ntama kristiti regularne izraze za parsiranje datih fajlva. Predvideti način za pravak d grešaka u slučaju neispravng frmata datteke ili nepstjanja tražene datteke. Osnvna brada Krisniku je ptrebn mgućiti sledeće: Učitavanje i prikaz kmpzicije. Krisnik mže izabrati da se učitana kmpzicija prikazuje u vidu slva iz tekstualng fajla iz kg je vršen učitavanje ili u vidu tekstualnih pisa nta, kje je mguće prnaći u fajlu sa mapiranjem. U ba slučaja se sve nte kje se sviraju u jednm trenutku ispisuju vertikaln (jedna ispd druge). Prilikm ispisivanja pauza dvljn je staviti prazan prstr. Trajanja 1/4 značiti crvenm bjm pzadine ili slva, a trajanja 1/8 zelenm bjm. Ispd ispisa tekstualnih pisa stavljati markere u vidu crnih linija kje značavaju četvrtine. Na slici 3. prikazani su primeri ba načina ispisa datg dela kmpzicije. [Yui] t Yu [t u y] Slika 3. Primeri ispisa kmpzicije 4
Autmatsk sviranje kmpzicije. Krisnik mže zatražiti da se učitana kmpzicija dsvira. Ptrebn je bezbediti mgućnst privremeng i trajng zaustavljanja sviranja. Tkm sviranja na prikazanm klaviru ptrebn je crvenm bjm beležavati dirke tnva kji se u tm trenutku sviraju. Takđe, tekstualni prikaz kmpzicije je ptrebn pmerati ulev tkm sviranja tak da je prvi prikazani tn uvek naj kji se trenutn svira. P završetku sviranja kmpzicije ptrebn je vratiti tekstualni prikaz u prvbitn stanje. Sviranje klavira. Krisnik u bil km trenutku (i pre učitavanja kmpzicije) mže svirati p klaviru pmću miša (klikm na prikazane dirke) ili tastature (pritiskanjem tastera na tastaturi kji dgvaraju dirkama klavira). Obezbediti mgućnst da se na dirkama klavira ispišu tekstualni pisi nta radi lakšeg sviranja. Uklik prilikm sviranja klavira pstji učitana kmpzicija i krisnik dsvira tn kji se i čekuje ptrebn je pmeriti prikaz kmpzicije ulev (ka i kd autmatskg sviranja) sve d sledećeg tna kji se svira (navedeni kncept je čest mguće naći u igricama kje testiraju kucanje na tastaturi, a u kjima se pjavljuju i pmeraju ulev reči kje je ptrebn tkucati). Uklik se čekuje više tnva istvremen njihv redsled se mže zanemariti, ali je ptrebn da svi budu dsvirani u kratkm vremenskm intervalu. P završetku kmpzicije ili na zahtev krisnika ptrebn je vratiti tekstualni prikaz na pčetak kmpzicije. Snimanje kmpzicije. Ptrebn je bezbediti mgućnst snimanja kmpzicije. Krisnik mže izabrati pciju za pčetak snimanja, a zatim svira p prikazanm klaviru na jedan d pisanih načina. P završetku, krisnik bira pciju za snimanje kmpzicije kju je svira. Prgram treba da bezbedi eskprtvanje dsvirane kmpzicije u tekstualnm ili MIDI frmatu u fajl sa zadatm putanjm. Pauze na pčetku i kraju kmpzicije je ptrebn ignrisati. Trajanje tnva dređivati na snvu dužine pritiska tastera. Kraj rada Krisnik mže da zahteva kraj rada. Od krisnika se traži ptvrda za napuštanje prgrama, uz upzrenje uklik prgram nakn pslednjeg snimanja kmpzicije nije generisa neki fajl. Krisniku treba pnuditi mgućnst da eksprtuje kmpziciju pre napuštanja prgrama, uklik t želi. Testiranje rada prgrama Test primere za testiranje rada realizvang sftverskg rešenja mguće je naći na sajtu: https://virtualpian.net/. Sajt mgućava sviranje virtuelng klavira pmću tastature računara, prema istim pravilima kja važe i u vm prjektu. Za veliki brj kmpzicija bezbeđeni su skupvi karaktera kje je ptrebn pritiskati, kji ujedn predstavljaju i ulazne fajlve vg sftvera, a mguće ih je prnaći pd pcijm Music sheets. Rezultat rada prgrama, dnsn krektnst generisanih fajlva je mguće prveriti alatima za reprdukciju. 5
MIDI fajl mže se prveriti pmću velikg brja audi alata, među kjima je i Windws Media Player, kji dlazi instaliran uz Windws perativni sistem i pdržava puštanje midi fajlva. Dijagram klasa Na snvu prethdne funkcinalne specifikacije frmiran je sledeći dijagram klasa. Dijagram klasa nije detaljan, te ga treba tumačiti ka skicu kja načeln ukazuje na arhitekturu sftvera. Studenti mgu da kriste vaj dijagram ka referencu i, p ptrebi, pršire ga da bi ga usaglasili sa eventualnim dpunama specifikacije. Prilikm implementacije rešenja, bratiti pažnju na bjektn rijentisani dizajn i intenzivn kristiti klekcije i algritme standardne bibliteke jezika Java i lambda funkcije gde gd je t mguće. Primetiti da pstje dva različita frmata izlaznih fajlva. Specifikacija MIDI frmata Kmpletnu specifikaciju MIDI frmata fajla mguće je prnaći na sledećj adresi: http://www.music.mcgill.ca/~ich/classes/mumt306/standardmidifilefrmat.html Za ptrebe prjekta ptrebn je iskristiti Java Sund API : https://www.racle.cm/technetwrk/java/javasunddem-140014.html Na navedenm linku mguće je naći kmpletnu dkumentaciju, a na narednj strani dkumenta dat je primer uptrebe v bibliteke. U primeru je predstavljena jedna klasa sa glavnm funkcijm, a p pkretanju krisnik ima mgućnst da unsi MIDI brjeve nta kje prgram ptm svira. 6
package muzika; imprt javax.sund.midi.midichannel; imprt javax.sund.midi.midisystem; imprt javax.sund.midi.midiunavailableexceptin; imprt javax.sund.midi.synthesizer; imprt java.util.scanner; public class MidiPlayer { private static final int DEFAULT_INSTRUMENT = 1; private MidiChannel channel; public MidiPlayer() thrws MidiUnavailableExceptin { this(default_instrument); public MidiPlayer(int instrument) thrws MidiUnavailableExceptin { channel = getchannel(instrument); public vid play(final int nte) { channel.nteon(nte, 50); public vid release(final int nte) { channel.nteoff(nte, 50); public vid play(final int nte, final lng length) thrws InterruptedExceptin { play(nte); Thread.sleep(length); release(nte); private static MidiChannel getchannel(int instrument) thrws MidiUnavailableExceptin { Synthesizer synthesizer = MidiSystem.getSynthesizer(); synthesizer.pen(); return synthesizer.getchannels()[instrument]; public static vid main(string[] args) thrws Exceptin { MidiPlayer player = new MidiPlayer(); Scanner scanner = new Scanner(System.in); int nte; while (!Thread.currentThread().isInterrupted()) { System.ut.print("Nte (1..127) : "); nte = scanner.nextint(); player.play(nte, 200); scanner.clse(); 7