Cum fișierul wav


Cum fișierul wav

Când am făcut un program de pianolă - pian pe tastatura PC-ul, amintindu-ne de muzica în format mnemonic în fișiere text simplu, am confruntat cu sarcina de a traduce muzica într-un format audio standard. Desigur, cel mai simplu mod de a reda muzica printr-un program în care a fost creat și înregistra sunetul acesta prin microfonul de pe dispozitivul de dreapta. Am făcut acest lucru - pentru a înregistra sunete de la difuzorul calculatorului pe calculatoarele Tablet e-book, folosind microfonul încorporat. Se transformă fișierele WAV.
O întrebare firească - cum să obțineți în jurul acestei interferențe, mai degrabă supărătoare și procesul de luare a, fie pentru a trimite muzica direct în fișier WAV nu poate fi? Și, dacă este posibil, nu este posibil în acest caz, pentru a înlocui operatorul de sunet SOUND (nu voi spune că el este rău, dar suficient de alimente) la sunetul mai nobil, sunetul pianului, de exemplu?

Și, în primul și al doilea cazuri trebuie să știm cum fișierul WAV. Când m-am întors la internet cu această solicitare, nu este imediat găsit, dar faptul că el a găsit, nu a fost în întregime corecte. În plus, multe dintre recomandările privind fișierele WAV înregistrare concepute pentru programatori inteligente, și I, cu excepția Turbo BASIC (programe simple de dos vremuri grele) Nu știu nimic. Cu toate acestea, Turbo BASIC este bine știu, știu, ca un mediu capabil de multe lucruri, chiar și în cadrul sistemelor avansate de astăzi, și l-ați recomanda.

Deci, WAV dosar. Acesta constă dintr-un capac sau capul „cap“ - de la octetul zero la numărul de octet 43, inclusiv (de 44 bytes), și un câmp de date „DATA“ - din numărul octet 44 și până la sfârșitul fișierului.


remarcă proaspătă. Și cum merg lucrurile în Visual Basic?

Printre VB6 capac de fișier WAV pentru stereo, la o viteză de probă 44100 de mână / s pot fi scrise în fișierul „T.wav“, după cum urmează:
„___________________________

Dim Header (10) Atât timp

fname = "T.wav"
fname Deschideți Pentru binare # 1
Seek # 1, 1
Header (0) = 1179011410
Header (1) = Lof (1) - 36 „NextSise
Header (2) = 1163280727
Header (3) = 544 501 094
Header (4) = 16
Header (5) = 131073
Header (6) = 44100 „= VEL (rata de distribuție)
Header (7) = 44100 * 4 „= VEL * 4
Header (8) = 1048580
Header (9) = 1635017060
Header (10) = Lof (1) - 44 „DataSize
Pune # 1. Header ()
Închide # 1


Să revenim la Turbo BASIC

Ne întoarcem acum la practica. Asigurați-vă un sunet și scrie-l într-un fișier WAV.
Acest lucru (a se vedea. De mai jos) Programul BASIC Turbo va ajuta să înțelegeți cum funcționează totul. Nu vom scrie încă muzică, dar va crea mostre de sunet pentru o anumită frecvență de sunet.
Executați acest program și de intrare operatorul afișează un semn de întrebare, vă întreb ce să fac? Doriți să ieșiți din program (de ieșire) - dactilografiere „e“ și Enter
În primul rând, aveți nevoie pentru a deschide fișierul (deschis) - de tip „sau“, deschideți fișierul „r.wav“
Puteți experimenta -
„L“ va arăta lungimea fișierului LOF și poziția pointer LOC
„S44“ set pointer octetului 44th al fișierului
„P123“, spune (poziția cursorului), într-un caractere 123 octeți în variabila S $
„G“ se va scrie într-un fișier (pe poziția cursorului), valoarea S $

Dar să înregistreze sunetul - de tip „w“ și apăsați Enter. Vom ajunge în faza a programului, care se repetă apelurile la funcția pe care calculează amplitudinea sunetului pentru fiecare probă - FNSS2 (260.74,1). Programul a înregistrat două sunete - sunete cu o frecventa de 260.74 Hz (prima octava) definită de timbrul și caracteristicile parametrului de sunet numărul tabelului 1, și după - al doilea sunet, pur undă sinusoidală de aceeași frecvență pentru comparație (parametrii Tabelul 0) . Înainte de a înregistra sunete FNSS2 funcția pe care le creează, setează variabilele sale interne în mod implicit, acest lucru se întâmplă când îl accesați cu F = 0.

Desigur, este interesant să știe cum sunetul face funcția FNSS2 (F, K).
Despre o am, vreau să spun, și să speculeze cu privire la posibilitățile de modelare a sunetului, în articolul următor. Și aici sunt exemplu mai simplu.

DEF FNSS2 (F, K)
FS STATIC, KS, A0, A1, A2, MA2, X, DX, D
LOCAL A, Z, ZZ

Dacă F = 0, atunci „prima configurare
FS = F. KS = K
FNSS2 = 0. EXIT DEF
END IF

IF NOT (F = FS și K = KS), apoi
„Frecvență nouă
FS = F. X = 2. DX = 2 * FS / VEL
„Parametrii noi
KS = K. A0 = 1. A1 = 0. A2 = 0. MA2 = 0. D = 1 „defaults
SELECT CASE K
CASE 0. A0 = 1. A1 = 0. A2 = 0. D = 1
CASE 1. A0 = 0. A1 = 1. A2 = 0. D = 0.99
Cazul 2. A0 = 0. A1 = 0. A2 = 1. MA2 = 1. D = 1
END SELECT
END IF

IF X<1 THEN Z=X*2-1 ELSE Z=(X-1)*2-1. Z=-Z
ZZ = 1-Z * Z. A = A0 * (* 3 + ZZ ZZ * ZZ) / 4 + A1 * * ZZ (1-2.3 * Z)
IF MA2 = 1 ATUNCI A = 0. IF X> 1-2 * DX și X<1+2*DX THEN A=A2
IF X<1 THEN A=-A

După cum se poate observa, apelul inițial la funcția setează parametrii stabiliți K = 0, iar următorul tratament cu o frecvență diferită sau cu un alt K determină resetarea condițiilor inițiale și etapa de determinare prin schimbarea formulei de fază:
PASUL 2 = * (frecvență audio) / (frecvență de eșantionare)

Variabila X, la fiecare pas de referință DX variabilă, tot timpul este în intervalul (0,2), care corespunde fazei de constatare obișnuit în intervalul de la 0 la 2 * pi.
Prima jumătate a perioadei oscilațiilor este programată pentru formulele -1 Y = (1 - Z ^ 2) * 3/4 ​​+ (1 - Z ^ 2) ^ 2 * 1/4 - o reprezentare foarte buna a sinusoidă
Y = (1 - Z ^ 2) * (1-2.3 * Z) - leagăne la negativ capătul de descărcare jumătate de ciclu
A doua oscilațiile semiperioadă programate prin aceleași formule, dar este trecut în contra-Z și semnul A este inversat. Trecerea de-al doilea ciclu antifază jumătate permite netede „capsate“ împreună emisii.

CAZUL 2 Un set de parametri pe care le puteți vedea în interiorul funcția este proiectat pentru a genera un puls scurt. Cu un astfel de impuls este convenabil pentru a studia reveberatsii (am făcut-o, dar vom vorbi despre asta mai târziu) funcția.

Asta e tot. Fericit dacă ceva a ajutat.
Părțile interesate pot avea acces la [email protected] oficiu postal