Zgomot Crearea unui sintetizator pentru efecte de sunet retro - Introducere

Acesta este primul dintr-o serie de tutoriale în care vom crea un motor audio bazat pe sintetizator care poate genera sunete pentru jocuri retro-stil. Motorul audio va genera toate sunetele în timpul rulării, fără a fi nevoie de alte dependențe externe, cum ar fi fișiere MP3 sau fișiere WAV. Rezultatul final va fi o bibliotecă de lucru care poate fi abandonată fără efort în jocurile tale.

Înainte de a putea începe să creăm motorul audio, există câteva lucruri pe care trebuie să le înțelegem; acestea includ formele de undă pe care motorul audio le va folosi pentru a genera sunetele audibile și cum sunt stocate și reprezentate în formă digitală unde sonore.

Limba de programare folosită în acest tutorial este ActionScript 3.0, dar tehnicile și conceptele folosite pot fi traduse cu ușurință în orice alt limbaj de programare care oferă un API de sunet de nivel scăzut.

Ar trebui să vă asigurați că aveți instalat browserul dvs. Flash Player 11.4 sau superior dacă doriți să utilizați exemplele interactive din acest tutorial.


Formele de undă

Motorul audio pe care îl vom crea va folosi patru forme de undă de bază (cunoscute și ca periodic forme de undă, deoarece formele lor de bază se repetă periodic), toate acestea fiind extrem de frecvente atât în ​​sintetizatoarele analogice, cât și în cele digitale. Fiecare formă de undă are propria sa caracteristică sonoră unică.

Următoarele secțiuni oferă o redare vizuală a fiecărei forme de undă, un exemplu sonor al fiecărei forme de undă și codul necesar pentru a genera fiecare formă de undă ca o serie de date de probă.

Puls

Unda pulsului produce un sunet ascuțit și armonic.

Pentru a genera o serie de valori (în intervalul -1.0 până la 1.0) care reprezintă un val de impuls, putem folosi următorul cod, unde n este numărul de valori necesare pentru a popula matricea, A este matricea și p este poziția normalizată în forma de undă:

var i: int = 0; var n: int = 100; var p: Număr; in timp ce eu < n )  p = i / n; a[i] = p < 0.5 ? 1.0 : -1.0; i ++; 

Sawtooth

Valul de fierăstrău produce un sunet ascuțit și dur.

Pentru a genera o serie de valori (în intervalul -1.0 până la 1.0) care reprezintă un val de fierăstrău, putem folosi următorul cod, unde n este numărul de valori necesare pentru a popula matricea, A este matricea și p este poziția normalizată în forma de undă:

var i: int = 0; var n: int = 100; var p: Număr; in timp ce eu < n )  p = i / n; a[i] = p < 0.5 ? p * 2.0 : p * 2.0 - 2.0; i ++; 

Sinus

Valul sinusoidal produce un sunet neted și pur.

Pentru a genera o serie de valori (în intervalul -1.0 - 1.0) care reprezintă un val sinusoidal putem folosi următorul cod, unde n este numărul de valori necesare pentru a popula matricea, A este matricea și p este poziția normalizată în forma de undă:

var i: int = 0; var n: int = 100; var p: Număr; in timp ce eu < n )  p = i / n; a[i] = Math.sin( p * 2.0 * Math.PI ); i ++; 

Triunghi

Valul triunghiului produce un sunet armonios și neted.

Pentru a genera o serie de valori (în intervalul -1.0 până la 1.0) care reprezintă un val de triunghi, putem folosi următorul cod, unde n este numărul de valori necesare pentru a popula matricea, A este matricea și p este poziția normalizată în forma de undă:

var i: int = 0; var n: int = 100; var p: Număr; in timp ce eu < n )  p = i / n; a[i] = p < 0.25 ? p * 4.0 : p < 0.75 ? 2.0 - p * 4.0 : p * 4.0 - 4.0; i ++; 

Iată o versiune extinsă a liniei 6:

 dacă (p < 0.25)  a[i] = p * 4.0;  else if (p < 0.75)  a[i] = 2.0 - (p * 4.0);  else  a[i] = (p * 4.0) - 4.0; 

Forma de undă și frecvența

Două proprietăți importante ale unui val de sunet sunt amplitudine și frecvență a formei de undă: acestea dictăm volum și pas de sunet, respectiv. Amplitudinea este pur și simplu valoarea maximă absolută a formei de undă, iar frecvența este numărul de repetări ale formei de undă pe secundă, măsurată în mod normal în hertz (Hz).

Următoarea imagine este un instantaneu de 200 milisecunde dintr-o formă de undă de fierăstrău cu o amplitudine de 0,5 și o frecvență de 20 hertzi:

