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)

Podobne dokumenty