[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info (at) builder.cz   Inzerce: reklama (at) grafika.cz
Diskuzní fóra
.Net (68468)
ASP (1591)
ActiveX (168)
Allegro (136)
Assembler (3926)
C++ Builder (23160)
C/C++ (44499)
Databáze (30680)
Delphi (78806)
DelphiX (1655)
DirectX (1464)
Java (39508)
JavaScript (12598)
Matematické programy (2178)
OOP a UML (732)
OpenGL (6920)
Php (65224)
PowerBuilder (464)
Problémy a algoritmy (10473)
Programování v Linuxu (2000)
Právo a programování (3384)
Python (1353)
Ruby (136)
Visual Basic (12078)
Visual C++ (12956)
Wap (56)
Web (10895)
Web servery (5549)
Win32 (13553)
Windows CE (865)
XML/XSL (1860)
Textová inzerce
Služby Builder.cz
  • Bazar - koupím(0)
  • Bazar - prodám(0)
  • Hledám práci(0)
  • Nabízíme práci(0)
  • Projekty(0)
  • Allegro - Midi a zvukové proudy (9. díl)
    Dnešní díl nás seznamí s přehrávání MIDI souborů a tzv. zvukových proudů.
    Allegro - Knihovna pro programování her
    Předchozí díl: Allegro - Hudba a zvuky (8. díl)

    Následující díl: Allegro - Časovač (10. díl)
    Autor: Matoušek Pavel
    Rubrika: C/C++
    Publikováno: 08.03. 2002
     Tisk článku
    Poslat odkaz emailem
     

    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.

    #define MIDI_TRACKS 32        /* able to handle this many */
    typedef struct MIDI           /* a midi file */
    {
       int divisions;             /* number of ticks per quarter note */
       struct {
          unsigned char *data;    /* MIDI message stream */
          int len;                /* length of the track data */
       } track[MIDI_TRACKS];
    } 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

    #include "allegro.h"
    
    int main(int argc, char *argv[])
    
       MIDI *the_music;
    
       allegro_init();
    
       if (argc != 2) {
          allegro_message("Pouziti: 'allegro8_2 jmeno_souboru.mid'\n");
          return 1;
       }
    
       install_keyboard();
    
       if(install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,argv[0])!= 0){
          allegro_message("Chyba pri inicializaci hudby\n%s\n",
                          allegro_error);
          return 1;
       }
    
       the_music = load_midi(argv[1]);
       if (!the_music) {
          allegro_message("Chyba pri nacitani '%s'\n", argv[1]);
          return 1;
       }
    
       play_midi(the_music, TRUE);
    
       readkey();
    
       destroy_midi(the_music);
    
       return 0;
    }
    END_OF_MAIN();
    

    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ě:

    struct SAMPLE;
    
    typedef struct AUDIOSTREAM
    {
       int voice;                /* the voice we are playing on */
       struct SAMPLE *samp;      /* the sample we are using */
       int len;                  /* buffer length */
       int bufcount;             /* number of buffers per sample half */
       int bufnum;               /* current refill buffer */
       int active;               /* which half is currently playing */
       void *locked;             /* the locked buffer */
    } AUDIOSTREAM;
    

    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.


    Zpět na začátek stránky

    Pavel Matoušek
    Osobní stránky autora naleznete na www.pmatousek.com

    Hodnocení článku
    1 | 2 | 3 | 4 | 5
    Aktuální známka: 2.53
    (Počet známek: 3206)

    Komentáře k článku
    -- Žádné příspěvky --
    Přidat příspěvek




    info@builder.cz
    Vydává Grafika Publishing, s.r.o.
    Copyright (c) 1997-2002 Všechna práva vyhrazena