aplikacja ułatwiajaca˛ nauke˛ gry na elektronicznym ... · swoje dzieci´ nstwo spedziłem ......

49
Politechnika Warszawska Wydzial Elektroniki i Technik Informacyjnych Instytut Informatyki Rok akademicki 2011/2012 Praca dyplomowa in ˙ zynierska Bartosz Mateusz Kielbaszewski Aplikacja ulatwiaj ˛ aca nauk ˛ e gry na elektronicznym instrumencie klawiszowym Opiekun pracy: Dr in˙ z. Jacek Raczkowski Ocena ................................. ......................................... Podpis Przewodnicz ˛ acego Komisji Egzaminu Dyplomowego

Upload: dangduong

Post on 28-Feb-2019

212 views

Category:

Documents


0 download

TRANSCRIPT

Politechnika WarszawskaWydział Elektroniki i Technik Informacyjnych

Instytut Informatyki

Rok akademicki 2011/2012

Praca dyplomowa inzynierska

Bartosz Mateusz Kiełbaszewski

Aplikacja ułatwiajaca nauke gry naelektronicznym instrumencie

klawiszowym

Opiekun pracy:

Dr inz. Jacek Raczkowski

Ocena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Podpis Przewodniczacego

Komisji Egzaminu Dyplomowego

Specjalnosc: Informatyka –Inzynieria oprogramowaniai systemy informacyjne

Data urodzenia: 21 wrzesnia 1989 r.

Data rozpoczecia studiów: 1 pazdziernika 2008 r.

Zyciorys

Urodziłem sie 21 wrzesnia 1989 roku w Łodzi. Swoje dziecinstwo spedziłemw Hajnówce (woj. podlaskie). W 2005 roku rozpoczałem nauke w liceum ogól-nokształcacym nr 2 w Hajnówce na profilu matematyczno-fizycznym. Po zdaniuegzaminów maturalnych dostałem sie na studia dzienne I stopnia, na wydziałElektroniki i Technik Informacyjnych Politechniki Warszawskiej. Podczas studiówwybrana przeze mnie specjalnoscia była Inzynieria oprogramowania i systemy in-formacyjne.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .podpis studenta

Egzamin dyplomowy

Złozył egzamin dyplomowy w dn. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Z wynikiem .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Ogólny wynik studiów .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Dodatkowe wnioski i uwagi Komisji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Streszczenie

Praca ta prezentuje proces tworzenia oraz sposób działania aplikacji ułatwiaja-cej nauke gry na elektronicznym instrumencie klawiszowym. Program korzysta zestandardu MIDI w celu uzyskania komunikacji pomiedzy komputerem, a instrumen-tem muzycznym. Przedstawione zostana wiadomosci systemu MIDI oraz ich rolaw aplikacji. Omówione bedzie wykorzystanie plików MIDI i zostanie wyjasnione,dlaczego moga one stanowic dobre zródło utworów muzycznych do wykorzystaniaprzez aplikacje. Opisane zostana takze problemy, jakie zostały napotkane podczastworzenia programu oraz sposoby na ich rozwiazanie. W pracy znajduja sie takzeinformacje na temat javax.sound.midi i kilku wybranych pojec muzycznych, którychznajomosc jest niezbedna do zrozumienia działania aplikacji. Omówione zostanatakze mozliwosci aplikacji oraz pomysły na jej dalszy rozwój.

Słowa kluczowe: MIDI, SMF, pliki MIDI, pianino, muzyka, fortepian, keyboard, in-strument klawiszowy, notacja muzyczna, pianino elektroniczne, klawiatura steru-jaca, Java

Abstract

Title: A helper application for learning to play on an electronic keyboard instrument

This B.Sc. Thesis comprises the project and implementation of an applicationwhich can help in learning to play on a keyboard instrument. The programmeuses the MIDI standard to create a connection between the computer and electronicmusical instrument. It includes an overview of MIDI messages, Standard MIDI Filesand presents their role in the whole system’s creation. The thesis also describes thejavax.sound.midi package and several basic musical concepts. Moreover, the workwas partly dedicated to the demonstrating application features and the ideas for itsfuture development.

Key words: MIDI, SMF, Standard Midi Files, music, keyboard, piano, notes, musicalnotation, Java

Spis tresci

1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1. Cel pracy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2. Teoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22.1. Teoria muzyczna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

2.1.1. Notacja muzyczna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22.1.2. Klawiatura muzyczna i jej dzwieki . . . . . . . . . . . . . . . . . . . . . 5

2.2. Połaczenie instrumentu muzycznego z komputerem . . . . . . . . . . . . . . . 52.2.1. Rozpoznawanie dzwieków granych przez uzytkownika z uzyciem

mikrofonu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.2.2. Wysyłanie informacji o zagranych przez uzytkownika dzwiekach . . . 6

2.3. MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3.1. Wiadomosci MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.3.2. Pliki MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.4. Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.4.1. Java Sound API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3. Implementacja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.1. Budowa systemu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3.1.1. Łaczenie sie z urzadzeniem wejsciowym . . . . . . . . . . . . . . . . . . 93.1.2. Odbieranie wiadomosci MIDI . . . . . . . . . . . . . . . . . . . . . . . . 93.1.3. Klasa MidiMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.1.4. Klasa ShortMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.1.5. Wybrane System Common Messages . . . . . . . . . . . . . . . . . . . . 113.1.6. Wybrane System Real-Time Messages (Wiadomosci czasu rzeczywistego) 123.1.7. Klasa SysexMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.1.8. Klasa MetaMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.1.9. Odbieranie wiadomosci o wcisnietych klawiszach . . . . . . . . . . . . 143.1.10.Klasa opisujaca dzwiek . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.1.11.Wysyłanie wiadomosci MIDI . . . . . . . . . . . . . . . . . . . . . . . . . 153.1.12.Wczytywanie plików MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . 153.1.13.Sprawdzanie poprawnosci gry . . . . . . . . . . . . . . . . . . . . . . . . 16

3.2. Czesc wizualna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.2.1. System współrzednych uzywanych w programie . . . . . . . . . . . . . 183.2.2. Zmiana wielkosci grafik . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.2.3. Rysowanie schematu fortepianu na ekranie . . . . . . . . . . . . . . . . 203.2.4. Dwa rodzaje widoków udostepniane przez program . . . . . . . . . . . 223.2.5. Główny sposób wyswietlania nut . . . . . . . . . . . . . . . . . . . . . . 22

3.3. Inne opcje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.3.1. Wybór trybu gry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.3.2. Wybór sciezek MIDI do grania . . . . . . . . . . . . . . . . . . . . . . . . 293.3.3. Zmiana szybkosci odtwarzania utworu . . . . . . . . . . . . . . . . . . . 313.3.4. Zmiana wielkosci pola wyswietlajacego nuty . . . . . . . . . . . . . . . 313.3.5. Wybór syntezatora, cechy syntezatorów . . . . . . . . . . . . . . . . . . 343.3.6. Zmiana wysokosci dzwieków w utworze . . . . . . . . . . . . . . . . . . 343.3.7. Przewijanie utworu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363.3.8. Wygładzanie krawedzi (antyaliasing) . . . . . . . . . . . . . . . . . . . . 36

Spis tresci ii

3.3.9. Pliki konfiguracyjne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383.3.10.Pliki jezykowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393.3.11.Raportowanie błedów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

4. Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.1. Mozliwosci rozwoju aplikacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.2. Zakonczenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

1. Wprowadzenie

Nauka gry na instrumentach muzycznych wymaga poswiecenia duzej ilosciczasu. Wiele osób zaczyna uczyc sie grac na instrumencie, ale szybko rezygnuje ztego zajecia. Moim zdaniem powodem takiej sytuacji moze byc brak zadowalajacychefektów na wczesnych etapach cwiczen. Zanim poczatkujacy muzyk bedzie w staniezagrac jeden ze swoich ulubionych utworów, musi on pokonac bariere jaka stanowinauka zapisu nutowego (notacji muzycznej).

Nowoczesna notacja muzyczna jest efektem wieloletniej ewolucji zapisu muzyki- zawiera elementy majace uzasadnienie historyczne oraz róznice regionalne. Szyb-kie czytanie zapisu nutowego moze stanowic problem dla poczatkujacych, znakiemtego moga byc próby stworzenia standardów, których czytanie moze byc szybszetakich jak na przykład Simplified Music Notation 1. Popularyzacja komputerówpozwala nam na stworzenie własnych standardów, które nie maja tak silnych ogra-niczen, jak te przeznaczone do zapisania na papierze. Mozliwe staje sie uzywanieanimacji, dzwieków, a nawet analizowanie gry uzytkownika.

W swojej pracy przedstawie próby stworzenia aplikacji, której zadaniem bedzieuproszczenie nauki gry na elektronicznym instrumencie klawiszowym. Ukazanyzostanie przykład zapisu muzycznego, którego zrozumienie nie powinno zajac zbytwiele czasu.

1.1. Cel pracy

Celem pracy jest stworzenie aplikacji, bedacej w stanie ułatwic poczatkujacymmuzykom nauke gry utworów muzycznych. Program powinien byc w stanie wyswie-tlac łatwe do zrozumienia instrukcje zawierajace informacje, jaki dzwiek i kiedypowinien zostac zagrany; powinien takze sprawdzac poprawnosc gry. Aplikacjapowinna byc mozliwa do uruchomienia na przecietnym komputerze z systememWindows i współpracowac z mozliwe jak najwieksza gama urzadzen. Chciałbym,by stworzone narzedzie było dosc atrakcyjne wizualnie.

1 http://www.simplifiedmusicnotation.org/

2. Teoria

2.1. Teoria muzyczna

2.1.1. Notacja muzyczna

Historia współczesnej notacji muzycznej

Najstarsze znalezione sposoby zapisu muzyki zostały stworzone około 2000r.p.n.e. i przetrwały wyryte na tabliczkach w formie pisma klinowego. Historiawspółczesnej notacji muzycznej zaczyna sie, jednak prawdopodobnie od powstanianotacji cheironomicznej uzywanej do zapisu wczesnego chorału gregorianskiego.Nie zapisywała ona dokładnej wysokosci dzwieku, a jedynie przyblizony przebiegmelodii. Nie zawsze była zapisywana takze długosc poszczególnych dzwieków, po-prawny odczyt muzyki był niemozliwy dla osoby nie znajacej oryginalnego utworu.Najstarszy znany zapis pochodzi z “Musica disciplina” stworzonego przez Aurelia-nus Reomensis około 850 r.n.e.

Około X wieku n.e. zaczeła rozwijac sie notacja diastematyczna, w której moz-liwe było okreslenie wysokosci dzwieku na podstawie wertykalnego ustawienianeum. Format ewoluował, z czasem do zapisu uzywany zaczał byc system czterechrównoległych, poziomych linii - rozwiazanie te jest przypisywane Guido z Arezzo,który opisał swoja wizje w traktacie Micrologus. Nowoczesny zapis z uzyciem pie-ciolinii pojawił sie po raz pierwszy we Francji i stał sie powszechny do konca XVIwieku.

