Odczyt dźwięku w c++

whitlock

Użytkownik
Dołączył
Czerwiec 20, 2008
Posty
25
Piszę program, który będzie odczytywał częstotliwość dźwięku granej muzyki i będzie wysyłał bity na port lpt1 do układu elektronicznego, który będzie odpowiednio migał diodami. Każda dioda led będzie się świecić jeśli dźwięk będzie z jej zakresu częstotliwości np (bitów jest 8) dioda 1 świecić się będzie jeśli dźwięk będzie z zakresu np 100 - 800 hz. Dużo jest w necie artykułów na temat komunikacji z portem lpt 1, ale nie znalazłem żadnej biblioteki, która pozwoli mi na dostęp do informacji o aktualnej częstotliwości odtwarzanego dźwięku. Ktoś wie jak to zrobić ? Korzystam z dev c++ i program musi być kompatybilny z xp i dobrze by było aby z windows 7 i vista.
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
O ile pamietam to mozna to zrobic przez biblioteke bass.
FMOD napewno ma tez cos takiego.
 

whitlock

Użytkownik
Dołączył
Czerwiec 20, 2008
Posty
25
Trochę poszperałem za tymi bibliotekami i znalazłem artykuły, które opisują jak stworzyć swój odtwarzacz audio. nie było nic o przechwytywaniu częstotliwości utworu. Dodatkowo obie biblioteki operują dźwiękami które same odtwarzają a ja chce póścić program, który będzie działał z zewnętrznym odtwarzaczem np. winampem czy foobarem.
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
Co do bass to napewno jest cos co przechwytuje dzwiek chyba nawet w przykladach. Warto sciagnac i obejrzec przyklady. Kozystalem z bass przy pisaniu GrzonuAmpa i naprawde ma duzo funkcji oprocz samego odtwarzania. Mozesz tez zobaczyc na czym opiera sie np. SoundForge moze ma wlasna biblioteke a moze jakas ogolnie dostepna.
 

whitlock

Użytkownik
Dołączył
Czerwiec 20, 2008
Posty
25
Dzięki ściągnołem sobie tego bass'a i rzeczywiście ma mnóstwo opcji, ale szukając w necie pod tym tematem natknąłem sie na kogoś kto mówił, że można odczytywać i uzyskać dostęp do wyjścia na karte dźwiękową przez assemblera - jakąś wstawką. Wie ktoś może jak to zrobić ?
 

D.F.

Były Moderator
Dołączył
Listopad 4, 2009
Posty
493
Jeżeli chodzi o bibliotekę uFMOD, to można pobrać aktualną głośność w lewym i prawym kanale funkcją:
Kod:
;  unsigned int uFMOD_GetStats(void)
;  ---
;  Description:
;  ---
;     Returns the current RMS volume coefficients in (L)eft and (R)ight
;     channels.
;        low-order word: RMS volume in R channel
;        hi-order word:  RMS volume in L channel
;     Range from 0 (silence) to $7FFF (maximum) on each channel.
;  ---
;  Remarks:
;  ---
;     This function is useful for updating a VU meter. It's recommended
;     to rescale the output to log10 (decibels or dB for short), because
;     human ears track volume changes in a dB scale. You may call
;     uFMOD_GetStats() as often as you like, but take in mind that uFMOD
;     updates both channel RMS volumes every 20-40ms, depending on the
;     output sampling rate. So, calling uFMOD_GetStats about 16 times a
;     second whould be quite enough to track volume changes very closely.
To można wygodnie wizualizować diodami (aktualną głośność w prawym i lewym kanale).

Jeżeli chcesz wizualizować częstotliwość to może ten link coś pomoże:
The Fourier Transform
externallink.png
 

whitlock

Użytkownik
Dołączył
Czerwiec 20, 2008
Posty
25
Trochę zagmatwany ten algorytm FFT, ale dzięki przyda się. Trochę z bass'a wezme i część z ufmod'a i powinno byc git. Dzięki za pomoc !
 
Do góry Bottom