

C# - Práce se zvukem (Jak mám uložit do proměnné třeba 5. vzorek ze zvukového souboru?)
Mám zvukový soubor. Zvukový soubor obsahuje pípnutí o frekvenci 1000 Hz. Kdybych chtěl znázornit tenhle zvuk graficky, uviděl bych samé vlnění (sinusoidy). Když si podrobně rozebereme jednu vlnu (sinusoidu), tak zjistíme, že se skládá z mnoha vzorků. Já potřebuju nějak zjistit na jaké pozici jsou jednotlivé vzorky.
/\
/ \ /
/ \/
Právě jsem nakreslil zubatou sinusoidu. Dalo by se říct, že se skládá z 8 vzorků. Čárka není vzorek ale jenom spoj mezi jednotlivými vzorky.
/\
. . .
/ \ /
. . .
/ \/
Právě jsem nakreslil zubatou sinusoidu ale se vzorkama (tečky).
Takhle nějak vypadá grafické znázornění mého souboru ze zvukem o 1000 Hz. Těch sinusoid je tam zamozdřejmě víc.
Každý vzorek ale přece musí mít nějakou uloženou pozici, kde je ne?
Já tu pozici chci zjistit, najít a potom jí uložit do proměnné.
Jak to myslíš "uloženou pozici"?
Při sinusoidě je téměř každý vzorek někde jinde nezávisle na čase
Třeba moje sinusoida v 8 bitovém zvuku. Každý vzorem může mít 8 pozicí.
Zkrátka musí mít nějaký označení kde je (v jaký hladině)
To je ale přímo hodnota toho vzorku.
No a přesně tu hodnotu nevim jak získat a uložit do proměnné
Viz odpověď od MM.
8bitový zvuk má 256 pozic.
Nacitas si wav header, zistis bits per sample, prenasobis, a nacitas si Xte bajty v spravnom poradi.
google pomoze s wav headeom.
Ak to neni wav, tak potrebujes kniznice ktore to dekoduju.
P.S. zacni radsej s hello world, a potom postupne sa dostanes o takych 5rokov aj k zobrazovaniu wav
http://msdn.microsoft.com/en-us/library/ff827591.a spx
- MSDN priklad pre nacitanie a prehratie wav.
BTW. resp. neviem ci chapem co chces.
"pozicia" vzorku X v case je X/Fvzorkovacia sekund. Logicky z toho vyplyva ak mas 1000Hz tak pozicia vzorku v sinusovke je X/(Fvzorkovacia/1000).
Ak sa snazis generovat sinusovku, tak to hlavne nerob dementne jak to robit chces, ale rob to pomocou uhla fi (rotujucej jednotkovej kruznice).
fi=0; //len uplne na zaciatku, pocas generovania zvuku fi nikdy nemenit ani pri zmene frekvencie ani nikdy.
while(neco){
vzorka = sin(fi);
fi += (Fzvuku*2*PI)/Fvzorkovacia;
if(fi>2*PI) fi-=2*PI;
}
Dejme tomu, že pozice v čase je x (vodorovně) a pozice kterou chci vědět je y (svisle). Nemyslim pozici v čase ale "výškovou"/hlasitostní pozici.
Ked nezacnes pisat jasne co sa snazis vyrobit z coho, tak ti ani vlastna mati nebude rozumiet.
Hodnota y je hodnota vzorky. Je ulozena v subore (viz vyssie), alebo si ju vyratas (viz vyssie) ak nejaky zvuk generujes.
Myslim pozici na kterou ukazuje šipka v tomhle obrázku:
Bez_n_zvu.png
Precitas si to zo suboru (viz vyssie) alebo si to vypocitas (viz vyssie). Vsetko som uz napisal vyssie. Ked to nechapes tak to nerob alebpo sa pytaj konkretne s cim mas problem. Doteraz sa pytas sposobom "chcem skonstruovat raketoplan a neviem co to je skrutkovac", tak neviem co mam na to este radit.
Ked to chces priamo vzorcom pre X-tu vzorku tak:
hodnota = sin(X*2*PI*Fsinusovky/Fvzorkovacia);
tento vzorec ale nepouzivaj pre generovanie sinusovky, ptz pri velkych X ti bude vznikat enormna chyba vypoctu na double float, ale na generovanie sinusoviek sa pouziva sposob ktory som uz pisal vyssie.
watch
Tady je to co chci v pseudokódu
SoundPlayer zvuk;
int db;
zvuk = new SoundPlayer(@"C:\1.wav");
db = zvuk.volumeAT(5000); // do proměnné db se uloží hlasitost vzorku z 5. sekundy ze souboru zvuk
zvuk.volumeAT(6000) = db; // do 6. sekundy souboru zvuk se uloží proměnná db
http://stackoverflow.com/questions/8754111/how-to- read-the-data-in-a-wav-file-to-an-array
byte[] data = File.ReadAllBytes(@"C:\1.wav");
A?
Tak ked to chces takto stylom hura, tak potom si potrebujes este nastudovat toto https://ccrma.stanford.edu/courses/422/projects/Wa veFormat/
aby si vedel kde mas tie tvoje vzorky a v jakom formate. Skonvertovat dva byty do jedneho signed wordu (MSB je ten druhy v poradi) snad zvladas.
Konečně už vim o co jde :D teď jen rozluštit ty čísla podle stránky a pujde to doufám :D
Tak jo už jsem se naučil číst a zapisovat do wav. Vytvořil jsem třeba náhodný zvuk. dík za radu :)
Uz som ten link daval
http://msdn.microsoft.com/en-us/library/ff827591.a spx
body 1 az 5 su o tom jak nacitat vzorky z wav do pola.
P.S. a ked chces tie hodnoty z pola pouzivat tak si najprv musis otestovat hodnoty channels a bitDepth ktore si si nacital v bode 4 z hlavicky, ptz wav moze byt mono aj stereo a aj 8bit alebo 16bit. A vzorkovacia frekvencia daneho wav je nacitana do premennej sampleRate (wav mozu mat roznu vzorkovaciu frekvenciu takze pri prehravani to nemozes ignorovat)