Nasz program może wykonywać obliczenia przez dłuższy czas. Użytkownik znudzony długością trwania obliczeń może przejść do innej aplikacji. Komputery osobiste nie mają wibracji jak dzisiejsze urządzenia mobilne, więc warto rozważyć odtworzenie dźwięku. W systemie Windows możemy odtworzyć domyślny dźwięk powiadomienia wypisując na konsole znak specjalny \a.
Jest to znak ASCII numer 7, więc możemy też wypisać w drugi sposób:
Tylko tyle wystarczy, aby zwrócić uwagę użytkownika.
Przypuśćmy jednak, że chcemy być bardziej oryginalni. API Windows'a pozwala nam na odegranie dźwięku dowolnej częstotliwości i dowolnej długości. Posłuży nam do tego funkcja Beep(), którą będziemy mogli użyć po dołączeniu biblioteki windows.h. Innymi słowy w nagłówku projektu dodajemy:
Teraz możemy skorzystać z funkcji Beep(), która przyjmuje dwa argumenty będące liczbami całkowitymi: częstotliwość dźwięku oraz długość dźwięku. Częstotliwość dźwięku podajemy w Hz, a długość dźwięku w milisekundach. Przykładowo możemy wywołać:
Dzięki tej prostej funkcji możemy odegrać bardziej skomplikowane utwory.
W celu wydobycia innych dźwięków z komputera warto skorzystać z poniższej tabelki:
|
|
|
|
|
|
|
Napisz aplikację, która wczyta n linijek tekstu. Na wejściu będzie podana najpierw liczba całkowita n, a potem n linijek, które będą składały się z opisu nuty, spacji oraz liczby całkowitej która będzie oznaczać długość trwania nuty w milisekundach. Program ma za zadanie odegrać wczytane nuty. Przykładowo
W celu ułatwienia wybierania częstotliwości danej nuty zadeklarujemy globalną listę częstotliwości - ze względu na długość zamieszczam tylko fragment, całość dostępna jest do skopiowania w kodzie źródłowym:
Nuty oktawy zaczynają się od C kończą na B, więc warto dopisać funkcję note_value(), która powie na podstawie zapisu litery i ewentualnie # jaki indeks ma nuta w oktawie:
Jako argument przyjmujemy dwa argumenty. Literę nuty oraz czy jest modyfikowana przez #.
(2.) Deklarujemy zmienną n, która określi ile nut zagramy. (3.) Wczytujemy ile nut mamy zagrać. (4. - 5.) Czyścimy strumień, aby mieć pewność, że będziemy wczytywać linijka po linijce to co chcemy.
(6.) Deklarujemy zmienną line, która będzie naszym buforem przechowującym wczytane dane. (7.) Rozpoczynamy pętle dla każdej linijki danych. (9.) Wywołujemy note_value(), aby uzyskać indeks noty w oktawie. (10.) Następnie ustalamy indeks nuty na naszej liście - przesuwamy o 12 * cyfra po nucie miejsc w górę. Uwaga, musimy pamiętać, że mamy nuty z # i bez, więc cyfra określająca oktawę może być na 1 lub drugiej pozycji.
(11.) Deklarujemy zmienną duration do której wczytam ile ma trwać nuta. (12. - 15.) Dopóki nie skończy nam się napis wczytujemy liczbę. (16.) Gramy nutę.
(18.) Czekamy na interakcję użytkownika i (19.) zamykamy program.
Teraz można odegrać muzyczkę uruchamiając aplikację i wpisując:
Zmodyfikuj aplikację, aby wczytywała na końcu każdej linijki dodatkowy argument, który określa ile razy nuta ma być zagrana. Uwaga: argument ten nie musi być podany - program powinien to wykryć.
Dzięki tej zmianie wciąż ta sama muzyczka powinna być odegrana zgodnie z tymi danymi wejściowymi: