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 - Midi a zvukové proudy (9. díl)
8. března 2002, 00.00 | Dnešní díl nás seznamí s přehrávání MIDI souborů a tzv. zvukových proudů.
V minulém díle jsme se seznámili s přehrávání zvukových souborů typu WAV nebo VOC. Dnešní díl nám poví o tom zbytku. Což jsou zvukové proudy a především MIDI soubory.
Jako minule tak i dnes se lehce seznámíme se strukturou typu MIDI.
|
která je 1) mnohem jednodušší než SAMPLE u WAVů a 2) má v sobě ještě jednu vnořenou strukturu nebo spíše pole struktur o 32 prvcích, které nám udávájí, že MIDI může mít max. 32 instrumentů. (tedy soudím čistě z toho co znám o MIDI, takže tuto informaci o instrumentech neberte úplně vážně)
Příklad na MIDI
|
Jako první si opět vytvoříme zvuk. proměnnou, ale tentokrát typu pointer na strukturu MIDI a pojmenujeme se ji tak jako je tomu v ukázkovém souboru exmidi neboli the_music.
Při instalaci je potřeba jako druhý parametr dát MIDI_AUTODETECT, aby byla zajištěna instalace MIDI hudby.
Pro načtení ze souboru a naplnění struktury slouží podobná funkce jako v minulém článku a to
MIDI *load_midi(const char *filename);
která jako parametr bere jméno souboru. V našem případě tedy parametr spustitelného souboru, kterým by měl být zvuk. soubor typu MIDI. Při chybě vrací NULL a pokud je vše v pořádku naplní strukturu MIDI ke které je tato funkce přiřazena. Opět se vyplatí raději provést kontrolu, ať už je málo paměti (i když to už se dnes nestává tak často) nebo pokud soubor je jiného formátu než má být.
Nyní už můžeme přehrávat soubor pomocí funkce
int play_midi(MIDI *midi, int loop);
první parametr je pointer na strukturu MIDI a druhý je příznakový parametr, který má význam jako loop u funkce play_sample v minulém díle.
Pokud je tedy vlajka (příznakový parametr) nastaven na TRUE a my chceme hudbu zastavit můžeme použít funkci
void stop_midi();
která nám veškerou hudbu zastaví.
A nakonec následuje uvolnění paměti pomocí funkce
void destroy_midi(MIDI *midi);
Jako parametr si samozřejmě vyžádá již několikrát zmiňovanou strukturu MIDI nebo lépe pointer na strukturu.
AUDIO STREAM neboli zvukové proudy (prosím nemlaťte mě za ten překlad!)
Zde nedávám na ukázku přímo příklad, protože se domnívám, že tyto proudy nejsou už tolik používané a obohatit Vaši hru můžete pomocí MIDI nebo Wav souborů dostatečně. Přesto, ale něco málo ke čtyřem funkcím, které umožňují nějakým způsobem manipulovat s těmito soubory.
Popis se bude spíše podobat překladu manuálu plus něco navíc.
Struktura AUDIOSTREAM vypadá následovně:
|
a má v sobě vnořenou strukturu SAMPLE. Tedy je zapotřebí opět si vytvořit proměnnou typu pointer na strukturu AUDIOSTREAM.
První funkce, kterou Vám nyní představím je:
AUDIOSTREAM *play_audio_stream(int len, bits, stereo, freq, vol, pan);
která vrací pointer na tuto strukturu. První parametr je velikost bufferu v paměti. Je to vlastně délka nebo doba hrajícího zvuku. Buffer je potřeba aktualizovat a dodávat mu další data, aby měl co hrát. Velikost se při programování pohybuje okolo 1k , což doporučují autoři Allegra. bits může nabývat hodnoty 8 nebo 16 a znamená to kolika bitový bude zvuk. stereo je vlajka, která nám signalizuje zda se má vytvořit buffer stereo či mono. S posledními parametry jsme se už setkali u funkce play_sample, která je asi nejpoužívanější (teda, alespoň u mě).
void stop_audio_stream(AUDIOSTREAM *stream);
Tato funkce uvolní paměť a zastaví "přehrávání" hudby.
void *get_audio_stream_buffer(AUDIOSTREAM *stream);
Pomocí této funkce aktualizujete data v bufferu, aby mohla hudba hrát dále. Čím menší je len u funkce play_audio_stream tím častěji musíte volat tuto funkci. Vrací NULL pokud jsou v paměti ještě neodehraná data. Pokud odehrání dat v bufferu, které můžete naplnit jakýmkoliv způsobem, ale nejlepší je asi použít funkci fread, je potřeba buffer uvolnit pro další data pomocí funkce free_autio_stream.
void free_audio_stream_buffer(AUDIOSTREAM *stream);
Uvolní již zmiňovaná data. Volá se po funkci get_audio_stream když vrátí nenulovou adresu na data a indikuje, že je nově alokovaný blok dat připraven k přehrávání.
Pro úplné pochopení zvukových proudů doporučuji si prostudovat příklad v Allegru, který vystupuje pod jménem exstream a k MIDI exmidi v podadresáři examples v Allegru.
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)
-
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