Pentru a vă da o idee despre modul în care frecvența unei forme de undă se referă direct la culoarea sunetului sonor, o formă de undă cu o frecvență de 440 de hertzi ar produce același pitch ca nota standard A4 (mijlocul A) pe un pian modern. Având în vedere această frecvență, putem calcula frecvența oricărei note utilizând următorul cod:

f = Math.pow (2, n / 12) * 440,0;

n variabilă în acest cod este numărul de note de la A4 (mijlocul A) la nota de care suntem interesați. De exemplu, pentru a găsi frecvența A5, o octavă peste A4, am seta valoarea n la 12 deoarece A5 este de 12 note peste A4. Pentru a găsi frecvența E2 am seta valoarea lui n la -5 deoarece E2 este de 5 note de mai jos A4. De asemenea, putem face invers și găsim o notă (relativă la A4) pentru o anumită frecvență:

n = Math.round (12,0 * Math.log (f / 440,0) * Math.LOG2E);

Motivul pentru care aceste calcule funcționează este faptul că frecvențele notei sunt logaritmice - înmulțirea unei frecvențe cu două mișcări o notă de până la o singură octavă, în timp ce se împarte o frecvență cu două mișcări o notă în jos o singură octavă.


Valori sonore digitale

În lumea digitală, undele sonore trebuie să fie stocate ca date binare, iar modalitatea obișnuită de a face acest lucru este de a face instantanee periodice (sau probe) de undă sonoră. Numărul de eșantioane de undă care sunt luate pentru fiecare secundă a duratei unui sunet este cunoscut sub numele de rata simpla, astfel încât un sunet cu o rată de eșantionare de 44100 va conține 44100 probe de undă (pe canal) pentru fiecare secundă a duratei sunetului.

Următoarea imagine demonstrează modul în care ar putea fi preluat un eșantion de undă sonoră:

Bloburile albe din acea imagine reprezintă punctele de amplitudine ale undei care sunt prelevate și stocate într-un format digital. Vă puteți gândi la aceasta ca la rezoluția unei imagini bitmap: cu cât mai mulți pixeli o imagine bitmap conține cele mai multe informații vizuale pe care le poate conține și mai multe informații duc la fișiere mai mari (pentru moment, ignorați compresia fișierelor). Același lucru este valabil și pentru sunetele digitale: cu cât probele de undă mai mult conțin un fișier de sunet, cu atât va fi mai precis unde va fi sonda reconstruită.

Pe lângă faptul că au o rată de eșantionare, sunetele digitale au, de asemenea, bit rate care se măsoară în biți pe secundă. Rata de biți dictează cât de mulți biți binari sunt utilizați pentru a stoca fiecare eșantion de undă. Acesta este similar cu numărul de biți folosiți pentru a stoca informațiile ARGB pentru fiecare pixel într-o imagine bitmap. De exemplu, un sunet cu o rată de eșantionare de 44100 și o rată de biți de 705600 ar fi stocarea fiecăruia dintre eșantioanele sale de valuri ca o valoare pe 16 biți și o putem calcula destul de ușor folosind următorul cod:

bitsPerSample = bitRate / sampleRate;

Iată un exemplu de lucru care utilizează valorile menționate mai sus:

urmă (705600/44100); // "16"

Înțelegerea probelor de sunet este cel mai important lucru aici; motorul audio pe care îl vom crea va trebui să genereze și să manipuleze probe de sunet brute.


modulatori

Un alt lucru pe care ar trebui să îl cunoaștem înainte de a începe să programați motorul audio sunt modulatori, care sunt foarte frecvente atât în ​​sintetizatoarele analogice, cât și în cele digitale. Un modulator este în esență doar o formă de undă standard, dar în loc să fie folosit pentru a produce un sunet, ele sunt utilizate în mod obișnuit pentru a modula una sau mai multe proprietăți ale unei forme de undă audibile (de exemplu, amplitudinea sau frecvența acesteia).

Lua vibrato, de exemplu. Vibrato este o schimbare obișnuită a pulsației. Pentru a produce acest efect folosind un modulator, puteți seta forma de undă a modulatorului la un val sinusoidal și setați frecvența modulatorului la undeva în jur de 8 hertzi. Dacă ați cuplat modulatorul până la frecvența unei forme de undă acustice, rezultatul ar fi un efect vibrato - modulatorul va ridica și reduce ușor frecvența (treapta) a formei de undă auditivă de opt ori pe secundă.

Motorul audio pe care îl vom crea vă va permite să atașați modulatori la sunetul dvs. pentru a vă permite să produceți un număr mare de efecte diferite.


Coming Up ...

În tutorialul următor vom crea codul de bază pentru motorul audio și vom face totul în funcțiune. Urmăriți-ne pe Twitter, Facebook sau Google+ pentru a fi la curent cu cele mai recente postări.