Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!
   

Ostatnia aktualizacja
Wczoraj
o godz. 23:58:04
Statystyki serwisu
Gości on-line:
» 1
Zarejestrowanych użytkowników:
» 1224
Odwiedzin w ciągu 24h:
» 493
Wszystkich odwiedzin:
» 3343
Ostatnio aktywni
dzisiaj: 1h » 13 min temu
dzisiaj: 2h » 36 min temu
dzisiaj: 2h » 56 min temu
wczoraj o 23:27:38
» RiVi
wczoraj o 23:15:25
» ison
wczoraj o 23:08:00
wczoraj o 22:19:54
wczoraj o 22:09:05
wczoraj o 21:56:18
wczoraj o 21:51:08
wczoraj o 21:46:40
wczoraj o 21:44:23
wczoraj o 21:31:49
wczoraj o 21:31:48
wczoraj o 21:26:11
wczoraj o 21:10:56

[Allegro, C++] Więcej o wykorzystaniu dźwięków w naszych programach

AutorWiadomość
[Allegro, C++] Więcej o wykorzystaniu dźwięków w naszych programach
» Napisano 2010-07-10 20:59:34
VOICE ROUTINES - czyli rozwiniecie SAMPLE ROUTINES

Do podstawowych funkcji/metod pozwalajacych nam na uzywanie dzwiekow w aplikacjach napisanych w bibliotece allegro naleza te operujace na strukturach SAMPLE. Jesli juz je poznales, a oczekujesz nieco wiekszej kontroli nad dzwiekiem, polecam zapoznanie sie z VOICE ROUTINES, czyli funkcje kontroli dzwieku nizszego poziomu - czyt. o wiekszych mozliwosciach ingerencji :)

a wiec do dziela.

Skupie sie tutaj jedynie na samych funkcjach, w razie potrzeby na pewno wiesz, jak uruchomic allegro i odpowiednio wkomponowac te funkcje do swojego kodu:)

po pierwsze, po staremu, czyli:
C/C++
SAMPLE * muzyczka = load_sample( "dzwiek.wav" );
if( !muzyczka )
{
    set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
    allegro_message( "nie mogę załadować dzwieku muzyczka!" );
    allegro_exit();
    return 0;
}

czyli ladujemy do SAMPLE jakis dzwiek z dysku, sprawdzamy czy zaladowany.

drugim krokiem jest:
C/C++
allocate_voice( muzyczka );

tutaj przypisujemy do voice nasz dzwiek. warto wiedziec, ze kazdy zaladowany dzwiek jest numerowany, ten pierwszy ma nr 0, chcac sie do niego odwolac w kolejnych funkcjach, bedziemy to robili podajac wlasnie ta cyfre (kolejny mialby 1). po drugie warto wiedziec, ze allegro zapewnia nam obsluge max 255 takich voice'ów, przy czy nie gwarantuje, ze ta liczba jest optymalna - to zalezy od sprzetu, wiec raczej nie nalezy przesadzac :)

a wiec mamy przypisany dzwiek do voice nr 0.
mozemy go teraz zaczac odtwarzac, ewentualnie najpierw ustalic pewne parametry.

C/C++
voice_start( 0 );
spowoduje odtwarzanie dzwieku z domyslnymi parametrami(ustawione na poczatku przez allocate_voice, a wiec max glosnosc, moc rozlozona L50%/P50%, bez zmiany tempa odtwarzania, bez petli odtwarzania-czyli jednorazowe)

jesli chcielibysmy jednak cos zmienic, skorzystamy z funkcji:
C/C++
void voice_set_volume( int voice, int volume ); //voice to nasz nr dzwieku, volume to glosnosc 0-255, damy np://
voice_set_volume( 0, 100 );

zmiana balansu/rozlozenia mocy na glosniki:

C/C++
void voice_set_pan( int voice, int pan ); // voice - nr, pan - 0 max lewy, 255 max prawy, 127 - po srodku//