Równolegle wraz z rozwojem sposobu zapisania wysokosci dzwieku, rozwijał siezapis długosci jego trwania. W “De Mensurabili Musica” pochodzacym z XIII wiekuopisano szesc rodzajów rytmu stosowanego w tym czasie. Franco of Cologne opisałw traktacie “Ars cantus mensurabilis” pomysł okreslania rytmu z uzyciem kształtunuty. Uzycie taktu stało sie popularne do konca XII wieku.

Jak widac, sposób zapisu muzyki rozwijał sie przez wiele lat. Zawiera on cechy,które nabył w czasie swojej ewolucji, które moga stanowic problem dla poczatku-jacych muzyków starajacych sie zagrac szybko swój ulubiony utwór. Przedstawieproblemy zwiazane z tym układem w dalszej czesci pracy.

Budowa współczesnej notacji muzycznej

Współczesna notacja muzyczna (jej przykład widoczny jest na rysunku 2.1)uzywa pieciolinii do zapisu dzwieku (rys. 2.2) . Pieciolinia pozwala na okreslaniejedynie wzglednej wysokosci nut, by mozliwe było wyznaczenie wysokosci dzwiekuprzed pieciolinia ustawiany jest klucz, okreslajacy połozenie na pieciolinii jednego zdzwieków. Na rysunku 2.3 przedstawiony jest przykład połozenia popularnych klu-czy na pieciolinii - klucza wiolinowego oraz klucza basowego. Klucz wiolinowy jestkluczem G (okresla połozenie dzwieku G, ukazane na obrazku 2.5), a klucz basowyjest kluczem F (okresla połozenie dzwieku F, rys. 2.4). Na pieciolinii oraz nad niai pod nia zapisywane sa inne elementy notacji muzycznej takie, jak nuty, pauzy,

2.1. Teoria muzyczna 3

znaki chromatyczne (zmieniajace tonacje utworu, wysokosc dzwieków), jednostkametryczna (okreslajaca długosc trwania nut), oznaczenia tempa (element oznacza-jacy długosc trwania utworu badz liczbe uderzen metronomu na minute), oznacze-nia dynamiki (okreslajace siłe dzwieku, stosowane na instrumentach cechujacychsie mozliwoscia wydawania dzwieków o zróznicowanej głosnosci) czy oznaczeniaartykulacji (okreslajace sposób wydobywania dzwieku, na przykład legato oznaczasugestie gry dzwieków w płynny sposób - tak by trudno było rozróznic poszczególnenuty).

Rysunek 2.1. Przykład notacji muzycznej (Chopin – Preludium A-dur op. 28 nr 7)

Rysunek 2.2. Pieciolinia

2.1. Teoria muzyczna 4

Rysunek 2.3. Pieciolinia z widocznym kluczem basowym i wiolinowym.

Rysunek 2.4. Klucz basowy, zaznaczony dzwiek F.

Rysunek 2.5. Klucz wiolinowy, zaznaczony dzwiek G.

2.2. Połaczenie instrumentu muzycznego z komputerem 5

2.1.2. Klawiatura muzyczna i jej dzwieki

Rysunek 2.6. Klawiatura muzyczna (zawierajaca trzy oktawy)

