PS. Mogę jeszcze zmienić temat ale ten mi się podoba.
Jak wydobyć dźwięk z Buildera
Jak wydobyć dźwięk z Buildera
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.
			
									
									PS. Mogę jeszcze zmienić temat ale ten mi się podoba.
Arek - Radzyń Podlaski
						Re: Jak wydobyć dźwięk z Buildera
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/
			
									
									
						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/
Re: Jak wydobyć dźwięk z Buildera
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
						Re: Jak wydobyć dźwięk z Buildera
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.
			
									
									
						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.