void voice_sweep_pan( int voice, int time, int endpan ); // time - czas operacji, endpan - zadany balans, czyli uzywajac tej funkcji program zmieni nam balans w ciagu zadanego czasu//

void voice_stop_pan_sweep( int voice ); //przerywa operacje powyzej//


poza tym ustalamy sobie, czy dzwiek bedzie odtworzony jednokrotnie, czy tez w petli, mozemy tez ustalic, czy bedzie odtworzony od przodu do tylu, czy tez w rewersie

C/C++
void voice_set_playmode( int voice, int playmode );

za playmode wybieramy:
   PLAYMODE_PLAY
     domyslny tryb, gra jednorazowo od poczatku do konca
    * PLAYMODE_LOOP
      granie z powtarzaniem, czyli w petli
    * PLAYMODE_FORWARD
      granie od poczatku do konca, przeciwienstwo nastepnej mozliwosci:
    * PLAYMODE_BACKWARD
      rewers, czyli odwrocenie kierunku odtwarzania
    * PLAYMODE_BIDIR
      kombinacja dwoch powyzszych, czyli gra od poczatku do konca, po czym zmienia kierunek odtwarzania na od konca do poczatku


C/C++
voice_stop( 0 );

zatrzymujemy odtwarzanie dzwieku, ale trzeba pamietac, ze ta funkcja zapamietuje pozycje, w jakiej dzwiek jest zatrzymany, wiec ponowne uruchomienie go nastapi od miejsca, w ktorym go zatrzymalismy - mozna samemu ustalic pozycje odtwarzania, ale to pozniej


inna przydatna funkcja moze byc:

C/C++
int voice_get_position( int voice );
//przyklad wykorzystania//
if( voice_get_position( 0 ) < 0 )
{
    voice_start( 0 );
}
funkcja zwraca pozycje w odtwarzanym utworze, jesli odtwarzanie zakonczone, zwraca -1, dzieki temu mozemy np zablokowac zalaczanie sie tego samego utworu, dopoki jest odtwarzany.
mozemy tez ustalic pozycje odtwarzania w dzwieku, np dlatego, ze po jego zatrzymaniu, ustawic odtwarzanie od poczatku(przypominam, ze voice_stop zapamietuje pozycje odtwarzania i jej nie zmienia)

C/C++
void voice_set_position( int voice, int position ); //podajac za position -1(*lub chyba 0-trzeba sprawdzic) ustawimy pozycje na poczatek utworu//

teraz kolejna ciekawa funkcja:
C/C++
void voice_ramp_volume( int voice, int time, int endvol );
voice - nr dzwieku, time - czas w milisekundach, endvol - zadana glosnosc.
funkcja ta sluzy do zmiany glosnosci w ciagu zadanego czasu, czyli:
C/C++
voice_ramp_volume( 0, 1000, 255 )

spowoduje zglosnienie sie naszego dzwieku (glos ustawilismy na 100 na poczatku), wiec program przekreci pokretlo glosnosci ze 100 na 255 w ciagu 1 sekundy, operacje ta mozna przerwac przez
C/C++
void voice_stop_volumeramp( int voice );

na koniec pracy z dzwiekiem, nalezy zwolnic pamiec, w tym celu uzyjemy

C/C++
void release_voice( int voice );
//  lub  //
void deallocate_voice( int voice );
Funkcje maja te samo zadanie, roznia sie jednak tym, ze pierwsza pozwala dzwiekowi dograc do konca, druga go zatrzymuje - wiec wybor, z ktorej skorzystamy, zalezy od potrzeb. Nie zapominajmy, ze SAMPLE tez trzeba zwolnic z pamieci przez
C/C++
destroy_sample( muzyczka );

jesli chcemy, aby nasz zaalokowany voice wskazywal na inny dzwiek, nie musimy tworzyc nowego, jesli stary na nic juz nie wskazuje, mozemy go realokowac, czyli:

C/C++
void reallocate_voice( int voice, const SAMPLE * spl ); // co jest rownoznaczne z ://
deallocate_voice( muzyczka );
voice = allocate_voice( nowy_sample );
tutaj tez warto pamietac o zwolnieniu pamieci przez SAMPLE, ktory juz nie jest przypisany do voice, a jest juz nieuzywany