Standardowa fortepianowa klawiatura muzyczna zawiera zwykle 12 klawiszy,pozwalajacych na zagranie wszystkich dzwieków ze skali chromatycznej (dwuna-stostopniowej). Poszczególne stopnie tej skali oddalone sa od siebie o pół tonu.Dłuzsze, białe klawisze reprezentuja dzwieki tworzace skale muzyczna C-dur (C, D,E, F, G, A, B1). Pozostałe dzwieki nie stanowiace czesci skali sa wydawane przezkrótsze, czarne klawisze; nazwy dzwieków tworzone sa od nazwy sasiadujacychdzwieków skali C-dur oraz znaku krzyzyka badz bemolu (C]/D[, D]/E[, F]/G[,G]/A[, A]/B[). Dzwiek C] czytany jest jako “cis” (dodajemy do nazwy dzwiekuprzyrostek -is), a dzwiek G[ jako “ges” (dodajemy sufiks -es). Fragment klawiaturymuzycznej o szerokosci trzech oktaw ukazany jest na rysunku 2.6.

2.2. Połaczenie instrumentu muzycznego z komputerem

Aplikacja, by mogła spełniac swoja role i rozpoznawac nuty grane przez muzykamusi w jakis sposób komunikowac sie z komputerem. Wpadłem na dwa sposoby narealizacje tego zadania. Pierwszym z nich jest wykorzystanie mikrofonu, nagrywa-nia dzwieków granych przez uzytkownika i rozpoznawania ich. Drugim sposobemjest uzycie urzadzenia, które poza generowaniem dzwieku byłoby w stanie wysłacnam informacje o zagranych przez uzytkownika dzwiekach. Kazde z rozwiazan maswoje wady i zalety.

2.2.1. Rozpoznawanie dzwieków granych przez uzytkownika z uzyciemmikrofonu

Mozliwe jest rozpoznawanie wysokosci granych dzwieków z uzyciem mikrofonupoprzez wykorzystanie algorytmu Szybkiej transformacji Fouriera (FFT). Rozwia-zanie te ma oczywiste zalety - jestesmy w stanie uniezaleznic działanie aplikacjiod uzywanego instrumentu muzycznego oraz nie jestesmy zmuszeni do uzywaniazadnych standardów przesyłania danych. Mozliwosc bezprzewodowej pracy z kom-puterem jest dodatkowa zaleta.

Niestety, rozwiazanie te ma takze istotne wady, które sprawiły, iz zrezygnowałemz jego wykorzystania w moim programie. Testujac w praktyce działanie programów

1 Dzwiek B w Niemczech, Europie Wschodniej i Centralnej oraz Skandynawii bywa oznaczanyjako H.

2.3. MIDI 6

rozpoznajacych dzwieki grane na gitarze elektrycznej2 odkryłem, ze gdy współpra-cuja one z prostym mikrofonem maja dosc spore opóznienie i sa zbyt niedokładne.Dodatkowa wada moze byc podatnosc na zakłócenia otoczenia. Testowałem dzia-łanie aplikacji w dosc głosnym otoczeniu, co sprawiało dodatkowe problemy. Pró-bowałem takze podłaczac gitare bezposrednio do komputera (korzystajac z przej-sciówki kabla cinch uzywanego przez gitare do mini jack), jednak jakosc rozpozna-wania ciagle nie spełniała moich oczekiwan.

2.2.2. Wysyłanie informacji o zagranych przez uzytkownika dzwiekach

Kolejnym rozwiazaniem jest skorzystanie ze standardu MIDI do przesyłania in-formacji o granych nutach. Standard MIDI jest popularnym rozwiazaniem głów-nie w elektronicznych instrumentach klawiszowych. Z oczywistych powodów niejestesmy w stanie uzyc tej technologii w przypadku korzystania z instrumentówakustycznych. Istnieja takze inne instrumenty z wyjsciem MIDI, na przykład gitaryelektroniczne produkowane przez firme Casio (np. model Casio PG-380).

Inne zalety zwiazane z uzyciem MIDI do przesyłania informacji do komputera todosc niskie opóznienie (w porównaniu do podejscia zwiazanego z analiza sygnału)oraz własciwie całkowita bezbłednosc przesyłanych informacji (w przypadku zbytmałej ilosci próbek sygnału konkurencyjny algorytm FFT moze błednie rozpozna-wac składowe czestotliwosci).

Dzieki wysyłaniu informacji o nutach mozliwe staje sie generowanie dzwiekunie w samym instrumencie, a w komputerze. Jestesmy w stanie grac z uzyciemsyntezatora symulujacego taki instrument, w jakim oryginalnie został zagranyutwór.

W elektronicznych instrumentach klawiszowych takich, jak keyboard, czy kla-wiatura sterujaca, istnienie wyjscia MIDI jest bardzo prawdopodobne. Niestety, wkomputerach oraz laptopach wejscia midi sa ostatnio dosc rzadko spotykanie, przy-najmniej w przypadku modeli nie posiadajacych niezintegrowanej karty muzycznej.Na szczescie nie powinno stanowic to powaznego problemu dla uzytkowników, no-woczesne keyboardy zamiast wyjscia MIDI posiadaja czesto wyjscie MIDI USB. Jeslichcemy do pracy z aplikacja uzywac urzadzenia z wyjsciem MIDI mozemy zdecydo-wac sie na zakup przejsciówki MIDI-USB3.

2.3. MIDI

MIDI (skrót od Musical Instrument Digital Interface) jest systemem słuzacym doprzekazywania informacji pomiedzy elektronicznymi instrumentami muzycznymi.Został on stworzony w 1983 roku i pozwolił na ułatwienie komunikacji pomie-dzy klawiaturami i syntezatorami róznych firm. Umozliwił on unikniecie efektu“sciany syntezatorów” - otaczania sie muzyków duza liczba syntezatorów wraz zklawiaturami podczas koncertów. Dzieki popularyzacji standardu mozliwe stałosie korzystanie z jednej badz kilku klawiatur komunikujacych sie z kolekcja synte-zatorów z uzyciem kabla MIDI. Standard MIDI pozwolił na uzywanie komputerówdo tworzenia muzyki, poczatkowo stosowanych głównie w roli sekwencerów (urza-dzen sterujacych innym urzadzeniem MIDI, na przykład syntezatorem). Standard

2 http://www.aptuner.com3 Na przykład konwerter CL036-USB to MIDI

2.3. MIDI 7

MIDI uzywa wiadomosci (ang. messages) do przesyłania informacji. Mozliwe jestzapisanie serii wiadomosci w formie pliku MIDI. Wiecej informacji o standardzieMIDI mozna znalezc pod adresem4.

2.3.1. Wiadomosci MIDI

MIDI 1.0 uzywa 16 kanałów do przesyłania wiadomosci. Kanały uzywane sa doodróznienia od siebie “głosów” badz “instrumentów”. Pozwala to na kontrolowaniejednoczesnie wielu róznych instrumentów jednoczesnie. Do kazdego z kanałówmozemy przypisac ustawienia takie jak rodzaj instrumentu, czy głosnosc. MIDIw wersji 1.0 definiuje kilka podstawowych rodzajów wiadomosci jakie mozemyprzekazac na kazdy z kanałów:— Wiadomosc zagrania dzwieku (ang. note on) / wiadomosc przerwania gry (ang.

note off). Wiadomosc ta zawiera informacje jaka nuta została zagrana (obsłu-giwane sa dzwieki o czestotliwosci od 8,176 Hz do 12 544 Hz z dokładnosciado półtonu - jestesmy w stanie przekazac informacje o wcisnieciu kazdego z 88klawiszy urzadzenia o układzie klawiatury klasycznego fortepianu). Dodatkowoprzesyłania jest informacja o szybkosci, z jaka został wcisniety klawisz (ang.velocity) w zakresie 0-127. Odtwarzanie dzwieku przerywane jest dopiero pootrzymaniu wiadomosci przerwania gry. Jest to jedna z najwazniejszych wia-domosci wykorzystywanych przez program, dzieki niej wiemy, które klawiszewciska uzytkownik.

— Wiadomosc zmiany wysokosci dzwieku (ang. pitch-bend). Pozwala ona nazmiane wysokosci dzwieku w obrebie dwóch półtonów z dokładnoscia do 1/8192półtonu. Ucho ludzkie ma problemy z rozróznieniem dzwieków rózniacych sieod siebie o mniej niz 1/20 półtonu. Dzieki tej wiadomosci mozliwe jest uzy-skanie efektu portamento, czyli łagodnego przejscia miedzy jednym, a drugimdzwiekiem.

— Wiadomosc “Control Change”. Moze ona niesc dosc róznorodne informacje, naprzykład o zmianie barwy dzwieku, panoramy stereo (ang. panning) badz gło-snosci. Moze byc takze uzywana do kontroli podswietlanych klawiszy (dostep-nych w niektórych keyboardach), a nawet zarzadzania działaniem oswietleniasceny.

— Wiadomosc “Program Change”. Uzywana jest do przesyłania rozkazu zmianyprogramu (na przykład przydatna przy wyborze instrumentu z bazy synteza-tora).

— Wiadomosc “Aftertouch”. Z uzyciem tej wiadomosci przesyłane sa dane doty-czace zmiany siły nacisku na klawisz instrumentu - funkcja ta jest niedostepnaw tanszych instrumentach muzycznych.

2.3.2. Pliki MIDI

Seria wiadomosci MIDI moze zostac zapisana w formie pliku MIDI (nazywa-nego takze SMF - Standard MIDI File). Pliki te uzywaja zwykle rozszerzenia .midbadz (nieco rzadziej) .smf. Z powodu, ze zawarta jest w nich instrukcja generacjidzwieku, a nie dosc dokładny kształt fali dzwiekowej zajmuja one mniej miejscaod standardów zapisu muzyki takich jak, na przykład mp3, czy wave. Minutamuzyki moze zostac zapisana w około 10kB danych (podczas, gdy utwór podobnej

4 http://www.midi.org/

2.4. Java 8

długosci zapisany jako plik mp3 potrafi zajac około 1MB danych) - oczywiscie sa todane przykładowe mogace róznic sie w zaleznosci od ilosci wykorzystanych sciezek,czy stopnia kompresji pliku mp3. Uzywane do testów aplikacji pliki MIDI miaływielkosc pliku mieszczaca sie w zakresie 5-125kB.

Mały rozmiar plików MIDI spowodował, iz były one uzywane jako format zapisumuzyki w czasach, gdy łacza szerokopasmowe nie były jeszcze popularne. PlikiMIDI przezywały swoja druga młodosc na poczatku lat dwutysiecznych, gdy zostaływykorzystane do przechowywania muzyki i dzwieków na telefonach komórkowych.Wykorzystujac wyszukiwarke internetowa mozemy dosc łatwo znalezc wersje popu-larnych utworów muzycznych zapisanych w tym standardzie - własnie pliki MIDIsa wykorzystywane przez przedstawiana aplikacje jako zródło informacji o nutachzagranych przez uzytkownika.

2.4. Java

Wybór srodowiska oraz jezyka wpływa mocno na szybkosc działania aplikacji, jejprzenosnosc oraz mozliwosci rozwoju. Załozyłem, ze program tworzony w ramachtej pracy nie bedzie zbyt wymagajacy dla nowoczesnych komputerów - uznałem, zeodczyt i analiza niewielkich plików MIDI, komunikacja z elektronicznym instrumen-tem klawiszowym oraz generowanie prostego dwuwymiarowego obrazu nie powinnostanowic powaznego wyzwania obliczeniowego. Głównym kryterium wyboru stałasie przenosnosc oraz mozliwosci rozwoju. Nie chciałem byc skazany na koniecznosckompilowania aplikacji pod róznymi systemami operacyjnymi, zdecydowałem sie,wiec na wybór jednego z jezyków kompilowanych do kodu wykonywanego przezmaszyne wirtualna (kodu bajtowego). Zastanawiałem sie nad wyborem pomie-dzy jezykiem C#, a Java SE. Po dokładniejszym zbadaniu obu opcji odkryłem, zedecydujac sie na wybór jezyka programowania Java uzyskam dostep do paczkijavax.sound.midi stanowiacej czesc Java Sound API bardzo dobrze pasujacej domoich wymagan. Zdecydowałem sie na wybór własnie tej opcji, dodatkowa zaletajest ewentualna mozliwosc stworzenia w przyszłosci wersji aplikacji na tablety zsystemem Android (chociaz w czasie, gdy to pisze brak dobrego wsparcia dla MIDIw tym systemie moze stanowic utrudnienie).

2.4.1. Java Sound API

Java Sound API jest niskopoziomowym interfejsem ułatwiajacym kontrolowanieurzadzen dostepnych w systemie odpowiedzialnych za odbieranie i generowaniedzwieku. Pozwala on takze na komunikacje z urzadzeniami korzystajacymi zestandardu MIDI, co jest istotna cecha wykorzystywana przez moja aplikacje. JavaSound API zawiera wsparcie dla dzwieku cyfrowego oraz danych MIDI, jest onozawarte w dwóch paczkach:— javax.sound.sampled - Dostarczajacej interfejsy przydatne przy nagrywaniu,

miksowaniu oraz odtwarzaniu cyfrowego dzwieku— javax.sound.midi - Udostepniajacej interfejsy przydatne przy syntezie MIDI, se-

kwencjonowaniu oraz przekazywaniu wiadomosci oraz zdarzen MIDI

3. Implementacja

3.1. Budowa systemu

3.1.1. Łaczenie sie z urzadzeniem wejsciowym

Połaczenie z urzadzeniem wysyłajacym wiadomosci MIDI (na przykład elektro-nicznym keyboardem) uzyskiwane jest z wykorzystaniem paczki javax.sound.midi.Połaczenie jest nawiazywane automatycznie po uruchomieniu programu, bez inge-rencji uzytkownika.

1 MidiDevice . Info [ ] midiDeviceInfoArray = MidiSystem . getMidiDeviceInfo ( ) ;for ( int i = 0; i < midiDeviceInfoArray . length ; i ++) {

try {MidiDevice device = MidiSystem . getMidiDevice ( midiDeviceInfoArray [ i ] ) ;

5

Transmitter transmitter = device . getTransmitter ( ) ;transmitters .add ( transmitter ) ;transmitter . setReceiver (new MidiInputReceiver ( ) ) ;

10 device . open ( ) ;( . . . )

} catch ( MidiUnavailableException e ) {( . . . )

15 }}

Wydruk 3.1. Łaczenie sie z urzadzeniem wejsciowym

Lista obiektów informacyjnych (MidiDevice.Info) reprezentujacych do-stepne urzadzenia w systemie pobierana jest z uzyciem funkcji MidiSys-tem.getMidiDeviceInfo(). Nastepnie aplikacja próbuje stworzyc Transmitter,poprzez który wiadomosci Midi odbierane z urzadzenia wejsciowego beda przesy-łane dalej, do klasy MidiInputReceiver, która zajmie sie ich dokładniejsza analiza.Wszystkie utworzone połaczenia sa zamykane po zakonczeniu działania programu.

3.1.2. Odbieranie wiadomosci MIDI

Za odbieranie wiadomosci otrzymywanych od urzadzenia wejsciowego MIDI od-powiada klasa dziedziczaca po interfejsie javax.sound.midi.receiver i implementu-jaca z tego powodu metode:

1 void send ( MidiMessage message , long timeStamp )

Poprzez ta funkcje klasa jest w stanie odebrac wiadomosc MIDI (MidiMessagemessage) wraz z czasem jej wysłania (long timeStamp).

3.1. Budowa systemu 10

3.1.3. Klasa MidiMessage

Klasa javax.sound.midi.MidiMessage jest klasa bazowa dla wiadomosci MIDI.Korzystajac z niej mozemy odebrac tresc wiadomosci, jej długosc oraz status wia-domosci okreslany przez bajt informacji. Dziedzicza po niej klasy ShortMessage,SysexMessage, MetaMessage.

3.1.4. Klasa ShortMessage

Klasa javax.sound.midi.ShortMessage reprezentuje wiadomosci MIDI, któremaja najwyzej dwa bajty. Korzystajac z funkcji getCommand() oraz porównujacja z wartosciami odpowiadajacych pól klasy (takich jak, na przykład ShortMes-sage.NOTE_OFF = 0x80) jestesmy w stanie rozpoznac typ odebranej informacji.Uzywajac funkcji getData1() oraz getData2() jestesmy w stanie łatwo pobrac pierw-szy i drugi bajt wiadomosci, natomiast funkcja getChannel() zwróci nam informacjeo kanale, którego informacje dotycza. Ponizej przedstawiam liste przykładowychwiadomosci wraz z opisami:

NOTE ON (0x90)

Wiadomosc informujaca o rozpoczeciu grania nuty. Wraz z nia przesyłanajest informacja o kanale, którego ona dotyczy (0-15), zagranej nucie (0-127) oraz“velocity”, sile uderzenia w klawisz instrumentu (0-127).

NOTE OFF (0x80)

Wiadomosc oznaczajaca zaprzestanie grania nuty. Przesyłana jest informacjao uzytym kanale (0-15), numerze oznaczajacym zagrana nute (0-127) oraz “velo-city” (0-127). Wartosc “velocity” w zaleznosci od rodzaju urzadzenia moze zawszeprzyjmowac stała wartosc (na przykład zero), ale czasem moze tez reprezentowacpredkosc puszczania klawisza instrumentu (moze to pozwolic, na przykład na kon-trole czasu zanikania dzwieku).

POLY PRESSURE (0xA0)

Wiadomosc okreslajaca zmiane siły nacisku na klawisz instrumentu juz po za-graniu samego dzwieku, a przed jego zupełnym puszczeniem, okreslana czasamijako polyphonic aftertouch. Moze byc wykorzystywana na przykład do uzyskaniadodatkowych mozliwosci ekspresji dzwieku takich jak Vibrato (“drzenie” głosnosciinstrumentu). Funkcja ta pojawia sie w bardziej profesjonalnych instrumentachmuzycznych, przez wiele lat jej wersja polifoniczna (wysyłajaca informacje doty-czace kazdego z klawiszy) była trudna do stworzenia z powodu koniecznosci wy-syłania duzych ilosci danych. Wraz z wiadomoscia przesyłana jest informacja natemat uzytego kanału (0-15), zagranej nuty (0-127) oraz siły nacisku na klawiszinstrumentu (0-127).

CHANNEL PRESSURE (0xD0)

Monofoniczna wersja powyzszej wiadomosci (POLY_PRESSURE). Przez produ-centów sprzetu muzycznego nazywana jako monophonic aftertouch badz po prostuaftertouch. W wiadomosci zawarta jest informacja dotyczaca uzytego kanału (0-15),zagranej nuty (0-127) oraz siły nacisku na klawisz instrumentu (0-127). W zalez-nosci od implementacji siła nacisku moze dotyczyc sredniej siły z jaka wcisniete

3.1. Budowa systemu 11

sa klawisze lub przesyłana jest najwieksza wartosc wsród wcisnietych klawiszy in-strumentu.

CONTROL CHANGE (0xB0)

Wiadomosc CONTROL_CHANGE pozwala na zmiane ustawien kanału (takich,jak na przykład głosnosc, czy ustawienia panoramy stereo). Przesyłane sa informa-cje opisujace, którego kanału ta zmiana dotyczy (0-15), identyfikator ustawienia dozmiany (0-119) oraz ustawiana wartosc (0-127). Identyfikatory 120-127 nie mogazostac wykorzystane, gdyz sa zarezerwowane dla Channel Mode Messages (opisanepózniej).

PROGRAM CHANGE (0xC0)

Wiadomosc uzywana do zmiany programu, okreslajacego np. rodzaj emulowa-nego instrumentu. Przesyłana jest informacja o kanale, którego ta zmiana dotyczy(0-15) oraz o numerze programu (0-127). W standardach bedacych rozwinieciemstandardu MIDI mozliwe stało sie wybieranie z wiekszej ilosci programów (na przy-kład w General MIDI Level 2 (GM2) mozliwe jest wybieranie z 16384 róznych progra-mów, dzieki wysłaniu innej wiadomosci przed PROGRAM_CHANGE odpowiadajacejza wybór jednego z 128 banków programów).

PITCH BEND (0xE0)

Wiadomosc pozwalajaca na zmiane wysokosci granych tonów, pozwalajaca na“dostrojenie” instrumentu do własnych oczekiwan. Wraz z nia wysyłana jest infor-macja o kanale MIDI (0-15) oraz 2 bajty informacji, z których 14 znaczacych bitówokresla zmiane tonu. Domyslnym ustawieniem tej wartosci jest wartosc heksadecy-malna 0x2000. Zmiana jest dokonywana w zakresie +/-2 półtonów, a wiec mozemyzmienic wysokosc dzwieku z dokładnoscia do około 4096 “stopni” na jeden półton.Wysokosc pomiedzy dwoma sasiednimi stopniami jest raczej nierozróznialna dlaprzecietnego słuchacza. Czesc syntezatorów wykorzystuje jedynie 7 bitów znacza-cych do okreslania zmiany wysokosci dzwieku, w takim wypadku na jeden półtonprzypadaja zaledwie 32 zmiany wysokosci dzwieku.

3.1.5. Wybrane System Common Messages

TIME CODE QUARTER FRAME (0xF1)

Wiadomosc jest przesyłana podczas aktywnej pracy urzadzenia. Uzywana jestdo synchronizacji czasu poprzez MIDI. 32-bitowy kod zapisujacy aktualny czas(godziny, minuty, sekundy) oraz wysłana ramke (frame) jest dzielony na osiem4-bitowych fragmentów, sa one wysyłane cztery razy w ciagu czasu jednej ramki(a wiec pełna informacja jest wysyłana co dwie ramki). Wraz z kazda wiadomosciaprzesyłany jest 7-bitowa informacja, 3 bity sa uzywane do okreslenia typu infor-macji (numeru fragmentu), pozostałe 4 bity - do okreslenia jej wartosci. Czas jestkodowany podczas tworzenia fragmentu oznaczanego liczba 0.

3.1. Budowa systemu 12

3.1.6. Wybrane System Real-Time Messages (Wiadomosci czasurzeczywistego)

TIMING CLOCK (0xF8)

Wiadomosc wysyłana w celu zsynchronizowania czasu, przesyła informacje ogodzinie, minucie, sekundzie oraz ilosci ramek (frame) na sekunde (24, 25, 25.97badz 30).

ACTIVE SENSING (0xFE)

Wiadomosc przesyłana w celu podtrzymania aktywnego połaczenia. Uzywanietej wiadomosci jest opcjonalne, jednak jesli juz zostanie uzyta oczekiwane jest, zekolejna wiadomosc tego typu zostanie przesłana w ciagu 300ms. Jesli wiadomosctaka sie nie pojawi, odbiorca moze załozyc, ze połaczenie zostało przerwane.

3.1.7. Klasa SysexMessage

Klasa javax.sound.midi.SysexMessage pozwala na odbieranie wiadomosci Sys-tem Exclusive (0xF0) oraz Special System Exclusive (0xF7). Sa to wiadomosci two-rzone przez producentów sprzetu, moga dzieki temu przesyłac informacje dotyczacespecyficznej funkcjonalnosci wbudowanej w urzadzenia. Koniec wiadomosci powi-nien zostac oznaczony za pomoca End Of Exclusive (0xF7).

3.1.8. Klasa MetaMessage

Javax.sound.midi.MetaMessage reprezentuje wiadomosc, która nie ma znacze-nia dla syntezatorów, a moze jednak przechowywac wartosciowe informacje doty-czace, na przykład zawartosci pliku MIDI. Znajdowana ona zwykle jest w plikachMIDI. Rozpoznawana jest na podstawie wartosci pierwszego bajtu równej 0xFF. Ko-lejny bajt opisuje typ wiadomosci, a nastepne oznaczaja długosc wiadomosci orazsame przenoszone przez nia dane. Przykładowe typy meta zdarzen (Meta Event)opisane sa ponizej. W nawiasach podana jest wartosc typu zapisana w formieliczby heksadecymalnej.

SEQUENCE NUMBER

Zdarzenie te definiuje numer wzorca w przypadku pliku MIDI typu 2 badznumer sekwencji, jesli mamy do czynienia z plikiem MIDI typu 0 lub 1. Jest tozdarzenie wystepujace opcjonalnie, jesli go nie ma zakładany jest domyslny sposóbnumerowania sekwencji. Sequence number, jesli jednak juz wystapi, powinienznajdowac sie na samym poczatku sekwencji i miec czas delta równy 0 (sampoczatek odtwarzania).

TEXT EVENT

Zdarzenie uzywane do opisywania pliku MIDI. Czesto jest umieszczany na po-czatku pliku, moze zawierac informacje na temat nazwy sciezki dzwiekowej badzautora; bywa uzywany do wstawienia tekstu utworu muzycznego do pliku MIDI.Typy wiadomosci o wartosciach od 0x02 do 0x0F sa uzywane jako oznaczenia bar-dziej wyspecjalizowanych opisów tekstowych utworu.

3.1. Budowa systemu 13

COPYRIGHT NOTICE

Zawiera informacje na temat praw autorskich utworu (zalecane jest, by za-wierało znak prawa autorskiego “ c©”, rok produkcji oraz dane własciciela praw).Zdarzenie powinno sie pojawic jako jedno z pierwszych w sciezce, z czasem deltarównym 0.

SEQUENCE/TRACK NAME

Definiuje nazwe sciezki/utworu. Zdarzenie to powinno pojawic sie jako jedno zpierwszych w sciezce i miec czas delta równy 0.

INSTRUMENT NAME

Okresla nazwe instrumentu uzywanego w danym fragmencie sciezki. Zdarzeniemoze zostac połaczone z MIDI Channel Prefix, by niesc takze informacje, któregokanału dotyczy.

LYRIC

Pozwala na przekazanie informacji o tekscie utworu. Jesli jako tekst zapisywanesa sylaby, a zdarzenia sa wywoływane w odpowiednim czasie, moze to pozwolic naimplementacje systemu karaoke.

MARKER

Oznacza wazny punkt utworu, na przykład pierwszy wers zwrotki badz poczatekrefrenu.

CUE POINT

Wiadomosc uzywana do synchronizacji z odtwarzaniem wideo badz akcja nascenie teatralnej, czy uruchomieniem efektów swietlnych sceny.

MIDI CHANNEL PREFIX

Uzywane do załaczenia dodatkowej informacji dotyczacej numeru kanału dlameta zdarzen (Meta Events), które takiej opcji domyslnie nie obsługuja. Działaniejest anulowane przez inne zdarzenie MIDI Channel Prefix badz przez dowolne innezdarzenie nie nalezace do grupy Meta Events.

END OF TRACK

Zdarzenie opcjonalne okreslajace koniec sciezki, które moze sie jednak okazacniezbedne, jesli bedziemy chcieli ja zapetlic badz połaczyc z inna sciezka.

SET TEMPO

Zdarzenie te informuje o zmianie tempa, wartosc tempa podawana jest w mi-krosekundach na cwiercnute. Czesto wystepuje ono na samym poczatku sciezki,obok wiadomosci Timing Clock, co pozwala na dokładniejsza synchronizacje. Jeslitempo nie jest ustawione, zakładane jest domyslne równoznaczne z 120bpm (beatsper minute, uderzeniami na minute).

Aby przeliczac tempo MIDI na ilosc uderzen na minute i z powrotem mozemyskorzystac z wzorów:

1 MikrosekundyNaMinute = 60 000 000UderzenNaMinute = MikrosekundyNaMinute / MikrosekundyNaCwiercnute

3.1. Budowa systemu 14

MikrosekundyNaCwiercnute = MikrosekundyNaMinute / UderzenNaMinute

SMPTE OFFSET

Zdarzenie pozwalajace ustawic opóznienie odtwarzania sciezki z uzyciem for-matu SMPTE (opisujacego godzine, minute, sekunde oraz ramke; dodatkowa moz-liwoscia jest ustawienie fragmentu ramki (0-99), którego przesuniecie dotyczy).

TIME SIGNATURE

Zdarzenie te okresla metrum utworu (rysunek 3.20). Zapisywane ono jest zuzyciem 4 liczb. Pierwsze dwie liczby oznaczaja odpowiednio liczbe jednostek me-trycznych (górna cyfra na obrazku) oraz podstawowa jednostke metryczna danegoutworu (dolna cyfra na obrazku). Podstawowa jednostka metryczna jest wyliczanapoprzez potraktowanie drugiej liczby jako ujemnego wykładnika liczby dwa, czylina przykład wartosc 0 odpowiada pełnej nucie, wartosc 1 odpowiada półnucie, awartosc 2 bedzie oznaczała cwiercnute. Trzecia liczba oznacza ilosc MIDI clocks(sygnałów zegara MIDI), które powinny upłynac pomiedzy kolejnymi uderzeniamimetronomu. Czwarta liczba okresla, ile trzydziestodwójek (nut stanowiacych 1/32pełnej nuty) miesci sie w jednej cwiercnucie MIDI (zostało to wprowadzone, gdyzwartosc cwiercnuty MIDI była interpretowana na rózne sposoby, zwykle w tym miej-scu bedzie sie znajdowac liczba 8 (tyle trzydziestodwójek miesci sie w cwiercnucie)).

KEY SIGNATURE

Zdarzenie pozwalajace okreslic tonacje utworu. Zawiera informacje o typie skali(durowa (major) badz molowa (minor)) oraz tonacji (jeden z 12 dzwieków skalichromatycznej).

SEQUENCER SPECIFIC META EVENT

Specyficzne zdarzenie stworzone na potrzeby konkretnego sekwencera sprzeto-wego badz programu. Pierwszy bajt (badz 3 bajty, jesli pierwszy bajt jest równy 0)danych powinien zawierac identyfikator producenta.

3.1.9. Odbieranie wiadomosci o wcisnietych klawiszach

Najwazniejsza informacja dla działania programu odbierana przez klase MidiIn-putReceiver jest ta dotyczaca wciskanych i puszczanych klawiszy na instrumenciemuzycznym (Note On i Note Off). Przekazywana jest ona dalej do innej klasy Pres-sedKeyManager, która zajmuje sie przekazywaniem informacji dalej (miedzy innymido PianoKeyManager, która zajmuje sie przechowywaniem stanu klawiszy instru-mentu muzycznego).

3.1.10. Klasa opisujaca dzwiek

Klasa Note reprezentuje obiekt opisujacy pojedynczy dzwiek, jest wykorzysty-wana wielokrotnie w programie. Zawiera ona dane takie jak wysokosc dzwieku(zapisana jako liczba, zgodna ze standardem MIDI), jej głosnosc/siłe uderzenia wklawisz instrumentu (“velocity”) czy kanał midi którego dotyczy. Udostepnia takzewiele funkcji uzywanych w innych czesciach aplikacji takich jak:

3.1. Budowa systemu 15

3.1.11. Wysyłanie wiadomosci MIDI

Aby wciskane przez uzytkownika klawisze były słyszalne oraz by aplikacja mogłaodtwarzac wczytywane pliki MIDI konieczne było stworzenie klasy odpowiedzialnejza generowanie dzwieku.

Klasa MidiPlayer korzysta z javax.sound.midi.MidiSystem. Z jego uzyciem starasie znalezc dostepne w systemie syntezatory oraz nawiazac połaczenie z jednym znich.

MidiPlayer udostepnia reszcie programu uzyteczne funkcje:

1 public void playNote ( Note note ) {ShortMessage message = new ShortMessage ( ) ;try {

message . setMessage ( ShortMessage .NOTE\_ON, channelNumber ,5 note . getValue ( ) , note . getVelocity ( ) ) ;

selectedDevice . getReceiver ( ) . send (message , 0 ) ;

} catch ( InvalidMidiDataException e ) {Log . getLogger ( ) . warning (

10 " Inval id Midi Data Exception . Unable to play midi note . " ) ;} catch ( MidiUnavailableException e ) {

Log . getLogger ( ) . warning (" Midi Unavailable Exception . Unable to play midi note . " ) ;

15 }

}

Wydruk 3.2. Funkcja odtwarzajaca dzwiek

Funkcja wysyła wiadomosc do syntezatora, zlecajaca zagranie dzwieku, któregocechy zdefiniowane sa w zmiennej (Note) note.

1 public void sendChannelMessage ( ChannelMessage message ) {try {

selectedDevice . getReceiver ( ) . send (message . getMessage ( ) , 0 ) ;} catch ( MidiUnavailableException e ) {

5 Log . getLogger ( ). warning ( "Unable to send midi channel message . " ) ;

}}

Wydruk 3.3. Funkcja wysyłajaca wiadomosc do syntezatora

Powyzsza funkcja odpowiada za wysłanie dowolnej wiadomosci do syntezatora,pozwalajac na uzyskanie takich efektów jak zmiana przypisanych dzwieków doróznych kanałów.

3.1.12. Wczytywanie plików MIDI

Za otwieranie plików midi odpowiada klasa MidiFileOpener. Korzysta ona zfunkcji MidiSystem.getSequence(InputStream), dzieki której jest w stanie odczytaczdarzenia wystepujace w pliku MIDI i przekierowac je do innej czesci programuzajmujacej sie ich analiza.

Zadaniem tym zajmuje sie klasa MidiFileReceiver, implementujaca interfejs Re-ceiver (javax.sound.midi.Receiver). Odczytuje ona zdarzenia midi z pliku .midi i w

3.1. Budowa systemu 16

zaleznosci od typu odebranych danych przekazuje informacje w inne czesci pro-gramu. Najczesciej wystepujace i najbardziej istotne dla działania programu sawiadomosci zagrania dzwieku oraz przerwania grania dzwieku, które przekazujainformacje jakie dzwieki powinny zostac zagrane i kiedy.

3.1.13. Sprawdzanie poprawnosci gry

Podczas odtwarzania utworu w trybie manualnym (w którym uzytkownik musizagrac przedstawione na ekranie dzwieki) przesuwajace sie nuty zatrzymuja sie woczekiwaniu na wcisniecie odpowiednich klawiszy. Na obrazkach 3.1, 3.2 widocznyjest utwór przedstawiony na dwóch róznych widokach, w stanie oczekiwania nareakcje uzytkownika.

Za sprawdzanie czy wcisniete zostały odpowiednie klawisze odpowiada klasaNotesComparator. Dzieli ona wszystkie klawisze wystepujace na klawiaturze natrzy kategorie:— MUST_BE_PLAYED (musi zostac zagrany)— MAY_BE_PLAYED (moze zostac zagrany)— MUST_NOT_BE_PLAYED (nie moze zostac zagrany)

Dzwieki, których poczatek brzmienia zaczyna sie w danym momencie muszazostac zagrane. Nuty, które juz sa grane, ale jeszcze sie nie zakonczyły (wartosc“siły uderzenia” velocity jest wieksza od zera) moga, ale nie musza zostac zagrane.Wszystkie pozostałe nuty nie moga byc wcisniete. Gdy te warunki zostana speł-nione, utwór odtwarzany jest dalej. Warunki te nie wymuszaja idealnego czasupuszczenia klawisza, który juz gramy (uznałem, ze idealna synchronizacja czasupuszczenia klawisza nie jest az tak bardzo istotna, a zwiekszała bardzo poziomtrudnosci gry). Dodatkowym ułatwieniem jest pewna niedokładnosc czasu wcisnie-cia klawisza na jaka pozwala aplikacja, akceptuje ona wcisniecie go odrobine wcze-sniej niz jest to wymagane (pozwala to na unikniecie niepotrzebnych pauz podczasgry).

W tym fragmencie aplikacji wykorzystałem HashMultiMap dostarczana przezbiblioteke guava1.

1 http://code.google.com/p/guava-libraries/

3.1. Budowa systemu 17

Rysunek 3.1. Odtwarzanie utworu jest zatrzymane, oczekiwanie na zagranie odpo-wiednich dzwieków przez uzytkownika (widok główny).

Rysunek 3.2. Odtwarzanie utworu jest zatrzymane, oczekiwanie na zagranie odpo-wiednich dzwieków przez uzytkownika (widok przypominajacy notacje muzyczna).

3.2. Czesc wizualna 18

3.2. Czesc wizualna

3.2.1. System współrzednych uzywanych w programie

Rysunek 3.3. Układ współrzednych uzywany w programie

Za cel postawiłem sobie stworzenie programu o mozliwie duzej przenosnoscipomiedzy róznorodnymi systemami. Z powodu wykorzystywania własnorecznie ry-sowanych ekranów, spadła na mnie odpowiedzialnosc za konfiguracje ich zacho-wania w róznorodnych warunkach. Chciałem uniknac tworzenia aplikacji, która zpowodu uzywania stałych wymiarów ekranu działałaby poprawnie jedynie na jed-nym ustawieniu rozdzielczosci monitora, a na innych okienko programu byłobyzbyt małe badz za duze. Postanowiłem uzywac w aplikacji do okreslania połozeniaobiektów liczb zmiennoprzecinkowych. Lewy górny róg ekranu badz panelu jestoznaczany współrzedna ( 0.0 , 0.0 ), wartosci współrzednych rosna az do prawegodolnego rogu ekranu, gdzie przyjmuja maksymalna wielkosc ( 1.0, 1.0 ). Sposóbzapisu moze zostac dokładniej wyjasniony za pomoca rysunku 3.3.

Współrzedne ekranu przed uzyciem ich do okreslenia lokalizacji na ekranie sakonwertowane na odpowiadajace im wartosci w pikselach. Uzywana do tego jestprosta funkcja:

1 long doubleCoordinateToPixelCoordinate ( double coordinate , int maxPixels ) {return Math. round ( coordinate ∗ maxPixels ) ;

}

Wydruk 3.4. Funkcja konwertujaca

Do funkcji przekazywane sa dwa argumenty, pierwszy typu double reprezentu-jacy współrzedna typu zmiennoprzecinkowego, drugi okresla ilosc pikseli w danym

3.2. Czesc wizualna 19

wymiarze (szerokosci badz wysokosci). Zwracana jest wartosc okreslajaca współ-rzedna w pikselach.

Aby uniknac niepotrzebnych obliczen czesc wartosci dotyczacych połozenia sta-łych fragmentów ekranu jest zapisywana, jako juz obliczone koordynaty w formieliczb całkowitych. Sa one ponownie przeliczane dopiero w przypadku zmiany wiel-kosci okna aplikacji.

3.2.2. Zmiana wielkosci grafik

W aplikacji uzywane jest kilkanascie róznych obrazków, zapisanych głównie wformacie .png. Chciałem zagwarantowac wysoka jakosc wygladu aplikacji, dlategouzyte przeze mnie grafiki sa bardzo dobrej jakosci, wyeksportowane z programówgraficznych uzywanych do edycji grafiki wektorowej. Ich wielkosc jest wystarcza-jaca do wyswietlenia obrazu na ekranach o rozdzielcznosci Full HD (1920x1080).By móc zapewnic wysoka wydajnosc aplikacji oraz dobry wyglad na mniejszychekranach musiałem zadbac o zmiane wielkosci obrazków, tak by dostosowywałysie do innych wymiarów okna.

Gdy zajmowałem sie problemem zmiany wielkosci obrazków próbowałem sko-rzystac z przeznaczonych do tego funkcji Java, jednak efekt koncowy był nie-zadowalajacy (nawet, gdy stosowałem ustawienia RenderingHint, nastawione nauzyskanie jak najlepszej jakosci obrazu). Trafiłem na artykuł opisujacy iteracyjnysposób zmiany wielkosci obrazów2, który pozwalał na uzyskanie wysokiej jakoscigrafik. By nie ódkrywac ponownie koła"i pracowac nad problemami, które zostałyjuz rozwiazane zdecydowałem sie na wybór biblioteki imgscalr3 dostepnej na licen-cji Apache 2 jako narzedzia do zmiany wielkosci obrazów.

Ostatnim nierozwiazanym problemem pozostał czas, jaki jest potrzebny dozmiany wielkosci grafiki. Rozwiazałem ten problem tworzac klase przechowujacaw pamieci kopie obrazka, juz po dokonaniu zmiany jego wielkosci, dzieki czemuzmiana wielkosci dokonywana jest jedynie po uruchomieniu programu i po zmianiewielkosci okna. Wykorzystywanie grafik o zmniejszonej wielkosci, dostosowanej dorysowania na ekranie pozwoliło takze na przyspieszenie działania aplikacji - opera-cje dokonywane sa na obiektach zajmujacych mniej pamieci oraz nie jest koniecznazmiana ich wielkosci.

2 http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html3 http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library/

3.2. Czesc wizualna 20

3.2.3. Rysowanie schematu fortepianu na ekranie

Rysunek 3.4. Wyglad rysowanej klawiatury przed dodaniem ozdobników.

Za rysowanie klawiatury fortepianu odpowiada klasa PianoPainter. Klasa tazawiera w sobie zmienne pozwalajace na swobodne konfigurowanie wygladu kla-wiatury takie jak:— ilosc klawiszy (domyslnie - 88)— klawisz startowy, od którego zaczynamy tworzenie klawiatury (domyslnie kla-

wisz reprezentujacy dzwiek ’A’)— rozkład czarnych klawiszy na klawiaturze— proporcje klawiszy

Proporcje klawiszy zostały zebrane z keyboardu, którego uzywałem jako głów-nego urzadzenia podczas pracy nad aplikacja.

Proporcja szerokosci wszystkich białych klawiszy do ich wysokosci to około 6,80,wysokosci czarnego klawisza do jego szerokosci to zaokraglajac 7,90, a szerokosciczarnego klawisza do szerokosci białego klawisza to w przyblizeniu 0,545. Jeslizałozymy, ze czarne klawisze sa równo wysrodkowane pomiedzy sasiadujacymi bia-łymi klawiszami, powyzsze dane powinny nam wystarczyc do odtworzenia klawia-tury na ekranie komputera.

Rysowanie keyboardu odbywa sie przy uzyciu podstawowych funkcji Java Gra-phics2D. Białe klawisze sa białymi (wypełnionymi) prostokatami, czarne klawiszesa czarnymi (wypełnionymi) prostokatami, krawedzie białych klawiszy sa czarnymprostokatem (bez wypełnienia, rysowane sa same krawedzie), a wcisniete klawiszesa kolorowane na szaro. Efekt widoczny jest na obrazku 3.4.

Niestety tak narysowana klawiatura jest graficznie dosc mało atrakcyjna. Po-stanowiłem poprawic jej wyglad, ciagle korzystajac z tych samych podstawowychfunkcji rysujacych Java, pozwalajacych na tworzenie róznokolorowych prostoka-tów. Dolna czesc białego klawisza ( 1/14 ) została pokolorowana na szaro. Wpodobny sposób pokolorowałem dolna czesc czarnego klawisza ( 1/9 ) uzywajac

3.2. Czesc wizualna 21

nieco ciemniejszego odcienia szarego koloru. Ustawienia dobrałem eksperymen-talnie, starajac sie uzyskac efekt najbardziej zadowalajacy artystycznie. Z prawejstrony czarnych klawiszy dodałem niewielki, szary prostokat (o szerokosci równej1/5 szerokosci czarnego klawisza) symulujacy cien rzucany przez klawisz. Dziekitym usprawnieniom klawiatura instrumentu wydaje sie byc wypukła, w przeci-wienstwie do płaskiej klawiatury widocznej wczesniej. Rezultat widoczny jest naobrazku 3.5.

Rysunek 3.5. Koncowy wyglad rysowanej klawiatury.

3.2. Czesc wizualna 22

3.2.4. Dwa rodzaje widoków udostepniane przez program

Tworzona przeze mnie aplikacja udostepnia dwa główne rodzaje widoków, wy-swietlajace nuty, które powinien zagrac uzytkownik w odmienny sposób.

3.2.5. Główny sposób wyswietlania nut

Rysunek 3.6. Główny widok aplikacji.

Na obrazku 3.6 widoczny jest główny sposób wyswietlania nut przez moja apli-kacje. Nuty (bede uzywac tej nazwy odwołujac sie do graficznej reprezentacji przed-stawianej w programie) wyswietlane sa w formie zaokraglonych prostokatów róznejwielkosci. Pojawiaja sie one nad odpowiadajacymi klawiszami narysowanej w dol-nej czesci ekranu klawiaturze przypominajacej standardowy 88-klawiszowy forte-pian. Nuty pojawiajace sie nad czarnymi klawiszami klawiatury sa wezsze (sa tejsamej szerokosci co czarny klawisz), co pozwala na ich łatwe odróznienie.

Nuty poruszaja sie w kierunku dolnej czesci ekranu. Gdy docieraja do liniiwyznaczanej przez górna krawedz klawiatury zatrzymuja sie (w manualnym trybiegry) badz wydawany jest odpowiedni dzwiek (w automatycznym trybie odtwarzaniautworu).

Zaokraglone prostokaty sa róznokolorowe, w zaleznosci od numeru sciezki wutworze, który reprezentuja. Ich wysokosc jest zalezna od róznicy czasu, pomiedzyzdarzeniami Note On (wydania dzwieku) oraz Note Off (zaprzestania wydawaniadzwieku), które zostały odczytane z pliku MIDI. Im róznica jest wieksza, tym wiek-sza jest wysokosc prostokata. Wysokosc stanowi sugestie, co do czasu wciskaniaklawisza instrumentu podłaczonego do komputera - niskim prostokatom powinnyodpowiadac krótkie i szybkie wcisniecia klawiszy, a wysokim prostokatom dłuzsze.

3.2. Czesc wizualna 23

Wyswietlanie nut na pieciolinii

Rysunek 3.7. Alternatywny tryb wyswietlania aplikacji przypominajacy notacjemuzyczna.

Alternatywnym trybem wyswietlania w programie, jest widok przypominajacynotacje muzyczna. Przedstawiony jest na obrazku 3.7. Nalezy jednak zwrócicuwage, ze nie jest to poprawny zapis nutowy, raczej jego uproszczenie. Pliki MIDInie zawieraja wszystkich potrzebnych informacji do wygenerowania notacji muzycz-nej. W dodatku uznałem, ze niektóre czesci zapisu, sprawdzajace sie na papierzemoga nie byc tak czytelne w wersji animowanej na monitorze komputerowym.

Wyswietlanie wciskanych klawiszy

W trybie wyswietlania przypominajacym notacje muzyczna uzytkownikowi jestduzo trudniej zorientowac sie, którym klawiszom odpowiadaja jakie nuty na piecio-linii. Z tego powodu dodałem fragment na pieciolinii, mieszczacy sie pomiedzykluczem wiolinowym i basowym, a pionowa linia, przypominajaca nieco kresketaktowa. Nuty wyswietlane w tym fragmencie nie stanowia fragmentu utworu,reprezentuja natomiast aktualnie wcisniete klawisze na klawiaturze instrumentu(obrazki 3.8, 3.9, 3.10). Do wyswietlania uzywane sa całe nuty, jednak ich war-tosc rytmiczna nie ma w tym przypadku znaczenia, zostały przeze mnie wybrane zpowodu ich czytelnosci oraz braku pałeczki nutowej.

Na obrazkach ponizej widoczne sa wcisniete klawisze na klawiaturze instru-mentu oraz ich reprezentacja na pieciolinii.

Rodzaje wyswietlanych nut

W widoku przypominajacym notacje muzyczna wyswietlane jest kilka rodzajównut - całe nuty (rys. 3.11), półnuty (rys. 3.12, 3.13), cwiercnuty (rys. 3.14,3.15) iósemki (rys. 3.16,3.17).

Typ nuty w muzyce reprezentuje długosc jej trwania. Cała nuta trwa dwarazy dłuzej niz półnuta, półnuta trwa dwa razy dłuzej niz cwiercnuta, natomiastcwiercnuta - dwa razy dłuzej niz ósemka. Istnieja takze nuty, takie jak szesnastka,

3.2. Czesc wizualna 24

Rysunek 3.8. Lista aktualnie wcisnietych klawiszy wyswietlana obok kluczy.

trzydziestodwójka, szescdziesiecioczwórka, a nawet stodwudziestoósemka (jednaksa one nieco rzadziej spotykane).

Niestety pliki MIDI zwykle nie przechowuja informacji zwiazanych z metrumutworu, a fragmenty utworu nie sa dzielone na takty. Z tego powodu stworzyłemwłasny system podziału dzwieków pochodzacych z pliku MIDI na odpowiednie nuty.Na poczatku analizowana jest zawartosc całego pliku i znajdowana jest długoscnajdłuzszego dzwieku. Nastepnie nuty sa dopasowywane na podstawie kodu:

1

i f ( czasTrwaniaNajdluzszejNuty / 2 < czasTrwaniaAnalizowanejNuty ) {//Cala nuta

}5 else i f ( czasTrwaniaNajdluzszejNuty / 4 < czasTrwaniaAnalizowanejNuty )

{//Polnuta

}

10 else i f ( czasTrwaniaNajdluzszejNuty / 8 < czasTrwaniaAnalizowanejNuty ){

//Cwiercnuta}else

15 {//Osemka

}

Wydruk 3.5. Funkcja dobierajaca nuty.

Oczywiscie dopasowanie te jest pewnym rodzajem funkcji heurystycznej i mozenie zawsze sie sprawdzac, jednak pozwala na wygenerowanie dosc dobrze wyglada-jacego rezultatu. Problemy moga sie pojawiac z utworami zawierajacymi dzwieki otej samej długosci (wszystkie zostana potraktowane jako cała nuta) badz z utwo-rami w których pojawia sie kilka bardzo długich dzwieków (w takim wypadku całareszta nut zostanie rozpoznana jako ósemki). System ten mozna jednak poprawic- mozliwe, ze dobre efekty dałaby próba podziału wszystkich długosci dzwieków

3.2. Czesc wizualna 25

Rysunek 3.9. Wcisniete białe klawisze klawiatury oraz ich reprezentacja na piecio-linii.

na kilka dosc równych grup, a nie wyznaczania granic w zaleznosci od wartoscinajdłuzszej, jak jest to teraz robione.

W zaleznosci od połozenia nuty na pieciolinii rysowana jest jej wersja z pałeczkanutowa skierowana na dół badz do góry. Widoczne jest to na obrazku 3.18, naktórym przedstawione sa dwa rózne sposoby rysowania półnuty.

Róznice pomiedzy widokiem a zapisem nutowym

Pomiedzy stworzona przeze mnie notacja, a współczesnym zapisem nutowymistnieje wiele róznic. Wymienie najbardziej istotne:— Nie wystepuje podział na takty. W pliku MIDI zwykle nie jest zapisana wystar-

czajaca ilosc informacji do stworzenia taktów.— Działanie znaków chromatycznych przygodnych (na przykład krzyzyka, umiesz-

czanego przed nuta) dotyczy jedynie kolejnej nuty (a powinien dotyczyc wszyst-kich nut tej samej wysokosci, az do konca taktu). Rozwazałem zastosowaniekasownika (widocznego na obrazku 3.19 znaku anulujacego działanie innychznaków chromatycznych) po kazdej nucie, jednak uznałem, ze zmniejszyłoby tozbyt mocno czytelnosc zapisu.

— Przestrzen obok klucza jest przeznaczona do wyswietlania nut reprezentujacychaktualnie wcisniete klawisze na klawiaturze. Nie jest w tym miejscu wyswie-tlane metrum (rysunek 3.20), ani znaki chromatyczne przykluczowe okreslajacetonacje utworu.

— W zapisie nie sa uzywane pauzy.— Nie wystepuja oznaczenia tempa, dynamiki, artykulacji. Nie uzywam frazowania

oraz znaków powtórzenia.Jak widac róznice sa dosc istotne, sposób wyswietlania mozna jednak rozwijac dalejw celu coraz wiekszego upodobnienia go do nowoczesnego zapisu nutowego.

3.2. Czesc wizualna 26

Rysunek 3.10. Wcisniete czarne klawisze, przy wyswietlanych nutach widoczne saznaki chromatyczne (krzyzyki).

Rysunek 3.11. Cała nuta.

Rysunek 3.12. Półnuta.

Rysunek 3.13. Półnuta (pałeczka nutowa skierowana w dół).

Rysunek 3.14. Cwiercnuta.

Rysunek 3.15. Cwiercnuta (pałeczka nutowa skierowana w dół).

3.2. Czesc wizualna 27

Rysunek 3.16. Ósemka.

Rysunek 3.17. Ósemka (pałeczka nutowa skierowana w dół).

Rysunek 3.18. Rózne sposoby rysowania tych samych nut.

Rysunek 3.19. Kasownik zapisany przed nuta.

3.2. Czesc wizualna 28

Rysunek 3.20. Zapis metrum.

3.3. Inne opcje 29

3.3. Inne opcje

3.3.1. Wybór trybu gry

Program pozwala na automatyczne odtwarzanie utworu (bez oczekiwania nawciskanie odpowiednich klawiszy przez uzytkownika) badz na tryb manualny (wktórym zatrzymywanie zatrzymuje sie do czasu, az osoba korzystajaca z programuzagra odpowiednie dzwieki). Wybór trybu gry jest dostepny w głównym menuaplikacji. Tryb automatyczny moze okazac sie przydatny, jesli uzytkownik chceusłyszec, jak brzmi poprawna, idealnie wykonana wersja utworu.

3.3.2. Wybór sciezek MIDI do grania

Jesli w pliku MIDI zapisane nuty sa podzielone na sciezki (tracks), aplikacjapozwala na wybranie jednej badz kilku z nich jako wyswietlanych. Efekt działa-nia tej funkcji jest widoczny na obrazkach 3.21, 3.22. W przypadku uzywaniamanualnego trybu gry, uzytkownik musi zagrac jedynie czesc nut. Pozwala to naopanowanie gry na przykład najpierw lewa reka, potem prawa reka, a dopiero nakoniec wycwiczenia współpracy obu rak. Pozostałe ukryte sciezki sa odtwarzanerównolegle do tych granych przez uzytkownika, tworzac podkład muzyczny do jegogry. W plikach midi czesc zapisanych instrumentów moze nie nadawac sie do gra-nia z uzyciem instrumentu klawiszowego (na przykład jesli zapisane dzwieki majasymulowac na przykład perkusje). W takim wypadku warto wyłaczyc taka sciezkepodczas cwiczenia gry.

Rysunek 3.21. Odtwarzanie dwóch sciezek (tracks).

3.3. Inne opcje 30

Rysunek 3.22. Wyglad aplikacji po wyłaczeniu jednej z sciezek.

3.3. Inne opcje 31

3.3.3. Zmiana szybkosci odtwarzania utworu

Rysunek 3.23. Menu zmiany szybkosci odtwarzania utworu.

Aplikacja pozwala na zmiane predkosci odtwarzania utworu (rysunek 3.23).Moze to sie przydac na przykład do przecwiczenia trudniejszego do zagrania frag-mentu utworu - zaczynajac od wolnego tempa mozemy je progresywnie zwiekszac,az uda nam sie opanowac gre z pełna szybkoscia.

3.3.4. Zmiana wielkosci pola wyswietlajacego nuty

Aplikacja posiada opcje zmiany “pola widzenia”, okreslajacego zageszczenie nutna ekranie. W zaleznosci od preferencji uzytkownika na ekranie moze byc widocznekilka duzych szybko poruszajacych sie nut, badz wiele mniejszych i poruszajacychsie wolniej. Rezultat róznych ustawien jest widoczny na rysunkach 3.24, 3.25,3.26, 3.27.

3.3. Inne opcje 32

Rysunek 3.24. Widok domyslny, standardowa wielkosc pola widzenia.

Rysunek 3.25. Widok domyslny, powiekszone pole widzenia.

3.3. Inne opcje 33

Rysunek 3.26. Widok przypominajacy zapis nutowy, standardowe pole widzenia.

Rysunek 3.27. Widok przypominajacy zapis nutowy, powiekszone pole widzenia.

3.3. Inne opcje 34

3.3.5. Wybór syntezatora, cechy syntezatorów

Rysunek 3.28. Przykładowy zestaw wykrytych syntezatorów w systemie Windows7 z podłaczonym keyboardem.

Program pozwala na wybór syntezatora uzywanego do generowania dzwieków.Syntezatory moga sie róznic miedzy soba brzmieniem badz obsługiwanymi wiado-mosciami MIDI, jednak według mnie bardzo istotna cecha, jest czas pomiedzy prze-słaniem wiadomosci, a czasem wygenerowania dzwieku (latency). Domyslny syn-tezator Java - Gervill - posiada maksymalny czas opóznienia okreslany na 120ms.Jest to wartosc łatwo zauwazalna, mogaca byc dosc denerwujaca dla osoby graja-cej. Jesli w systemie zostanie wykryty syntezator Microsoft GS Wavetable Synthustawiany jest on jako preferowalny (przed Gervill), z powodu praktycznego niz-szego czasu opóznienia. Lista przykładowych syntezatorów widoczna jest na ry-sunku 3.28.

Jesli jakosc dzwieku wydawanego przez aplikacje ciagle stanowi problem, wyj-sciem moze byc uzycie syntezatora wbudowanego w keyboard, jesli jest on udo-stepniany przez urzadzenie. Czesto syntezatory stanowiace czesc instrumentówmuzycznych moga generowac lepszej jakosci dzwiek z mniejszym opóznieniem, nizte emulowane przez system. Przykładowo syntezator dostepny w keyboardzie jestwidoczny na obrazku pod nazwa “DigitalKBD”.

3.3.6. Zmiana wysokosci dzwieków w utworze

Nie wszystkie instrumenty klawiszowe maja ilosc klawiszy identyczna z ta uzytaw moim programie (wzorujacym sie na układzie 88-klawiszowego fortepianu). Jed-nym z urzadzen, na których testowałem działanie aplikacji był keyboard YamahaPSR-E333, posiadajacy klawiature składajaca sie z 61 klawiszy. Moze to stanowicproblem i uniemozliwiac zagranie czesci utworów. Udało mi sie czesciowo zaradzicna ten problem dodajac do programu mozliwosc przesuwania wszystkich dzwiekówutworu, tak by mogły sie zmiescic w zakresie urzadzenia którego uzywamy. Dowyboru sa opcje przesuniecia dzwieków o półton, badz o oktawe (dwanascie półto-nów). Zmiana wysokosci dzwieków mozliwa jest w obie strony, a operacje mozemywielokrotnie powtarzac. Jesli przesuniemy dzwieki utworów o ilosc półtonów niebedacych wielokrotnoscia dwunastu, zmieni sie takze tonacja utworu. Przykładzmiany wysokosci dzwieków utworu przedstawiony jest na rysunkach 3.29 oraz3.30.

3.3. Inne opcje 35

Rysunek 3.29. Czesc dzwieków jest niemozliwa do zagrania. Zakres dostepnychklawiszy 61-klawiszowego instrumentu został zaznaczony prostokatem.

Rysunek 3.30. Po przesunieciu dzwieków utworu o dwie oktawy staje on sie moz-liwy do zagrania na danym instrumencie muzycznym.

3.3. Inne opcje 36

3.3.7. Przewijanie utworu

Rysunek 3.31. Pasek przewijania umieszczony pod wizerunkiem klawiatury.

Aplikacja posiada pasek przewijania (widoczny na rysunku 3.31), pozwalajacyna łatwe trafienie do fragmentu utworu, który nas interesuje. Dzwiek wydawanyprzez syntezator zalezy nie tylko od nut (wiadomosci Note On, Note Off) ale takze odjego aktualnego stanu (czyli od ustawien, jakie zostały przekazane we wczesniejszejczesci utworu). Z tego powodu po przesuniecie wskaznika odtwarzania utworu wy-maga kilku dodatkowych czynnosci: zresetowania stanu klawiatury, zatrzymaniawszystkich aktualnie wydawanych dzwieków, zmiane tempa odtwarzania utworuna te jakie jest w nowym punkcie oraz przesłania wszystkich istotnych wiadomosciMIDI, które miały miejsce przed tym punktem.

3.3.8. Wygładzanie krawedzi (antyaliasing)

Aplikacja zawiera opcje, pozwalajaca na wybór sposobu rysowania nut z badzbez wygładzania krawedzi. Właczona opcja moze spowodowac zwiekszenie zuzyciaprocesora, poprawiajac jednak jakosc rysowanej grafiki. Róznice przedstawionesa na rysunkach 3.32 i 3.33. Ustawienie te jest zapisywane i wybrana przezuzytkownika wartosc jest przechowywana pomiedzy kolejnymi uruchomieniamiaplikacji. Własciwosc ustawiana jest poprzez:

1 setRenderingHint ( RenderingHints .KEY_ANTIALIASING,RenderingHints .VALUE_ANTIALIAS_ON ) ;

3.3. Inne opcje 37

Rysunek 3.32. Wyglad nut z właczonym wygładzaniem krawedzi.

Rysunek 3.33. Wyglad nut z wyłaczonym wygładzaniem krawedzi. Widoczny efektschodkowania obrazu.

3.3. Inne opcje 38

3.3.9. Pliki konfiguracyjne

Stworzona przeze mnie aplikacja korzysta z plików konfiguracyjnych. Pozwalajaone miedzy innymi na edytowanie bardziej zaawansowanych ustawien programu,których zmiana nie jest mozliwa poprzez menu aplikacji. Podczas pracy z plikamikonfiguracyjnymi uzywana jest klasa java.util.Properties. Pozwala ona na łatwewczytywanie i zapisywanie ustawien z plików. Pary klucz-wartosc przechowywanesa potem w Hashtable, co pozwala na wzglednie szybki dostep do danych. Kluczoraz wartosc sa zmiennymi typu String.

Klasa java.util.Properties pozwala na wczytywanie i zapisywanie danych w for-mie pliku XML. Przykładowy zapis tego typu jest widoczny ponizej:

1 <?xml version=" 1.0 " encoding="UTF−8"?>< !DOCTYPE properties SYSTEM " http://java .sun.com/dtd/properties . dtd "><properties><comment>Komentarz</comment>

5 <entry key="Klucz1 ">Wartosc1</entry><entry key="Klucz2 ">Wartosc2</entry></properties>

Wydruk 3.6. Przykładowy zapis ustawien w formacie XML

W swoim programie zdecydowałem sie jednak na zapisywanie konfiguracji zuzyciem prostego zapisu “Klucz=Wartosc”, gdyz uznałem go za łatwiejszy do zro-zumienia dla przecietnego uzytkownika. W pliku /config/config.txt umieszczonesa bardziej zaawansowane ustawienia programu. Ponizej przedstawiam fragmentzawartosci tego pliku.

1 #How big should view be (how dense the notes w i l l be ) in s ta f f view#Wielkosc pola widzenia w trybie wyswietlania nut przypominajacym notacje muzycznaSTAFF_VIEW_SIZE_SMALL = 0.00001STAFF_VIEW_SIZE_MEDIUM = 0.00002

5 STAFF_VIEW_SIZE_LARGE = 0.00004STAFF_VIEW_SIZE_HUGE = 0.00008

#How big should view be (how dense the notes w i l l be ) in rectangle view#Wielkosc pola widzenia w glownym trybie wyswietlania nut

10 RECTANGLE_VIEW_SIZE_SMALL = 0.02RECTANGLE_VIEW_SIZE_MEDIUM = 0.05RECTANGLE_VIEW_SIZE_LARGE = 0.08RECTANGLE_VIEW_SIZE_HUGE = 0.1

15 #Minimum Window size#Minimalna wielkosc okna apl ikac j iMINIMUM_WINDOW_WIDTH = 640MINIMUM_WINDOW_HEIGHT = 480

Wydruk 3.7. Fragment zawartosci pliku /config/config.txt

Widoczne tutaj sa przykładowo ustawienia wielkosci “pola widzenia” w obu spo-sobach wyswietlania nut mozliwych w programie oraz minimalny rozmiar oknaaplikacji. Udostepnienie edycji takich wartosci uzytkownikom moze pozwolic nakorzystanie z programu w sposób, jakiego nie dałem rady przewidziec podczas jegoprojektowania.

Innym rodzajem pliku konfiguracyjnego jest ten zapisywany pod sciezka /confi-g/user.properties. W przeciwienstwie do poprzedniego przykładu, rozszerzenie tego

3.3. Inne opcje 39

pliku rózni sie od “txt”. Jest to spowodowane tym, ze nie chce zachecac uzytkowni-ków aplikacji do edytowania go. Jego rola jest przechowywanie ustawien pomiedzykolejnymi uruchomieniami programu. Fragment zawartosci widoczny jest ponizej.

1 #Mon Jul 30 15:08:53 CEST 2012RECTANGLE_VIEW_ANTYALIASING_MODE=TRUESELECTED_LANGUAGE=en

Wydruk 3.8. Fragment zawartosci pliku /config/user.properties

Przykładowe przedstawione linie odpowiadaja kolejno za ustawienie wygładzaniaobrazu (antyaliasingu; jest właczony) oraz za aktualnie wybrany przez uzytkownikajezyk (angielski).

3.3.10. Pliki jezykowe

Zastosowanie klasy java.util.Properties pozwoliło na przetłumaczenie aplikacjina inne jezyki. Pliki jezykowe przechowywane sa w folderze /config/lang/. Wzaleznosci od ustawienia “SELECTED_LANGUAGE” przedstawionego wyzej (3.3.9)wczytywany jest odpowiedni plik. Domyslnie wraz z programem dostepne sa dwiewersje jezykowe - angielska oraz polska. Przetrzymywane sa one w plikach /con-fig/lang/en.txt oraz /config/lang/pl.txt. Zawieraja one identyczne nazwy kluczy,jednak wartosci sa frazami przetłumaczonymi na odpowiedni jezyk. Przykładowofragment pliku en.txt wyglada tak:

1 . . .SYNTHESIZER = SynthesizerPLAYING_SPEED = Playing speedPLAY_MODE = Play mode

5 . . .

Wydruk 3.9. Fragment zawartosci pliku /config/lang/en.txt

Natomiast te same klucze w pliku pl.txt maja odmienne wartosci:

1 . . .SYNTHESIZER = SyntezatorPLAYING_SPEED = Predkosc odtwarzaniaPLAY_MODE = Tryb gry

5 . . .

Wydruk 3.10. Fragment zawartosci pliku /config/lang/pl.txt

3.3.11. Raportowanie błedów

Program, aby ułatwic wykrywanie i rozwiazywanie problemów, posiada modułodpowiadajacy za logowanie informacji i błedów zwiazanych z działaniem aplikacji.Do jego stworzenia wykorzystana została klasa java.util.logging.Logger. Udostepniaona kilka poziomów istotnosci zapisywanych informacji:— SEVERE (najwazniejsze błedy i wiadomosci)— WARNING— INFO— CONFIG— FINE

3.3. Inne opcje 40

— FINER— FINEST (mało istotne informacje)W pliku /config/logger.properties mozliwe jest ustawienie poziomu dokładnoscilogowanych informacji. Domyslnie, zapisywane sa informacje od poziomu “INFO”,wzwyz. W razie potrzeby, gdyby istniała potrzeba zbadania przyczyny problemu zdziałaniem aplikacji na komputerze uzytkownika, mozemy poprosic go o ustawienieniskiego progu logowanych danych i dzieki temu dowiedziec sie wiecej o działaniuprogramu, co moze pomóc w rozwiazaniu problemu.

Rejestr zdarzen działania aplikacji zapisywany jest w folderze /logs/. Plikizapisywane sa w formacie HTML, aby ułatwic analize plików najwazniejsze błedyi informacje zapisywane sa duza czcionka w czerwonym kolorze, a inne waznewiadomosci sa pogrubione. Mozliwe jest to dzieki wykorzystaniu klasy formatujacejktóra stworzyłem, dziedziczacej po java.util.logging.Formatter.

4. Podsumowanie

4.1. Mozliwosci rozwoju aplikacji

Program w aktualnej wersji jest w stanie byc uzytecznym dla osób uczacych siegry na elektronicznych instrumentach klawiszowych. Mozliwe jednak jest dodanienowych funkcji badz usprawnienie aktualnie istniejacych. Czesc pomysłów narozwój aplikacji wypisania jest ponizej:

— Na swiecie jest wiele rodzajów elektronicznych urzadzen klawiszowych, srodo-wisk na których uruchomiona moze zostac aplikacja oraz plików MIDI (mniejlub bardziej zgodnych ze standardami). Po opublikowaniu aplikacji w interneciemozliwe stało by sie otrzymywanie informacji o problemach, jakie uzytkownicynapotkali podczas pracy z programem. Rozpoznawanie problemów moze ułatwicklasa zapisujaca rejestr zdarzen.

— Czesc instrumentów klawiszowych posiada opcje podswietlanej klawiatury.Przykładowo - keyboardy firmy Casio z serii LK 1. Mozliwe jest wykorzystanie tejfunkcji z poziomu programu, tak by na klawiaturze podswietlały sie klawisze,które powinien wcisnac uzytkownik.

— Dla osoby uczacej sie gry na instrumencie klawiszowym znaczenie moze miecnie tylko kolejnosc wciskanych klawiszy, ale i odpowiednie ustawienie reki.Do programu mozna dodac opcje informujaca, którym palcem powinien zostacwcisniety dany klawisz.

— Do aplikacji mozna dodac jakis rodzaj punktów, który pozwalałby oceniac po-prawnosc zagrania utworu oraz porównywał ja z wynikami innych graczy.

— Program mógłby zostac przystosowany do działania, jako czesc strony interne-towej. Moze do niego zostac dodana opcja gry wieloosobowej. Aplikacja mogłabyzostac rozbudowana do poziomu narzedzia ułatwiajacego kolaboracyjne tworze-nie muzyki. W takim wypadku przydatne mogłyby okazac sie funkcje takie jakczat (wysyłanie wiadomosci pomiedzy uzytkownikami), czy nagrywanie granychdzwieków.

— Szkielet stworzonej aplikacji moze zostac wykorzystany w bardziej eksperymen-talnych projektach, takich jak na przykład automatyczne generowanie muzykina podstawie biblioteki plików MIDI z wykorzystaniem łancuchów Markowa2.

1 http://www.casio.com/products/Digital_Pianos_%26_Keyboards/Lighted_Keys/2 http://en.wikipedia.org/wiki/Markov_chain#Music

4.2. Zakonczenie 42

4.2. Zakonczenie

Wszystkie zadania ujete w zakresie pracy zostały zrealizowane. Działajacy pro-gram wraz z podłaczonym keyboardem został przedstawiony na rysunkach 4.1,4.2. Z pewnoscia tworzenie pracy dyplomowej wpłyneło na rozwiniecie mojej wiedzyzwiazanej z muzyka, MIDI oraz tworzeniem aplikacji w jezyku Java SE. Praca sta-nowiła ciekawe wyzwanie intelektualne. Mam nadzieje, ze stworzony przeze mnieprogram ułatwi komus nauke gry utworu na instrumencie klawiszowym.

Rysunek 4.1. Zdjecie działajacego programu.

4.2. Zakonczenie 43

Rysunek 4.2. Zdjecie działajacego programu.

Bibliografia

[1] MIDI Manufacturers Association English-language MIDI specifications.http://www.midi.org

[2] The International MIDI Association Standard MIDI-File Format Specification 1.1.[3] Oracle Java SE Technical Documentation. http://docs.oracle.com/javase/[4] Bruce Eckel Thinking in Java. Helion, edycja polska, wydanie IV, Warszawa 2006[5] Yamaha PSR-E333 YPT-330 MIDI Data Format.[6] Yamaha PSR-E333 YPT-330 Owner’s Manual.