[ PremierApostile @ 15.06.2007. 10:51 ] @
Da li je moguce pustiti signal na zvucnik iz ArrayLista.Podaci u ArrayListu su mi Uint tipa. Znam da Matlab ima neku jednostavnu naredbu koja to izvrsava ,al u c# ? :-(. Signal koji cuvam u ArrayListu mi je u slusnom podrucju tako da nije problem u konstantaciji ,vec u implementaciji .Ako ko ima ideju,svaka je dobro dosla.
[ mmix @ 15.06.2007. 12:35 ] @
Hmmm, nesto mi tu ne "zvuci" ok. Mozda gresim, davno je bilo, ali koliko se secam elektroakustike, signal da bi se cuo lepo treba da oscilira ispod i iznad "nultog signala" da bi to omogucilo maksimalni opseg membrane na zvucniku. Svaka jednosmerna komponenta signala limitira opseg posto "zakucava" membranu u ne-nulti polozaj i deformise zvuk i u krajnjoj liniji ga utisava. Zasto ovo pricam, zato sto je tvoj arraj popunjen UInt-ima, sto ce reci seo tvoj signal je uvek u pozitivnom opsegu i ima ili fiksnu ili plutajucu jednosmernu komponentu.

A za izbacivanje array-a integera na zvucnike, ja bih licno tu iskoristio malo unmannaged code-a i unsafe metode. To bi ti omogucilo da castujes c# managed int[] u fiksirani int* buffer sto je jedini nacin da nateras GC da ne dira tvoj buffer

Code:

            int[] x = { -1, 1, -2, 2, -3, 3 };
            fixed (int* px = x)
            {
                // ovde izbacis bafer na zvucnu
            }


Taj pointer posle mozes da bacis na zvucnu karticu kroz Interop kroz API, pogledaj sors ovog primera
A low-level audio player in C#
[ PremierApostile @ 15.06.2007. 20:35 ] @
Citat:
mmix: Hmmm, nesto mi tu ne "zvuci" ok. Mozda gresim, davno je bilo, ali koliko se secam elektroakustike, signal da bi se cuo lepo treba da oscilira ispod i iznad "nultog signala" da bi to omogucilo maksimalni opseg membrane na zvucniku. Svaka jednosmerna komponenta signala limitira opseg posto "zakucava" membranu u ne-nulti polozaj i deformise zvuk i u krajnjoj liniji ga utisava. Zasto ovo pricam, zato sto je tvoj arraj popunjen UInt-ima, sto ce reci seo tvoj signal je uvek u pozitivnom opsegu i ima ili fiksnu ili plutajucu jednosmernu komponentu.

A za izbacivanje array-a integera na zvucnike, ja bih licno tu iskoristio malo unmannaged code-a i unsafe metode. To bi ti omogucilo da castujes c# managed int[] u fiksirani int* buffer sto je jedini nacin da nateras GC da ne dira tvoj buffer :)

Code:

            int[] x = { -1, 1, -2, 2, -3, 3 };
            fixed (int* px = x)
            {
                // ovde izbacis bafer na zvucnu
            }


Taj pointer posle mozes da bacis na zvucnu karticu kroz Interop kroz API, pogledaj sors ovog primera
A low-level audio player in C#

Nije problem mogu prebaciti uint u int . Posto su mi elementi u nizu u rasponu 0-4096,mogu isto promeniti na -2048 do 2048.
Koliko sam shvatio poenta ovog je izbacivanje celog bafera . Meni je potrebno tako reci real time ,tj. da mi po pristizanju podataka sa uredjaja odnosno po prikazu signala na ekran isto se cuje na zvucniku.Ne radim komercijalni program,radi se o Master(diplomskom) Radu ,koji mi je posteno zapeo kod ovog dela :-(.
[ mmix @ 18.06.2007. 14:48 ] @
OK, ti bas testiras moje zakorelo znanje o ovome

1. opseg -2k do 2k nije dobar. Zvucne kartice su 16-bitne i Int ima opseg od -32k do +32k, sto znaci da ce ti input volume tvog signala biti 6% maksimalnog. U prevodu, cak iako i karticu i zvucnike pojacas do maksimuma cuces sa samo 6% jacine. Pre nego izbacis ovaj buffer na karticu moras da "normalizujes" signal, u tvom slucaju svaki int da pomnozis sa 16 (ili svaki int da shiftujes 4 mesta na levo sa predznakom)

2. Ne postoji real time zvuk. Svi programi od mp3 playera do igrica rade sa malim smenjujucim baferima da postignu utisak realnosti. U 44.1Khz modu, kartica "guta" 44100 unsigned integera svake sekunde. Posto oko ne postize vise od realno 25 frameova i ono sto prikazes na ekranu u medjuvremenu covek ne vidi tu imas prostora da laziras stvarnost. Takle ako ti organizujes buffer od 44100/25 = 1764 unsigned integera i vrtis u krug dva buffera (pogledaj double buffering) postici ces "utisak" da zvuk realno prati ispis na ekranu iako taj signal realno kasni za "realnoscu" od 0 to 40ms (1000/25)

E sad posto realno sumnjam da ces moci da postignes sve ovo kroz cisti C# i WaveAPI, toplo preporucujem da pogledas DirectSound9.0 extension for .NET.
[ PremierApostile @ 18.06.2007. 20:41 ] @
Citat:
mmix: OK, ti bas testiras moje zakorelo znanje o ovome :)

1. opseg -2k do 2k nije dobar. Zvucne kartice su 16-bitne i Int ima opseg od -32k do +32k, sto znaci da ce ti input volume tvog signala biti 6% maksimalnog. U prevodu, cak iako i karticu i zvucnike pojacas do maksimuma cuces sa samo 6% jacine. Pre nego izbacis ovaj buffer na karticu moras da "normalizujes" signal, u tvom slucaju svaki int da pomnozis sa 16 (ili svaki int da shiftujes 4 mesta na levo sa predznakom)

2. Ne postoji real time zvuk. Svi programi od mp3 playera do igrica rade sa malim smenjujucim baferima da postignu utisak realnosti. U 44.1Khz modu, kartica "guta" 44100 unsigned integera svake sekunde. Posto oko ne postize vise od realno 25 frameova i ono sto prikazes na ekranu u medjuvremenu covek ne vidi tu imas prostora da laziras stvarnost. Takle ako ti organizujes buffer od 44100/25 = 1764 unsigned integera i vrtis u krug dva buffera (pogledaj double buffering) postici ces "utisak" da zvuk realno prati ispis na ekranu iako taj signal realno kasni za "realnoscu" od 0 to 40ms (1000/25)

E sad posto realno sumnjam da ces moci da postignes sve ovo kroz cisti C# i WaveAPI, toplo preporucujem da pogledas DirectSound9.0 extension for .NET.


Ako ti ovo nazivas zakorelim znanjem,ne znam onda sta je za tebe "tecno " znanje -:)) .U svakom slucaju hvala na ovim odlicnim i preciznim informacijama .
Jos jednom,hvala !
[ mmix @ 19.06.2007. 15:11 ] @
Svojevremeno ('97-e) sam pomagao ortaku koji je pravio program koji "pretvara" jeftinu zvucnu karticu u jeftini +/-20mV osciloskop za signale do 22Khz preko LineIn utisnice , al davno to bese. Ocigledno se nesto "zalepilo"