C/C++
SAMPLE * voice_check( int voice );
 w ten sposob sprawdzamy, czy voice wskazuje na jakis dzwiek, jesli nie, zwroci false.

funkcja ponizej sluzy do ustawienia priorytetu dla voice
C/C++
void voice_set_priority( int voice, int priority );
po co? a po to, ze jesli nasz sprzet nie bedzie mogl obsluzyc wiecej dzwiekow, te z najnizszym priorytetem zostana odrzucone

C/C++
void voice_set_frequency( int voice, int frequency );
ta funkcja pozwala ustalic czestotliwosc odtwarzania, frequency podajemu w Hz

C/C++
void voice_sweep_frequency( int voice, int time, int endfreq );

void voice_stop_frequency_sweep( int voice );
cos jak z samozglasnianiem, tutaj ustalamy zadana czestotliwosc i czas, w jakim ma sie zmienic od obecnej do zadanej, oraz funkcja przerywajaca dzialanie tej pierwszej


poza tym sa funkcje pobierajace wartosci, takie jak glosnosc, balans, czestotliwosc
C/C++
int voice_get_volume( int voice ); //zwraca int, 0-255
int voice_get_frequency( int voice ); // zwraca int, Hz
int voice_get_pan( int voice ); // zwraca int, 0-255

chcac zaladowac wiecej dzwiekow, postepujemy podobnie, jak na poczatku, czyli
C/C++
SAMPLE * kroki = load_sample( "dzwiek42.wav" );
SAMPLE * podskok = load_sample( "dzwiek76.wav" );
//+sprawdzenie, czy udalo sie zaladowac
allocate_voice( kroki );
allocate_voice( podskok );

teraz dostep do tych dzwiekow mamy poprzez :
C/C++
voice_start( 1 );
if( get_voice_position( 1 ) < 0 )
{
    voice_start( 2 );
}


Mam nadzieje, ze chociaz troche przyblizylem temat wykorzystania tych funkcji i ze komus sie one przydadza, to moj pierwszy post tego typu, wiec mam nadzieje, ze moj jezyk pisania jest w miare czytelny, w razie czego prosze o uwagi, oraz oczywscie o poprawienie, jesli cos napisalem blednie, dzieki :)
» Ostatnio zmodyfikowano 2010-07-11 02:59:46
P-19727
» Napisano 2010-07-10 21:04:43
<< coś mi się pomyliło >>
» Ostatnio zmodyfikowano 2010-07-10 21:14:37
P-19728
» Napisano 2010-07-10 21:08:51
<<tekst przenioslem na sama gore>>
» Ostatnio zmodyfikowano 2010-07-11 02:55:55
P-19729
» Napisano 2010-07-10 21:30:56
<<tekst przenioslem na sama gore>>
» Ostatnio zmodyfikowano 2010-07-11 02:56:32
P-19730
» Napisano 2010-07-11 01:34:49
<<to co wyzej>>
» Ostatnio zmodyfikowano 2010-07-11 02:57:07
P-19733
» Napisano 2010-07-11 03:03:40
no, troszke pozno juz dzis, ale napisalem maly artykul o tym, co w temacie, mam nadzieje, ze przypadnie do gustu i sie do czegos przyda, prosze o recenzje ;)
wiem, ze pewnie przydalby sie przykladowy kod, ale juz nie mam sily, a chyba nie bedzie problemem dla nikogo znajacego juz SAMPLE, aby sam poeksperymentowal, bo chyba dosc czytelnie opisalem dzialanie i wykorzystanie funkcji?
P-19734
» Napisano 2010-07-11 08:59:14
bardzo fajne

można by dodać do tutoriala allegro
P-19737
» Napisano 2010-07-11 12:09:15
Jak autor stwierdzi, że skończył to go przeniosę do działu Artykuły nowego serwisu.
P-19739
« 1 »
 Strona 1 z 1