Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Allegro - Hudba a zvuky (8. díl)
4. března 2002, 00.00 | První seznámeni s hudbou v Allegru, které nás zavede do přehrávání WAV souborů.
Dodatek
Na upozornění jednoho čtenáře bych s dovolením využil z Allegra o možnost více a to o funkci
void allegro_message(char *msg, ...);
která má formátování jako funkce printf. Je nutné ji použít pouze v textovém módu, kde má standardní výstup. Používá se s externí proměnou extern char allegro_error[ALLEGRO_ERROR_SIZE]; která v sobě nese informace o tom, ke které chybě došlo.
Malý příkládek
|
To by mělo stačit k allegro_message, abyste nebyli překvapeni jakou funkci to používám.
Hudba je důležitá...
Ano je to tak. Dneska už snad nevyjde na světě hra, která by byla bez hudby a zvuků. A proto po částečném vysvětlení grafiky, která ještě nekončí je čas se taky seznámit s hudbou a zvukem.
V Allegru je to podobné...
V knihovně Allegro, když chcete téměř cokoliv použít musíte to nejdřív nainstalovat. To většinou v Allegru znamená inicializaci proměnných a několik málo nastavení. Slouží k tomu funkce, která se skládá ze dvou názvů oddělných znakem "_". První název je install a druhý může být například keyboard, mouse atd. A u zvuku je to slovo sound. To znamená, že jako první než začneme pracovat s Allegrem je potřeba zavolat funkci
int install_sound(int digi, int midi, const char *cfg_path);
a ta se nám postará o již zmiňovanou inicializaci. Některé instalační funkce mají parametry a některé ne. To není žádná vada. My se k jednotlivým parametrům hned dostaneme.
Jaké formáty Allegro umí?
Tak jako první bych zmínil soubor typu wav nebo voc. Dále umí Allegro přehrávat i midi soubory nebo tzv. "audio stream" (přeložil bych to jako zvukové proudy, ale nejsem si jist). Také pro Allegro není problém nahrávat zvuk z mikrofonu. Dnešní díl nám řekne o formátech wav nebo voc, protože se k tomu používají stejné funkce..
Formát WAV a VOC
Jako tomu bylo u obrázků kde nám sloužila pro načtení struktura
BITMAP má Allegro pro tento druh zvuk. souboru typ SAMPLE.
Definovám v hlav. souboru je takto:
|
Do vlastní struktury zasahovat přímo nebudeme, protože k tomu máme již funkce, ale je dobré vědět jak taková struktura SAMPLE vypadá. I když jsem ponechal anglické komentáře, myslím si, že není potřeba jednotlivé položky nějak představovat.
Nejlepší bude si vše vysvětlit na zdrojovém příkladě:
|
Přejdu rovnou k věci. Jako první po spuštění programu si inicializujeme proměnnou the_sample, která je pointer na strukturu SAMPLE a do té později nahrajeme zvuk, se kterým můžeme manipulovat pomocí funkcí.
Funkce
int install_sound(int digi, int midi, const char *cfg_path);
o které jsem se zmínil již na začátku článku má parametry. Nyní
si povíme co jednotlivé parametry znamenají.
Parametr digi, ovládá tzv. digitální formát zvuku a midi ovládá midi
soubory. Poslední parametr je zde pro kompatibilitu Allegra se staršími
verzemi a můžeme ho tudíž dát NULL nebo např.: jméno našeho spustitelného
souboru pomocí parametru argv[0]. První větu, která vyjadřuje použití
proměnných jsem neřekl naprosto srozumitelně a je to taky z toho důvodu, že
jsem se s tím nikdy neobtěžoval a moc dokumentace k tomu nenašel. A proto nám
v našem případě bude stačit, když první parametr dáme DIGI_AUTODETECT a druhý buď
MIDI_NONE pokud nebudeme používat midi soubory a nebo
podobně MIDI_AUTODETECT pokud budeme chtít přehrávat midi soubory. Tyto dva
parametry AUTODETECT nám zajistí, že Allegro si přečte nastavení hardwaru
z konfiguračního souboru. Věřím, že tato informace Vám pro psaní programů
v Allegru stačí neboť stačila i mne.
K návratovým hodnotám: Pokud vrací funkce 0 je vše v pořádku a -1 při chybě. Příčinu chyby najdete v proměnné allegro_error popsané opět na začátku článku.
Další důležitá funkce je funkce:
SAMPLE *load_sample(const char *filename);
Jako parametr bere jméno zvuk. souboru Wav nebo Voc a vrací pointer na SAMPLE nebo při chybě NULL. Je dobrým zvykem tedy otestovat nahraní zda proběhlo v pořádku či nikoliv. Umí nahrát zvuk Wav v 8 nebo 16 bitů a to bude stereo nebo mono a voc buď 8 nebo taky 16 bitů, ale pouze mono. Tedy takto je to napsáno v manuálu k Allegru a je možné, že to může být i docela jinak. Nejlepší je vše vyzkoušet a taky se rozhodnout co vlastně očekáváte od Vaší hry ;-).
A nyní přichází čas si hudbu nebo zvuk přehrát. A k tomu slouží funkce:
int play_sample(const SAMPLE *spl, int vol, int pan, int freq, int loop);
První parametr netřeba představovat. Jedná se o naší naplněnou
strukturu nějakým zvukem.vol je hlasitost přehrávání souboru, která může
být v rozmezí 0-255. pan je něco jako balanc u rádia. Opět nabývá
hodnot 0-255, přičemž 128 je rovnoměrně vyvážené a tedy stereo. Předposlední
parametr freq, znamená tzv. frekvenci poslechu. Při hodnotě 1000 hraje zvuk
tak jak je nahrán. Když dáme 500 máme 2x pomalejší poslech a
2000 je
naopak 2x rychlejší poslech apod. Poslední parametr je tzv. příznakový - Může
nabývat hodnot TRUE nebo FALSE. FALSE znamená, že se zvuk přehraje
"pouze" 1x. TRUE znamená, že se zvuk bude přehrávat
pořád dokola. Tedy od toho název proměnné loop.
A v této souvislosti se ještě seznámíme s funkcí
void stop_sample(const SAMPLE *spl);
která nám pomůže ten nekonečný cyklus, bez ukončení programu, zastavit. A šoupneme ji naši strukturu SAMPLE! Musíme tedy stejnou, aby nezastavila jiný zvuk než chceme my!
Pokud chcete měnit při nekonečném přehrávání zvuku balanc, hlasitost, frekvenci apod. A nechcete zvuk zastavit a pouštět ho znovu od začátku poslouží Vám dobře funkce:
void adjust_sample(const SAMPLE *spl, int vol, int pan, int freq, int loop);
kterou zavoláte s novými parametry tedy např.: třeba s menší hlasitostí a balancem pouze na levý reproduktor.
Jako poslední bych představil
void destroy_sample(SAMPLE *spl);
ale na druhou stranu ani nemusím představovat, protože každý čtenář jistě ví o co jde...
Dneska už bych ale raději doporučil použít formát MP3 vzhledem k velikosti a jeho kompresi. A i když to Allegro standardně neumí tak se pokusím Vás někdy příště seznámit s knihovnou AllegrMP3.
Doporučuji si prostudovat příklad exsample v podadresáři examples.
Obsah seriálu (více o seriálu):
- Allegro - Knihovna pro programování her I.
- Allegro - Knihovna pro programování her II.
- Allegro - Knihovna pro programování her III.
- Allegro - Knihovna pro programování her IV.
- Allegro - Myš a klávesnice (5. díl)
- Allegro - Jednoduchá hra Střelba (6. díl)
- Allegro - Instalace a konfigurace (7. díl)
- Allegro - Hudba a zvuky (8. díl)
- Allegro - Midi a zvukové proudy (9. díl)
- Allegro - Časovač (10. díl)
- Allegro - Vektory a synchronizace scény (11. díl)
- Allegro - Datové soubory a práce s nimi (12. díl)
- Allegro - Datové soubory a práce s nimi podruhé (13. díl)
- Allegro - Tetris, nic těžkého (14. díl)
- Allegro - Animace (15. díl)
- Allegro - Bitmapy do hloubky a page flipping(16. díl)
- Allegro - MP3 (17. díl)
- Allegro - MP3 podruhé (18. díl)
- Allegro - MP3 potřetí (19. díl)
Diskuse k článku
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007