Odtwarzanie dźwięków w C++ więc fostatni = w12*fpierwszy stąd
Transkrypt
Odtwarzanie dźwięków w C++ więc fostatni = w12*fpierwszy stąd
Odtwarzanie dźwięków w C++ Uzależnione jest od systemu operacyjnego. W Windows trzeba dołaczyć plik nagłówkowy <windows.h> Pojedynczy dźwięk można odtworzyć funkcją Beep(częstotliwość, czas w milisekundach) Przykład: Beep( 400,500) – dźwięk o częstotliwości 400 Hz trwający pół sekundy, czyli 500 ms Gama chromatyczna składa się z 13 dźwięków, z których ostatni dźwięk ma częstotliwość 2-krotnie większą od pierwszego, a stosunek częstotliwości każdego następnego dźwięku do poprzedniego jest taki sam. fnastepny = w*fbieżący więc fostatni = w12*fpierwszy stąd = √2 = 1.0594630… double f = 400; double w = pow(2,1.0/12); int n = 13; for (int i=0; i<n; i++) { Beep(f,500); f = f*w; } // częstotliwość pierwszego dzwięku // liczba dźwieków gamy Czytanie danych z pliku tekstowego • potrzebne jest #include <fstream> • Trzeba zadeklarować strumień do przesyłania danych z pliku do pamięci i związać go z konkretnym plikiem na dysku: ifstream strumien(”plik.txt”); • czytanie danej ze strumienia wygląda tak samo jak czytanie danej z konsoli (cin też jest strumieniem!) strumien >> dana; Cały program uruchomiony na lekcji #include <iostream> #include <windows.h> #include <fstream> #include <cmath> using namespace std; int main() { int f = 400; Beep(400,1000); // potrzebne do odtwarzania dzwieku: Beep() // potrzebne do czytania danych z pliku tekstowego // potrzebne do funkcji pow() - potegowanie // odtworzy dzwiek o czestotliwości 400 Hz // trwajacy przez 1000 milisekund = 1 sekunda double w = pow(2,1/12.0); // oblicza pierwiastek 12 stopnia z 2 // jedna oktawa gamy chromatycznej for (int i=0; i<=12; i++) { Beep(f,500); // odegraj dzwiek o czestotliwosci f i czasie trwania pol sekundy f = f*w; // oblicz czestotliwosc nastepnego dzwieku } // jedna oktawa gamy majorowej (tylko biale klawisze na klawiaturze) // do gory for (int i=0; i<=12; i++) { if (i!=1 && i!=3 && i!=6 && i!=8 && i!=10) Beep(f,500); f = w*f; } // na dol - to pomysl Paszteta for (int i=12; i>=0; i--) { f = f/w; if (i!=1 && i!=3 && i!=6 && i!=8 && i!=10) Beep(f,500); } // odtworzenie melodyjki, ktorej czestotliwosci i czasy dzwiekow // sa zapisane w pliku tekstowym muza.txt // plik muza.txt trzeba umiescic w biezacym katalogu programu ifstream wejscie("muza.txt"); int t; // to bedzie czas trwania dzwieku while (wejscie>>f) { wejscie >> t; Beep(f,100*t); } system(”pause”); return 0; // dopóki z wejscia da sie przeczytac czestotliwosc dzwieku // to przeczytaj jeszcze czas trwania tego dzwieku // odtworz dzwiek z czasem 100 razy wiekszym niz podano w pliku } Zawartość pliku muza.txt 440 523 440 587 440 392 440 659 440 698 659 523 440 659 880 440 392 392 391 391 330 523 440 4 4 2 2 2 2 4 4 2 2 2 2 2 2 2 2 1 1 1 1 2 2 8 Odtwarzanie pliku dźwiękowego w formacie .wav PlaySound(”nazwapliku.wav”, NULL, flagi) Przykład PlaySound("horse.wav", NULL, SND_ASYNC | SND_LOOP ); pierwszy parametr – to najczęściej nazwa pliku do odtwarzania jeśli pierwszy parametr jest NULL, to zatrzymuje odtwarzanie bieżacego pliku .wav drugi parametr jest uchwytem do ewentualnego pliku wykonywalnego zawierającego zasoby (jeśli pierwszy parametr zawiera nazwę pliku, to drugo ma być NULL) flagi: SND_LOOP odtwarza w pętli SND_ASYNC – nie czeka na zakończenie dźwięku tylko wykonuje następne instrukcje gdy dzwięk gra W kodzie programu potrzebne jest: #include <windows.h> W opcjach projektu, na karcie opcji linkera trzeba dodać ścieżkę do pliku libwinmm.a można go znaleźć w podkatalogu lib kompilatora lub w internecie (pobrać i umieścić w bieżącym katalogu projektu)