Jak wydobyć dźwięk z Buildera

Jeśli chcesz zasięgnąć rady, podzielić się doświadczeniem w trudnej sztuce samodzielnego programowania - to tu jest miejsce, aby tego dokonać.
Awatar użytkownika
astro
Posty:166
Rejestracja:piątek 09 sie 2002, 00:00
Jak wydobyć dźwięk z Buildera

Post autor: astro » czwartek 19 paź 2006, 20:17

Wybrałem sobie na pracę dyplomową temat: Synteza addytywna dźwięku. Model matematyczny wstępnie opracowany. Z interfejsem graficznym sobie poradzę (napisałem już kilka okienkowych aplikacji). Nie wiem tylko czy poradzę sobie z wydobywaniem dźwięku z Bildera i przyjmowaniem komunikatów MIDI. Przeglądarka grzeje się od kilku dni ale przesiewanie zbędnych informacji jest bardzo żmudne. Może znacie jakieś ciekawe linki lub dobrą literaturę. Niestety z angielskim jestem na bakier ( a little ).
PS. Mogę jeszcze zmienić temat ale ten mi się podoba.
Arek - Radzyń Podlaski

WG
Posty:1235
Rejestracja:poniedziałek 12 sie 2002, 00:00

Re: Jak wydobyć dźwięk z Buildera

Post autor: WG » piątek 20 paź 2006, 00:44

Chodzi o C++ Builder'a pewnie
A miałem nie zaglądać w temat bo sądziłem że nazwa jakiegoś filmu czy cuś podobnego

To co ci będzie potrzebne do MIDI to funkcje z biblioteki winmm.lib
plik nagłówkowy mmsystem.h

midiInGetNumDevs - odczytuje ilosc portow MIDI
midiInGetDevCaps - odczytuje info o kazdym porcie MIDI
midiInOpen - otwiera port
itd.

Do audio jeżeli tylko Multimedia to ta sama biblioteka zamiast midi polecenia wave.
waveOutGetNumDevs - odczytuje ilosc wyjsc AUDIO
waveOutGetDevCaps - odczytuje info o kazdym porcie wyjsciowym AUDIO
waveOutOpen - otwiera port
itd.

Jeżeli nie wiesz jak zacząć to WSZYSTKO na dobry początek będziesz miał pod tym adresem:
http://www.borg.com/~jglatt/tech/

Awatar użytkownika
astro
Posty:166
Rejestracja:piątek 09 sie 2002, 00:00

Re: Jak wydobyć dźwięk z Buildera

Post autor: astro » sobota 21 paź 2006, 20:17

Wielkie dzięki
Arek - Radzyń Podlaski

Awatar użytkownika
astro
Posty:166
Rejestracja:piątek 09 sie 2002, 00:00

Re: Jak wydobyć dźwięk z Buildera

Post autor: astro » piątek 16 lut 2007, 21:14


Do audio jeżeli tylko Multimedia to ta sama biblioteka zamiast midi polecenia wave.
waveOutGetNumDevs - odczytuje ilosc wyjsc AUDIO
waveOutGetDevCaps - odczytuje info o kazdym porcie wyjsciowym AUDIO
waveOutOpen - otwiera port
itd.
-----------------------------------
Potrzebuję jeszcze pomocy

wysyłam do porty tablicę i odtwarzam ją instrukcją:
waveOutWrite(WaveHandle, &WaveHeader, sizeof(WAVEHDR));
"obliczam" na nowo tablicę i ponownie ją wysyłam do portu a po przechwyceniu komunikatu o końcu odtwarzania "poprzedniej" tablicy odtwarzam nową itd.

ale pomiędzy odtwarzanymi tablicami jest słyszalna przerwa
co zrobic aby się jej pozbyc

Arek - Radzyń Podlaski

WG
Posty:1235
Rejestracja:poniedziałek 12 sie 2002, 00:00

Re: Jak wydobyć dźwięk z Buildera

Post autor: WG » piątek 16 lut 2007, 21:28

Aleś trafił. Akurat wchodziłem na forum i widziałem jak pojawiał się temat

Odnośnie pytania, musisz zastosować tzw. "podwójne buforowanie"

Polega to na tym, że na początku od razu wysyłasz 2 pakiety. W momencie gdy skończy się odtwarzanie pierwszego system od razu odtwarza następny a ty w tym czasie po otrzymaniu WOM_DONE przygotowujesz 3 pakiet do wysłania. I tak w kółko.

Schematycznie wygląda to tak:

WOM_OPEN
buffer #1
buffer #2 - oba wysyłasz zaraz po WaveOutOpen

WOM_DONE:
buffer #3

WOM_DONE:
buffer #4

... itd. aż do wyczerpania tych buforów chyba, że chcesz zapętlić to wtedy przestawiasz pozycję, odczytu itp.

A tak naprawdę lepiej stosować więcej buforów co możesz zauważyć w WaveLab czy Sound Forge gdzie mamy możliwość ustawienia ich ilości.

Także 3 bufory to jest minimum i tak mniej więcej wyglądało by to w praktyce.

WOM_OPEN
buffer #1
buffer #2
buffer #3 - wszystkie trzy wysyłasz po WaveOutOpen, albo przynajmniej dwa już wystarczy

WOM_DONE: buffer #1
WOM_DONE: buffer #2
WOM_DONE: buffer #3
WOM_DONE: buffer #1
WOM_DONE: buffer #2

itd.

Na przykład karty Creamware źle odtwarzają dźwięk w trybie podwójnego buforowania i trzeba stosować minimum 3 bufory jak wyżej.

Wszystko też zależy od wielkości tego bufora bo tryb MME ma spore ograniczenia i nie można zejść tak nisko z latencją jak się to ma w ASIO.

ODPOWIEDZ