Analiza formatelor: sunet în unele jocuri pe Unreal Engine. Utilizarea FMOD în jocuri audio

De ce extrage sunet dintr-un joc? Câte câteva site-uri de muzică există?

Da, treaba este că te vei sătura să cauți melodii din jocuri. Și apoi erau jocuri pe computer cu muzică electronică bună. Tocmai în acel moment, aveam nevoie urgent să-l fac și să-l spun cu efecte sonore. Așa că am început să mă gândesc dacă să elimin sunetul din joc. Jocul era în format Java pentru un telefon mobil și nu putea fi deschis cu ușurință în directorul său, nu prin niciun program.

Acum extragerea sunetului din jocuri nu este o problemă pentru mine. Un program puternic m-a ajutat cu asta UniExtractor(descărcare) Este conceput pentru a extrage arhivele deteriorate, cum ar fi -7zip, WinRAR și alte fișiere comprimate. Ei bine, instalatorii de programe înșiși despachetează fără probleme. Și jocul Java este tocmai programul de instalare. După ce am despachetat un joc simplu, am încercat să extrag sunet dintr-unul mai complex. Programul UniExtractor a făcut față și jocurilor pentru sistemul de operare Android. Este nevoie de foarte puțin timp pentru a despacheta. Aproximativ un minut. În acest timp, este puțin probabil să fi găsit un sunet potrivit pe Internet. Sa trecem la treaba.

Extragerea sunetului din joc

Pentru a dezarhiva, așa cum am menționat mai sus, vom folosi un dispozitiv special de despachetare a arhivei - Uniextractor. Programul nu trebuie să fie lansat separat, doar faceți clic dreapta pe programul de instalare a jocului. În meniul contextual, selectați elementul- Extras cu Uniextractor.

Procesul de despachetare.

Acum, putem vedea două fișiere cu același nume. Primul este programul de instalare a jocului în sine, iar al doilea este programul de instalare dezambalat, sub forma unui folder cu fișiere. Deschide folderul și caută altul în el, cu numele aplicația .

În acest folder mai sunt două, cu fișiere audio. Ele pot fi numite diferit. Dar de obicei este MuzicăȘi Sunet.În general, dacă nu sunt acolo, atunci va trebui să revizuiți toate folderele.

Vreau să te fac fericit. Nu toate jocurile au această problemă. Unele jocuri despachetate conțin formatul audio, care poate fi ascultat imediat pe player.

Acest lucru este util să știți:


Formate muzicale în jocuri
Shiru (A.Semenov) mailto:shiru at mail dot ru

În procesul de dezvoltare a unui joc, mai devreme sau mai târziu apare întrebarea - ce formate să folosiți pentru a stoca datele jocului. Scopul acestei recenzii este de a lua în considerare caracteristicile, avantajele și dezavantajele formatelor populare pentru muzică în jocuri, astfel încât, pe baza informațiilor primite, să puteți face o alegere inteligentă în cadrul proiectului dumneavoastră. Nuanțele tehnice ale reproducerii (cum, cu ce) formatele menționate aici depășesc domeniul de aplicare al articolului și, prin urmare, nu sunt discutate aici.

În mod convențional, putem împărți formatele folosite pentru stocarea muzicii în două grupe: streaming audio, care conține pista audio finală (adică doar sunet), eventual comprimată pentru a-i reduce dimensiunea; și formatele muzicale în sine, care stochează un set de instrucțiuni despre când și ce notă să cânte, plus sunete (eșantioane) cu care aceste note ar trebui să fie redate. Mai întâi, să ne uităm la caracteristicile acestor două grupuri.

Streaming audio

Nu este cu adevărat un format muzical - este sunetul așa cum este, înregistrat într-un fișier. Dar acel sunet ar putea foarte bine să fie muzică, așa că, în sensul acestui articol, streaming audio este, de asemenea, un format muzical. Se numește streaming deoarece fișierul nu trebuie să fie prezent în întregime în memorie - este suficient să citiți bucăți mici de pe suport, să le decodați (dacă este necesar) și să-l trimiteți pentru redare. Streamingul audio vine cu sau fără compresie.

Formatele audio de streaming necomprimate nu sunt utilizate în mod obișnuit pentru a stoca muzică în jocuri din cauza dimensiunilor lor enorme: o secundă de audio stereo de calitate CD (44100hz, 16 biți) ocupă 172 de kiloocteți. Excepția anterior a fost CD-DA, formatul CD audio. Însă jocurile cu muzică în acest format nu s-au văzut în ultimii ani - întotdeauna există ceva care să umple cei câțiva, după standardele moderne, megaocteți de discuri CD/DVD.

Formatele audio comprimate sunt mai potrivite pentru aplicațiile de jocuri. Există algoritmi pentru compresia audio fără nicio pierdere de calitate (așa-numiții algoritmi lossyless), dar câștigul în volum este extrem de nesemnificativ, deci cele mai comune formate de compresie cu pierdere de calitate (algoritmi cu pierderi). Algoritmii populari de compresie, care oferă un câștig mare în volumul fișierului final, folosesc ideea „codării psihoacustice” - excluderea dinamică a frecvențelor din semnal care sunt slab percepute de auzul uman. De obicei, se alege un nivel de pierdere care abia este vizibil pentru ureche. Algoritmii de compresie audio funcționează de obicei cu un raport de compresie fix, pentru jocuri, acesta este de obicei aproximativ 11:1...7:1 (flux de date 128...192kb/s). Există un număr mare de formate de compresie audio, dar cele mai cunoscute și utilizate dintre ele sunt MP3, WMA, OGG.

MP3 este cel mai vechi format, foarte comun. Inițial a apărut ca format de compresie pentru piste audio pentru filme video în format VideoCD (numele complet este MP3 - MPEG Audio Layer III), dar destul de repede a început să fie folosit singur. MP3 este acum standardul industriei. Folosirea fișierelor audio comprimate în MP3 în proiecte comerciale de jocuri cu un tiraj de peste 5.000 de exemplare costă bani - 2.500 USD per produs (licență de joc, pentru mai multe informații despre licențiere, vezi linkurile de la sfârșitul articolului). Astăzi MP3-ul nu oferă cea mai bună performanță în ceea ce privește raportul dimensiune/calitate. Versiunile îmbunătățite ale formatului MP3 - MP3pro, de exemplu - cu indicatori similari cu WMA/OGG, nu au câștigat prea multă popularitate.

WMA - Windows Media Audio, un format promovat de Microsoft ca o alternativă mai avansată la MP3, este aproximativ similar ca capabilități cu formatul OGG. Utilizarea sa în produse software pentru stocarea conținutului audio nu necesită licență.

OGG este un format de compresie audio relativ nou, care prezintă cel mai mare interes pentru dezvoltatorii de jocuri. Nu necesită nicio licență și este complet legal pentru utilizare gratuită; în același timp, oferă o calitate superioară a sunetului, cu aceeași dimensiune ca MP3, sau o dimensiune mai mică, cu aceeași calitate a sunetului. Adevărat, decodarea OGG necesită puțin mai multe resurse de calcul decât MP3/WMA. Codificatoarele și decodoarele software de la creatorul formatului (Vorbis) sunt distribuite ca sursă deschisă.

Avantajele utilizării audio în flux pentru a stoca muzică:

  • Puteți stoca muzică de absolut orice nivel tehnic. În acest sens, acest format este universal și posibil (în special cu compresie cu pierderi reduse) poate oferi cea mai bună calitate a sunetului
  • Muzicienii tăi nu sunt limitați de capacitățile formatului și pot folosi instrumentele pentru a crea muzică care sunt convenabile pentru ei (adică, va fi ușor să găsești un muzician potrivit)
  • Nu necesită o cantitate mare de RAM la redare (fluxul de date este citit de pe media în porțiuni mici)
Minusuri:
  • Pentru unele aplicații, dimensiunea audio chiar și comprimat poate fi prea mare - o compoziție de lungime medie la o calitate decentă durează 3-5 megaocteți (când se utilizează formate comprimate)
  • Reducerea dimensiunii se poate face doar prin reducerea semnificativă a calității (creșterea pierderilor de compresie) și reducerea lungimii compozițiilor.
  • Durata unei piese depinde direct de dimensiunea fișierului său
  • Decodarea sunetului comprimat necesită resurse relativ mari ale procesorului și este posibil să nu fie posibilă pe platforme cu consum redus fără un decodor hardware (în timp real)

Formate muzicale

Formatele muzicale în sine sunt formate care nu conțin sunetul final, ci doar informații despre cum să îl obțineți. Adică informații despre când și ce note să cânte cu ce sunete (și - opțional - aceste sunete în sine). Datorită acestui fapt, este posibil să se obțină un câștig semnificativ în cantitatea de informații stocate (dimensiunea fișierului). Sunetul final (pe care jucătorul îl va auzi) este obținut direct în timpul procesului de redare a muzicii. Acest lucru ocupă unele resurse de calcul, dar, în general, sarcina nu este mai mare decât atunci când se decodează audio în flux comprimat și, de obicei, chiar mai puțin (redarea formatelor de muzică poate fi accelerată hardware; pe un computer, de exemplu, suportul hardware necesar este mult mai frecvent). decât suportul hardware necesar pentru decodarea audio comprimată).

Formatele muzicale impun unele restricții asupra libertății de creativitate a unui muzician - o parte lungă vocală sau instrumentală înregistrată live, de exemplu, nu poate fi inserată - mai precis, va fi neprofitabilă, deoarece va duce la o creștere a dimensiunii fișierului și va fi mai convenabil să utilizați streaming audio. Pentru muzică „live” (orchestră simfonică, trupă rock etc.) trebuie neapărat să utilizați streaming audio. Formatele muzicale sunt potrivite numai pentru imitaţie muzică live (pentru cazurile în care sunetul imitației devine acceptabil datorită unui câștig semnificativ în dimensiunea fișierului) sau pentru muzică electronică. Este aproape imposibil să se realizeze asemănarea absolută în sunetul unei compoziții într-un format muzical cu muzică live sunt posibile doar diferite grade de aproximare. După cum arată practica, această limitare nu este un dezavantaj serios.

Formatele muzicale utilizate în jocuri pot fi împărțite în două subgrupe: MIDI și familia de formate de urmărire (așa-numitele module de urmărire, uneori numite și simplu module). Principala diferență dintre aceste două subgrupuri este că fișierele MIDI standard conțin doar note, în timp ce modulele de urmărire, pe lângă note, stochează mostre care sunt folosite pentru a suna aceste note. Diferențele rămase se referă în principal la unele restricții care își impun propriile specificități atunci când scriu muzică.

Un punct important: atât formatele MIDI, cât și formatele tracker nu necesită licență pentru a fi utilizate într-un produs comercial.

Formate muzicale: MIDI

MIDI (Musical Instruments Digital Interface) este o interfață hardware, precum și un standard care descrie procesul de schimb de date muzicale între instrumentele muzicale electronice. Datele muzicale nu sunt sunet, ci sunt, pentru a spune foarte simplu, doar informații despre tastele sintetizatorului apăsate/eliberate. MIDI sunt, de asemenea, standarde pentru stocarea acestor informații în fișiere (cele mai cunoscute opțiuni sunt .mid, .midi). MIDI poate fi numit, într-o oarecare măsură, un „format de muzică în flux”, deoarece... pentru a-l reda, nu este nevoie să aveți întreg fișierul în memorie - îl puteți citi bucată cu bucată, așa cum este cazul în cazul streamingului audio. Dar aceasta este singura asemănare între aceste formate.

Mulți utilizatori de PC, auzind cuvântul „midi”, spun cu dispreț ceva de genul „oh, acestea sunt fișiere atât de mici, cu muzică groaznică” (în special cei care au încă plăci de sunet rare fără sintetizatoare WaveTable de înaltă calitate). Este important să înțelegeți că sunetul unei compoziții înregistrate într-un fișier MIDI este sunetul sintetizatorului din computerul dvs. prin care este redat conținutul fișierului, calitatea sunetului depinde direct de calitatea sintetizatorului; Puțini oameni știu că MIDI este utilizat pe scară largă în crearea muzicii electronice profesionale (inclusiv pentru crearea muzicii pentru jocuri, pentru înregistrarea ulterioară în format audio).

În momentul de față, singurul principiu de funcționare folosit pentru sintetizatoarele MIDI de pe un PC este așa-numitul. Sinteza WaveTable. Adică există un set (bancă) de sunete ale diferitelor instrumente (descrise de standard, cel puțin 128 de instrumente și 64 de sunete de tobe), sintetizatorul reproduce note cu aceste sunete. Sunetele instrumentelor nu sunt stocate în fișierul MIDI, iar băncile de instrumente de la diferiți producători de plăci de sunet pot diferi (nu în compoziția instrumentelor, ci în caracteristicile sunetului lor). Prin urmare, cu diferite bănci de instrumente, sunetul aceluiași fișier MIDI se schimbă oarecum, ceea ce creează uneori o anumită problemă. O compoziție scrisă pentru o bancă poate suna rău cu alta (din cauza unui echilibru diferit al volumelor instrumentelor, de exemplu). Acest lucru impune și o limitare a libertății creatoare a muzicianului - acesta este limitat doar de acele timbre (instrumente) pe care standardul le descrie. Pe de altă parte, absența mostrelor de instrumente într-un fișier MIDI îi reduce foarte mult dimensiunea - o compoziție uriașă poate cântări doar 50-100 de kiloocteți și, în același timp, poate fi comprimată perfect de mai multe ori cu un ZIP obișnuit.

Există mai multe standarde MIDI compatibile cu înapoi - cel principal, General Midi (GM); prelungire de la Roland (GS); extensie mai avansată de la Yamaha (XG). Formatele avansate au un număr mare de instrumente în standard (minimum 226 pentru GS, minim 480 pentru XG - fără a număra tobe) și capacități suplimentare pentru controlul sintezei sunetului, prin care puteți diversifica și îmbunătăți calitatea sunetului.

Pentru a reda MIDI, aveți nevoie de un sintetizator MIDI în sistem - pe un computer poate fi o placă de sunet cu un sintetizator hardware WaveTable (GM/GS/XG, cu propria bancă de sunete) sau o placă de sunet simplă (cum ar fi AC"97) cu un sintetizator software (care consumă o parte din performanța sistemului; un sintetizator software GS cu o bancă de sunet standard este inclus în DirectX). Pe dispozitive precum telefoanele mobile, acesta poate fi un simplu sintetizator hardware (nu există opțiuni de putere pentru sinteza software încă), și nu WaveTable, ci una dintre metodele alternative de sinteză (de obicei aceasta este sinteza FM), simulând foarte aproximativ sunetul instrumentelor.

Dacă în sistem nu există un sintetizator hardware și nu există suficiente resurse de procesor/memorie pentru sinteza software, este imposibil să redați MIDI pe un astfel de dispozitiv.

Pro:

  • Dimensiunea fișierului foarte mică
  • Când utilizați un sintetizator bun cu o bancă de mostre bună, sunet de înaltă calitate
  • Dacă aveți un sintetizator hardware, există o sarcină foarte mică pe CPU (playerul trimite doar comenzi la sintetizator)
  • Nu va fi greu să găsești un muzician care să știe să lucreze cu MIDI
Minusuri:
  • Dependența calității sunetului de sintetizatorul utilizat
  • Sunete diferite ale instrumentelor pe diferite sintetizatoare (muzica care sună bine pe un sintetizator poate suna groaznic pe altul, chiar dacă aceste sintetizatoare sunt de aceeași înaltă calitate)
  • O oarecare monotonie în sunetul oricărei muzici de pe același sintetizator (datorită faptului că banca de mostre pentru diferite compoziții de obicei nu se schimbă)

Formate muzicale: muzica tracker

Muzica în acest format se mai numește și „module”. Ca și în MIDI, fișierul stochează date despre note, dar pe lângă acestea, stochează și mostre care vor fi folosite pentru a suna notele atunci când sunt redate. Aici se termină asemănările - din punct de vedere tehnic, există mai multe diferențe decât asemănări între MIDI și muzica tracker. În ciuda ideii generale (de a stoca note mai degrabă decât sunetul final), implementările acestei idei variază foarte mult.

Un tracker este un editor muzical cu un anumit tip de interfață (coloane verticale de numere și litere în loc de personalul muzical familiar muzicienilor). Trackerele au apărut cu mult timp în urmă, pe primele computere de acasă care aveau cele mai simple dispozitive pentru sinteza sunetului. Notele au fost sunate de hardware-ul sistemului (de exemplu, prin cipul SID de pe C64, prin cipul AY de pe ZX128). Trackerele care folosesc mostre pentru a suna notele au apărut la sfârșitul anilor 80 pe platforma AMIGA și s-au răspândit ulterior pe toate celelalte platforme care au mijloacele de a reproduce sunetul digital.

Însuși principiul de funcționare a trackerelor impune anumite restricții asupra capacităților muzicianului, pe de altă parte, oferind capacități neobișnuite de control al sunetului. Spre deosebire de standardul MIDI profesional, acesta este un standard de amatori dezvoltat de pasionații de muzică pe computer, nu de producătorii de echipamente muzicale. Scrierea muzicii în trackere este diferită de lucrul cu secvențiere MIDI software profesionale. Principalele caracteristici ale trackerelor:

Cuantificare strictă a timpului - notele nu pot începe și nu se opresc să sune în orice moment, ci doar în anumite poziții (acest lucru face dificilă executarea unor efecte, de exemplu, interpretarea lin a unui acord de chitară);
- Lipsa polifoniei pe un singur canal (pistă), pot suna simultan exact atâtea note câte canale sunt în pistă;
- Prezența „efectelor” - comenzi care afectează procesul de redare a fiecărei note individuale. Efectele pot fi destul de obișnuite (din punct de vedere muzical) - vibrato, control volum, portamento; și nu chiar obișnuite - deplasarea începutului eșantionului, gestionarea filtrelor etc.

În ciuda unor limitări (comparativ cu MIDI), stocarea mostrelor într-un fișier cu o compoziție oferă avantaje evidente - capacitatea de a utiliza orice timbre necesare, fragmente de părți live (riff-uri de chitară, bucle de tobe) - acest lucru vă permite să îmbunătățiți calitatea sunetului și faceți-l mai aproape de „sunetul live”.

Există un număr mare de formate de urmărire - de regulă, fiecare editor nou, pe lângă faptul că acceptă câteva dintre cele mai populare formate, avea și propriul său format. Formatele diferă în ceea ce privește capabilitățile și organizarea datelor în fișier, dar ideea generală rămâne aceeași. Cele mai populare sunt patru formate care au devenit standard (suportate de aproape toți editorii): MOD simplu (Sound Tracker/Pro Tracker) și S3M (Scream Tracker) și XM (Fast Tracker) și IT (Impulse Tracker) mai avansate.

Primul format de tracker - MOD (de la cuvântul modul, motiv pentru care muzica tracker se numește module) - avea capacități modeste: 4 canale, maximum 15 instrumente (doar mostre de 8 biți, plus posibilitatea unei bucle simple în un eșantion), un set slab de efecte. Mai târziu, a apărut o modificare MOD cu capacitatea de a folosi 31 de instrumente și 8 canale.

S3M extinde oarecum capacitățile MOD - în special, puteți utiliza până la 32 de canale și un număr crescut de efecte. Dar formatul eșantionului este încă limitat la 8 biți.

XM și IT oferă posibilități mult mai mari de creativitate și o calitate semnificativ mai mare a sunetului. Un număr mare de canale (în funcție de editor și suport din partea playerului), un număr mare de efecte, mostre pe 16 biți (pot fi redate fie direct, fie într-o buclă bidirecțională), 64 de instrumente. Instrumentele din XM/IT nu sunt sinonime cu un eșantion - este o descriere a probelor de utilizat pentru anumite game de note ale instrumentului (așa-numitele straturi, acest lucru este necesar pentru a îmbunătăți calitatea simulării instrumentelor vii) , volumul și plicul panoramic și alți parametri.

Redarea MOD/S3M necesită puțin mai puține resurse CPU decât redarea XM/IT mai complexă. Sarcina CPU depinde și de numărul de canale din modul și de algoritmul de interpolare utilizat în timpul mixării (calitatea sunetului depinde foarte mult de calitatea interpolării).

Fișierele muzicale tracker pot varia de la sute de octeți la câțiva megaocteți. Dimensiunea fișierului depinde direct de numărul și calitatea mostrelor utilizate. În medie, un modul care sună mai mult sau mai puțin decent (de orice durată) necesită 200-500 de kiloocteți.

Pentru a reduce volumul ocupat de muzică în joc, puteți stoca mai multe melodii într-un singur fișier, folosind aceleași mostre de instrument în ele. Capacitățile trackerelor vă permit să organizați mai multe fragmente în buclă într-o compoziție, în joc puteți reda o astfel de piesă, pornind din diferite poziții din cadrul acesteia;

Există modificări ale formatelor standard de urmărire folosind compresia mostrelor folosind OGG/MP3. Acestea sunt formatele MO3 (combină formatele IT/XM/S3M/MTM/MOD) și OXM (XM standard, dar folosind OGG pentru ambalarea mostrelor). Ambele formate folosesc compresia numai pentru acele mostre pentru care oferă un avantaj de dimensiune. Comprimarea probelor duce la o reducere semnificativă a spațiului ocupat pe disc cu o scădere aproape imperceptibilă a calității. Eșantioanele sunt stocate comprimate doar într-un fișier atunci când modulul este încărcat, ele sunt extinse în memorie, astfel încât redarea unor astfel de module în sine nu crește sarcina CPU, dar modulul în timpul redării va ocupa aceeași cantitate de RAM ca și un unul despachetat. Utilizarea compresiei probei poate fie să reducă pur și simplu dimensiunea fișierului, fie să îmbunătățească calitatea sunetului fără a modifica dimensiunea (datorită utilizării mostrelor de calitate superioară). Este posibil ca această tehnologie să nu fie potrivită pentru utilizarea pe platforme cu putere redusă - decodificarea (încărcarea) probelor poate dura prea mult.

Pro:

  • Poate oferi un raport dimensiune/calitate mai bun atunci când dimensiunea fișierului muzical este foarte limitată (100-500 kb)
  • Creșterea duratei unei compoziții crește foarte puțin dimensiunea fișierului
Minusuri:
  • Formatele de urmărire nu sunt la fel de flexibile precum streaming audio
  • Modulul care este redat ocupă RAM (relevant pentru sistemele cu o cantitate limitată de RAM, de exemplu, unele PDA-uri)
  • O abordare destul de nestandardă a scrierii muzicii, diferită de notația muzicală convențională, aceasta face dificilă pentru muzicienii „obișnuiți” să stăpânească tracker-urile

Ce sa aleg?

Familiarizându-ne cu specificul diferitelor formate muzicale, putem trece în sfârșit la problema reală a alegerii celui mai potrivit în cadrul unui anumit proiect. În primul rând, trebuie să determinați criteriile de selecție: ce capacități are platforma pe care rulează jocul dvs., ce limitări tehnice există. În special, volumul de muzică ocupat pe media și, la redare, RAM este critic? Încărcarea procesorului este critică? Există capabilități hardware pentru redarea muzicii (decodor MP3, sintetizator MIDI).

Este rezonabil să folosiți streaming audio atunci când nu există restricții stricte privind spațiul ocupat pe suport și există suficientă putere CPU pentru decodare (sau există un decodor hardware). De asemenea, dacă aveți nevoie să creați muzică de foarte înaltă calitate (exemple: posturi de radio din seria de jocuri GTA; muzică înregistrată live), pur și simplu nu mai sunt alte opțiuni decât streaming audio. Marele avantaj al acestui format este că nu există probleme cu abilitățile (sau lipsa acestora) de a folosi diverse echipamente și programe ale muzicienilor tăi - aceștia pot folosi liber acele instrumente care sunt cele mai convenabile pentru ei, deoarece rezultatul poate fi întotdeauna înregistrat într-un fișier audio.

Dacă există restricții stricte privind cantitatea de memorie ocupată, este mai bine să ne gândim la formatele muzicale - MIDI sau muzică tracker. Trebuie să alegeți între aceste două direcții pe baza capacității de a reda formate pe platforma țintă (MIDI pe Palm sau GBA, să zicem, nu puteți reda mult) și a limitărilor de dimensiunea fișierului. Capacitățile muzicienilor tăi joacă, de asemenea, un rol important (deoarece crearea muzicii de înaltă calitate în aceste formate necesită anumite abilități).

În zilele noastre este popular să se folosească, în condiții de limitare severă a cantității de memorie de pe medii (de obicei jocuri shareware pe un computer) alocate pentru muzică, fragmente de un-două minute de streaming audio (de obicei OGG) la o calitate foarte scăzută (de la 56 kbps și mai jos, la 22050hz mono - aceasta este aproximativ 500-600 kilobytes). În astfel de cazuri, merită să vă gândiți la posibilitatea de a utiliza formate de urmărire - în acest caz, puterea procesorului este suficientă pentru redare, dar cu aceeași dimensiune sau mai mică a fișierului puteți obține o calitate semnificativ mai mare, un sunet mai clar (posibil mai puțin viu - dar aici totul depinde de calificările muzicianului).

Dacă proiectul este pe un PC, iar spațiul pentru muzică este foarte limitat (să zicem, 500 de kiloocteți pentru întreaga compoziție muzicală), te poți gândi să folosești fișiere MIDI în loc de streaming audio și module de urmărire. Problema diferitelor sunete la utilizarea diferitelor bănci de sunet poate fi rezolvată prin utilizarea sintetizatorului MIDI software DirectX - Microsoft Software GS MIDI Synthezer. Folosește banca GS de trei megaocteți care vine cu DirectX și, dacă scrieți o pistă MIDI special pentru acest sintetizator, puteți obține un sunet foarte decent cu un consum minim de memorie pentru design muzical (500 de kiloocteți pot încăpea cu ușurință o duzină de 5 dezambalați). -Fișiere MIDI de 10 minute). De asemenea, puteți utiliza propriul sintetizator MIDI software sau propria bancă DLS - în acest caz veți obține toate beneficiile lucrului cu muzica prin MIDI și capacitatea de a folosi propriile timbre, caracteristice formatelor de tracker.

Pe PDA-uri și consolele de jocuri portabile, cel mai potrivit format acum este muzica tracker (formatul specific este selectat în funcție de puterea procesorului) - volumul media, spre deosebire de puterea procesoarelor, nu a crescut încă până la posibilitatea de a utiliza în mod liber streaming audio în jocuri.

În concluzie, vreau să spun că alegerea formatului de muzică nu ar trebui să fie limitată de capacitățile de implementare software ale playerului. Există un număr mare de biblioteci gata făcute (atât plătite, cât și gratuite) pentru a reda toate formatele enumerate pentru toate platformele pe care acest lucru poate fi implementat în hardware.

Cultura modificării jocului datează din cele mai vechi timpuri. Cel mai vechi pe care mi-l amintesc este Wolfenstein 3D (1992). Dacă nu mă înșel, ați putea să vă desenați propriile hărți și apoi noi inamici, să înlocuiți texturi și sunete. Principalul obstacol în modding este analizarea formatelor de date necunoscute. Să lăsăm aspectele morale ale acestui fenomen pentru alte resurse și să ne concentrăm asupra dificultăților tehnice care pot apărea în această problemă dificilă.

Am acumulat destul de multe povești de acest gen, de la cele mai simple, precum analizarea unei arhive simple în care sunt stocate multe mii de fișiere de joc într-un singur fișier, până la înlocuirea modelelor 3D, cercetarea și scrierea de codecuri de sunet non-standard. Vă spun una dintre ele, de complexitate medie.

Să presupunem că aveți dorința de a înlocui anumite fraze în joc sau chiar încercați să acționați vocal complet într-o limbă pentru care dezvoltatorii nu au suficientă putere sau resurse. S-ar părea că trebuie doar să înregistrați sunetul, să găsiți unde se află în joc și să înlocuiți fișierele necesare. Dar acest lucru nu este întotdeauna ușor, de exemplu, cele mai recente jocuri din seria Batman: Arkham folosesc motorul de sunet wwise, care a fost integrat în Unreal Engine de ceva timp.

Am întâlnit UE de mai multe ori, dar după cum știți, dezvoltatorii comerciali au capacitatea de a schimba complet orice parte a codului motorului, așa că aproape toate jocurile se dovedesc a fi unice în ceea ce privește structurile de date, iar acest lucru este întotdeauna interesant. a explora.

Mai întâi, să ne uităm la fișierele de sunet. Ca de obicei, acestea sunt localizate în folderul audio și colectate într-un singur pachet mare, cu o extensie neașteptată.WAD (bună ziua DOOM). Dacă doriți, puteți chiar să extrageți toate sunetele din acesta, dar vor fi câteva mii de fișiere fără nume, iar găsirea a ceva printre ele va fi foarte problematică, cu excepția cazului în care le ascultați „manual” pe toate. Trebuie să spun că de cele mai multe ori este mai simplu. Dezvoltatorii, pentru confortul lor, lasă undeva un fișier cu o listă de fraze. Dar acesta nu este cazul.

Este logic să presupunem că, deoarece jocul în sine găsește cumva sunetele și subtitrările necesare pentru ele, înseamnă că aceste informații sunt conținute în fișiere undeva, trebuie doar să le găsiți. Textele nu se găsesc nicăieri în folderele de localizare, ceea ce înseamnă că sunt împrăștiate pe nivelurile individuale ale jocului, așa cum se întâmplă adesea. Să luăm ca exemplu unul dintre fișierele .upk cu un nume similar nivelului și să-l despachetăm. Din fericire, există instrumente pentru aceasta, chiar și cu codul sursă.

În interior, sunt descoperite rapid fișiere de tip .RDialogueEvent, în care textele frazelor în 11 limbi sunt vizibile cu ochiul liber.

Numele fișierelor sunt similare cu numele sunetelor originale. Grozav, acum nu mai rămâne decât să găsim o potrivire între ele și fișierele de sunet. Aici încep problemele. Desigur, există identificatori în pachetul de sunet. Acesta este un hash de 30 de biți care este întotdeauna folosit în wwise pentru sunete, dar, din păcate, acestea nu pot fi găsite nicăieri printre fișierele de dialog. Peste tot sunt doar numere de neînțeles, nu există nimic asemănător cu un ID de sunet, ar fi imediat vizibile. Pe de altă parte, acest lucru este de înțeles, deoarece motorul nu este atât de simplu și nu puteți pur și simplu să luați și să redați un fișier de sunet în joc. Este continut in banca audio, are multe proprietati care impun diverse efecte etc.

Și apoi se dovedește că în fiecare folder cu dialog există un fișier.akbank - se pare că aceasta este banca audio wwise.

Are o mulțime de identificatori în interior și, după ce le-am încercat la întâmplare, constatăm că unul dintre ei (evidențiat cu verde) se află în pachetul de sunet. Dacă extragem date de acolo folosind acest identificator, vom obține un anumit segment de mai multe sunete lipite împreună. Să convertim aceste sunete din formatul wwise intern în ogg obișnuit. Da, într-adevăr, într-una dintre ele, Batman spune: „Nu am timp pentru asta”, iar într-un alt fișier îi răspund, iar frazele corespund exact textelor acestui dialog.

Nu e rău deja! În principiu, ne-am fi putut opri aici: toate dialogurile sunt aranjate în foldere, pentru fiecare dintre ele există o bancă cu link către segmentul audio. Desigur, nu știm unde este fiecare fișier, dar putem tăia un segment în părți, putem asculta și plasa mai multe fraze în locurile lor (și de obicei sunt doar 3-4 în dialoguri) manual.

Dar nu căutăm căi ușoare. Înțelege-l până la sfârșit. Să verificăm, pentru orice eventualitate, ce se întâmplă dacă sunetele vin în ordine? Bineînțeles că nu, sunt confuzi. Orice s-ar spune, undeva trebuie să existe informații despre legătura dintre sunetele din segment și textul dialogului. Am petrecut destul de mult timp săpat prin diverse fișiere, sperând să descopăr ceva, dar totul a fost inutil. Amenda. Deoarece acesta este cazul, să despachetăm toate pachetele de joc. Sunt câțiva gigaocteți, ei bine, nimic, prima dată sau ce? Dar o căutare completă a tuturor datelor jocului nu a găsit nimic. Singurul loc unde există identificatori de sunet este banca audio. Se pare că legătura trece doar prin el. Nu poți face nimic, va trebui să te urci înăuntru și să-ți dai seama cum funcționează.

Acum, pentru a fi sigur, haideți să găsim niște dialoguri în joc pe care le puteți verifica rapid. După o introducere spectaculoasă cu o reporteră fermecătoare și un spectacol cu ​​măști, Batman este capturat de Hugo Strange. El spune câteva fraze care încep cu „Simt că ar trebui să-ți mulțumesc”, apoi pleacă și jocul începe. Aici are loc prima salvare. Acest moment este potrivit pentru noi.

Să găsim fraza răufăcătorului în dosare. Se termină în pachetul OW_E8_Ch1z_Anim. Deci nu vei ghici imediat. Există un singur dialog în interior, care conține întregul început al jocului. Sunt 24 de fraze grozave, dar poate că este un lucru bun într-un amestec de coduri, este mai ușor să găsești numărul 24 decât 1 sau 2. Deci, urma să studiem conținutul .akBank;

Formatul băncilor wwise a fost deja parțial explorat. Să sperăm că aceste informații sunt suficiente pentru scopul nostru. Judecând după începutul fișierului .akbank, acesta conține 5 bănci audio pentru 5 limbi, prima este banca INT (engleză) - ne vom uita la el.

În primul rând, există un tabel de neînțeles după antetul VKRK, apoi destul de multe zerouri (acest lucru poate fi văzut în imaginea anterioară), apoi segmentul BKHD și apoi segmentul HIRC, care, aparent, conține o descriere a întregului sunet. obiecte. În acest caz, avem 79 dintre ele (0x4F este evidențiat în verde). După cum se arată în descriere, obiectele din segment merg unul după altul, pentru fiecare este indicat tipul (1 octet), apoi lungimea de 32 de biți și ID-ul. Lungimea și conținutul unui obiect diferă în funcție de tip.

Obiectele de tip 2 sunt sunetele reale. Tipul este evidențiat cu roșu, lungime - galben. Fiecare dintre ele indică ID-ul obiectului în sine (verde) și ID-ul fișierului de sunet (violet) în care este conținut. Mai jos puteți vedea începutul următorului obiect de același tip.

Obiectele 3 - acțiuni sonore, se pare că fiecare dintre ele este „reda un sunet”, cu niște parametri necunoscuți, dar fiecare dintre ele are propriul ID (gri) și ID-ul sunetului care trebuie să fie redat efectiv (verde). ).

Obiecte 4 - evenimente sonore. Intrări foarte scurte care conțin doar ID-ul evenimentului (albastru) și indică, de asemenea, că conține o singură acțiune și ID-ul acestei acțiuni (gri).

Ei bine, se pare că avem 24 de lanțuri de evenimente ca acesta:

Eveniment -> acțiune -> sunet

Acestea sunt legate prin identificatori și ajung la linkuri către fișiere de sunet. Cum să găsiți fișierele necesare? După ce am căutat aceste coduri, le găsim exact în același tabel de la începutul băncii. Se pare că acesta este un tabel care înregistrează unde sunt situate sunetele individuale într-un segment de sunet. Și într-adevăr, conține exact 24 de elemente, iar pentru fiecare fișier sunt indicate același ID pe care l-am avut în obiectul sonor, offset-ul față de început și lungimea. Felicitări! Acum avem o conexiune complet urmăribilă de la evenimente audio din bănci la fișiere de sunet individuale:

Adică, ca intrare avem ID-urile mai multor evenimente, câte unul pentru fiecare frază de dialog, iar pentru fiecare dintre ele putem găsi un fișier de sunet. Dar cum le putem conecta acum cu dialogul în sine?

Să încercăm să căutăm acești identificatori undeva. Din nou, nu sunt în fișierele de dialog. Există, de asemenea, câteva fișiere .akevent foarte scurte în folder - sunt și 24 dintre ele. Evident, acestea sunt fișiere de evenimente audio. Sunt niște numere mici înăuntru, la fel pentru toată lumea, nu sunt de folos. Singurul lucru care este diferit acolo este id-ul evenimentelor audio pe care le-am găsit în bancă.

Un alt punct mort: există identificatori pentru toate evenimentele, dar nu există nicio legătură între acestea și textul dialogului! Pentru orice eventualitate, haideți să facem un test: schimbați ID-ul în fișierul necesar și lansați jocul. Da, într-adevăr, Hugo deschide gura, dar nu spune nimic. Aceasta înseamnă că acestea sunt exact datele prin care jocul găsește sunetul dorit. În același timp, observăm că subtitrarea este încă afișată. Aceasta înseamnă că textele dialogurilor în cazul nostru sunt primare, iar sunetul provine deja din ele.

Și apoi îmi amintesc că motorul UE3 are obiceiul de a se referi la obiectele pachetului prin numărul lor de secvență din pachet, adică exact cum sunt ambalate în el. Să ne uităm la fișierul de export care este generat atunci când despachetăm pachetele:

Numerele de aici sunt zecimale și încep de la zero, dar în joc încep de la 1, așa că se dovedește că fișierele de evenimente din export sunt numerotate 0x35-0x4C. Să vedem dacă sunt undeva printre dialoguri. Începem să căutăm - și wow, chiar la începutul dosarului există acest număr!

Iată ultima verigă lipsă. În același timp, găsim 0x2C în apropiere - acesta este numărul fișierului bancar. Dacă dintr-o dată există mai multe dialoguri într-un folder, ele pot fi de asemenea distinse. Acum știm pe deplin cum să găsim sunetul corespunzător din textul dialogului.

Aceasta s-a dovedit a fi o schemă de interacțiune destul de complexă. Se pare că dezvoltatorii au decis să nu le pese de comoditate și pur și simplu s-au bazat pe mecanismele interne ale motorului, ceea ce a dus la acest rezultat în acest caz. Și cazurile, așa cum am spus deja, sunt foarte diferite. Structura fișierelor și conexiunile dintre ele pot fi complet diferite. Aici aveam un link către sunetul din textul dialogului. Dar se întâmplă invers, sunetul primar este sunetul, iar textul se află lângă el prin identificator. Sau evenimentul de scenariu al jocului este principal și de la acesta există link-uri atât către sunet, cât și către text. Se întâmplă ca fișierele să fie localizate nu după nume, ci după hash. Dar, în orice caz, cumva sunt toate conectate, tot ce rămâne este să găsim această legătură.

Ca o atingere finală, să încercăm să ne verificăm rezultatele. Să găsim fișierul de dialog exact din expresia „Simt că ar trebui să vă mulțumesc” de care avem nevoie și să înlocuim 4B cu 4C în el. Începem jocul, iar prietenul nostru Hugo, în loc de această frază, spune cu sens: „Va fi moștenirea mea, un monument al eșecului tău și dacă încerci să mă oprești, garantez că toată lumea îți va ști secretul.”

Să-l lăsăm pe Batman la asta, studiul poate fi considerat finalizat. În formă scrisă, procesul pare rapid, dar în realitate, fiecare etapă poate fi însoțită de o lungă contemplare a cifrelor hexazecimale, fără nicio speranță că la un moment dat vor forma lanțuri semnificative și vei înțelege ce înseamnă. Dar uneori asta se mai întâmplă.

site-ul vă prezintă al doilea material din seria noastră dedicat sunetului în jocurile moderne. De data aceasta vom arunca o privire mai atentă asupra profesiei de designer de sunet și a procesului de creare a unui mediu sonor.

Profesie de designer de sunet

Jocurile moderne conțin mii de sunete. Unele dintre ele sunt aproape de neobservat, altele par a fi ceva de la sine înțeles, altele uimesc imaginația și ne fac să credem în ceea ce se întâmplă pe ecran. În spatele tuturor acestor lucruri se află un designer de sunet - un specialist în designul de sunet și zgomot al unui joc video.

Profesia de designer de sunet a venit în industria jocurilor de noroc din lumea cinematografiei. În 1979, regizorul Francis Ford Coppola l-a numit pentru prima dată pe Watler Murch în acest fel pentru realizările sale remarcabile în filmarea dramei de război Apocalypse Now. Din punct de vedere ideologic, rădăcinile designului sonor se întorc în vremuri mult mai străvechi: efectele sonore de scenă erau folosite în teatrul antic.

Sarcinile unui designer de sunet de joc sunt multiple: includ menținerea mecanicii de joc, crearea atmosferei și imaginii emoționale, furnizarea de informații și crearea de feedback. În ciuda faptului că am împrumutat tehnologii cheie, designul sunetului jocului este foarte diferit de designul sunetului cinematografic. Filmul este liniar și nu interactiv. Piesa audio pentru aceasta se formează o dată și nu se schimbă cu fiecare nouă vizionare. În jocuri, totul este complet diferit: sunetul este colectat din mers în funcție de acțiunile jucătorului, iar aceleași sunete pot fi repetate de mai multe ori, redate în buclă și redate în medii acustice diferite. Prin urmare, designerii de sunet pentru jocuri trebuie să monitorizeze în mod constant compatibilitatea sunetelor între ele și să ia în considerare toate opțiunile posibile pentru reproducerea lor.

Proces

Lucrul la sunet începe cu scrierea unei explicații - un plan detaliat care acoperă toate aspectele posibile ale punctajului unui joc viitor. Acest document poate avea câteva zeci de pagini și servește drept ghid pentru întreaga echipă audio. Explicația conține o descriere a sunetelor jocului, informații despre natura lor, formatele audio, tehnologiile prioritare, caracteristicile platformei și ale motorului.

Apoi urmează prima etapă practică a muncii designerilor de sunet - înregistrarea sunetelor și zgomotelor individuale. Unele dintre ele pot fi înregistrate într-un studio, altele necesită o echipă audio pentru a merge pe teren.

Mențiune specială merită tehnica de scoring Foley - una dintre numeroasele moșteniri ale industriei cinematografice. În audio pentru jocuri, esența sa se rezumă la simularea unor sunete în detrimentul altora care sunt mai ușor de obținut. Luptele, de exemplu, s-au sunat istoric prin lovirea cu pumnul într-un pepene verde sau într-o bucată de carne și prin zdrobirea oaselor prin ruperea unui morcov sau zdrobirea unei pahar de plastic. Metoda de obținere a sunetului depinde în întregime de imaginația designerului de sunet. Unii oameni înregistrează sunetul menționat mai sus de scărșăminte de oase în timp ce bat o carcasă de pui cu un ciocan.

Următoarea etapă este modelarea sunetelor unice. Cum sună focul unui pistol cu ​​plasmă? Ce aude un personaj atunci când este cufundat într-o sursă de energie magică? Ce voce va avea creatura extraterestră cu șase picioare? Jocurile video sunt literalmente pline de obiecte care nu au analogi în lumea reală. Fiecare dintre ele trebuie să sune autentic și unic, ceea ce înseamnă că o simplă înregistrare a sunetului nu mai este suficientă. Sunetele realiste vor trebui accelerate și încetinite, „desfășurate” înapoi, combinate în mod repetat între ele, combinate cu timbre sintetizate și procesate cu lanțuri complexe de efecte. Numai imaginația nu este suficientă aici - va trebui să folosiți observația naturală. Trebuie să vă imaginați din ce elemente poate consta acest sau acel sunet, ce parte a obiectului îl poate produce și ce impresie trebuie să fie transmisă jucătorului prin acest sunet.

Astfel, abordarea unui robot umanoid uriaș va consta în scârțâituri de servo, zgomot metalic și bătăi puternice, scuturând toate obiectele din jur.

Nu toate sunetele trebuie înregistrate - adesea nu există suficient timp și buget pentru asta. Numeroase biblioteci cu o cantitate colosală de material audio vin în ajutorul unui designer de sunet. Utilizarea sunetelor „de bibliotecă” în forma lor pură într-un mediu profesional este considerată o formă proastă. Prin urmare, majoritatea designerilor de sunet se străduiesc să le facă unice, amestecându-le între ele și aplicând diferite tratamente.

Urmează etapa de integrare a sunetelor în codul de program al jocului - un proces care poate dura până la 70% din timpul de lucru al unui designer de sunet. În această etapă, sunetele sunt atribuite obiectelor de joc și sunt stabilite regulile pentru reproducerea și interacțiunea acestora.

De exemplu, avem un obiect de joc „mașină” care poate exploda. În ce caz va fi reprodus sunetul exploziei sale? Cât de departe se va auzi? Cât de important este pentru jucător? Cât de des vor exploda mașinile în joc? Va îneca discursul personajelor din joc? Va fi mai tare decât sunetele de focuri de armă și cum se va potrivi cu ele?

Aceasta este doar o mică parte din problemele care pot fi rezolvate în timpul integrării unui sunet din mii. În trecutul recent, situația a fost complicată și mai mult de faptul că pentru a înlocui fiecare sunet din joc a fost necesar să apelezi la programatori. Instrumentele moderne precum Audiokinetic Wwise și FMOD Designer rezolvă această problemă, permițând compozitorilor și designerilor de sunet să încorporeze în mod independent orice fișiere audio și să automatizeze procesarea acestora.

Cuvânt de la experți

Peter Comley este designer de sunet la Microsoft Studios. De-a lungul anilor de muncă la companie, a participat la multe proiecte AAA, inclusiv serialele Fable, Gears of War și Halo.

„Sunt adesea întrebat ce face un designer de sunet în industria jocurilor de noroc. Să încercăm să ne imaginăm o jucărie ieftină pentru copii care scoate un sunet atunci când apăsăm un buton. Sunetul se poate schimba în funcție de forța de apăsare, dar, în general, acest lucru nu poate face nimic altceva. Sarcina designerului de sunet este să folosească toate instrumentele disponibile (abilitățile de sunet, designul butoanelor, sistemul de operare al jucăriilor, specificul difuzorului și chiar designul de producție) astfel încât utilizatorul să dorească să se joace cât mai mult posibil. Ești ca un designer de jocuri, dar tot ce ai la dispoziție este sunetul. Mai mult, trebuie să faceți jocul nu numai interesant, ci și captivant. Nu știu dacă acest lucru este bun sau rău, dar „dependența” este cea mai mare laudă pe care o poate primi orice joc.


Acesta, desigur, nu este cel mai realist exemplu: astfel de jocuri simple probabil nu există. Dar esența muncii unui designer de sunet rămâne aceeași. Luați această situație, înmulțiți-i complexitatea cu un trilion de ori, adăugați tot felul de ornamente și imaginați-vă că sarcinile sunt în continuă schimbare. Acum ai o idee aproximativă despre cum este să faci design de sunet pentru un joc video modern major.”

Sam Cooper este designerul principal de sunet la Creative Assembly. A lucrat la audio, care a câștigat un premiu BAFTA pentru realizare în Game Audio. În plus, Sam a participat la dublarea mai multor jocuri din seria Total War.

„Uneori, tonul unui eveniment de joc este stabilit cu un sunet simplu de interfață de jumătate de secundă. Sau poți influența subconștient jucătorul cu zgomote atmosferice din mediu. Noi, designerii de sunet de jocuri, ne întrebăm mereu: „Ce ar trebui să simtă jucătorul în acest moment?”, „Cum putem susține aceste emoții?”.

La Creative Assembly, preferăm să înregistrăm noi înșine toate sunetele posibile. Este întotdeauna interesant – indiferent dacă lucrăm în teren sau în studio. Lucrul meu preferat este să înregistrez explozii și sunete de distrugere: este foarte incitant. Poate fi distractiv și în studio. De exemplu, când am înregistrat sunetele de dezmembrare pentru Alien: Isolation, aveam un set de microfoane și o grămadă de tot felul de fructe și legume. Ne-am petrecut toată ziua distrugându-le, scoțând tot felul de sunete dezgustătoare - atunci ne-am murdarit foarte tare.


Designul sunetului jocului este diferit de alte domenii ale industriei audio prin faptul că trebuie să ne gândim constant la interactivitate. Acest lucru afectează fiecare aspect al muncii noastre. Nu putem face doar un sunet perfect pentru un moment: sunetul trebuie să răspundă la o serie de evenimente posibile. O explozie, de exemplu, trebuie înregistrată ținând cont de materialele distruse și de dimensiunea încăperii. În același timp, sunt înregistrate mai multe opțiuni pentru fiecare situație, deoarece repetarea aceluiași sunet va obosi jucătorul.”

În articolul următor ne vom uita probabil la cel mai interesant aspect al sunetului jocului pentru mulți - muzica. Urmăriți actualizările de pe site-ul nostru. Puteți găsi prima parte a seriei noastre.

Vom vorbi despre o bibliotecă de software pentru lucrul cu sunetul, cunoscută sub numele de FMOD. Dezvoltatorul acestui produs software este Firelight Technologies Pty, Ltd. La momentul scrierii, cea mai recentă versiune FMOD era versiunea 3.74. Starea actuală și noile versiuni, dacă au apărut, pot fi găsite pe site-ul www.FMOD.org. Pe același site puteți obține versiuni FMOD pentru diverse sisteme de operare. Sunt găsite legături directe către distribuția FMOD

Biblioteca de funcții FMOD este o implementare de nivel superior a API-ului, care include o gamă largă de funcții pentru lucrul cu fișiere audio de diferite formate, procesarea datelor audio și redarea audio prin sistemul audio al unui computer sau console de jocuri. Pentru a vorbi despre toate capabilitățile acestui API, vor fi necesare mai mult de o duzină de pagini web. În plus, subiectul nostru principal este dezvoltarea jocurilor de sunet, pentru care interesul principal este în funcțiile de lucru cu sunet surround (3D). Ne vom limita la introducerea acestor funcții. Trebuie reținut că această publicație nu este un ghid complet al FMOD, prin urmare, atunci când analizați exemplele de mai jos, nu trebuie să neglijați documentația oficială. Toate exemplele din articol sunt scrise în limbajul de programare C.

Pentru a crea surse de sunet 3D și a calcula o imagine tridimensională a sunetului, FMOD (versiunea pentru Windows) folosește oricare dintre următoarele sisteme de sunet ca bază: WMM (Windows Multimedia), DirectSound3D (subsistem de sunet Microsoft DirectX) și A3D. FMOD se interfață cu aceste sisteme de sunet în așa fel încât trecerea de la unul la altul necesită modificări minime ale codului programului (și adesea nicio modificare). Când lucrați cu sistemul de sunet de bază DirectSound3D, funcțiile FMOD fac mult mai ușor controlul surselor de sunet surround, simplificând inițializarea, redarea și poziționarea acestora. Ușurința de programare FMOD (comparativ cu programarea sistemelor de sunet de bază) este un avantaj important al acestui API (puteți citi despre programarea DirectSound3D direct în articolul Programarea sunetului surround în DirectSound3D).

Un alt avantaj al FMOD este ușurința instalării - este suficient să plasați biblioteca dll în folderul de sistem sau în folderul din care este lansată aplicația pentru ca funcțiile FMOD să devină disponibile. În versiunea 3.74, pe lângă dll-ul obișnuit pe 32 de biți pentru Windows, este furnizată o bibliotecă FMOD pe 64 de biți.

FMOD conține documentație detaliată și exemple (împreună cu antet și alte fișiere utilitare) pentru VisualC, BorlandC, Watcom C, Borland Delphi și VisualBasic. Pentru aplicațiile necomerciale, biblioteca FMOD este oferită gratuit.

Dezavantajele FMOD includ lipsa unor astfel de caracteristici (care sunt implementate în DirectSound3D) precum crearea de surse de sunet direcționale și crearea de surse de sunet dependente (cel puțin, setul de funcții FMOD nu include funcții care setează acești parametri pentru audio spațial). prelucrare).

Model spațial în FMOD

Modelul spațial (sistemul de coordonate) utilizat pentru plasarea surselor de sunet 3D este similar cu modelul spațial din DirectSound3D. Aici, este utilizat un sistem de coordonate carteziene stânga, constând din trei axe de coordonate ortogonale. Axa X (x) este îndreptată spre dreapta; Axa Y (Y) este îndreptată în sus; Axa Z (zet) este îndreptată înainte (adică în monitor dacă stați cu fața lui). Distanța este măsurată în metri, dar puteți seta o unitate de lungime diferită setând raportul dintre metru și noua unitate de măsură. Orice punct din spațiu este specificat de coordonatele sale, care sunt scrise în succesiunea X, Y, Z. Coordonatele pot lua atât valori pozitive, cât și negative. Triada de coordonate XYZ, care caracterizează poziția unui punct în spațiu, poate fi considerată ca un vector a cărui origine este la origine, adică într-un punct cu coordonate (0, 0, 0) și un punct final cu coordonate (X, Y, Z). În plus față de vectorii de poziție, FMOD utilizează vectori de viteză pentru a calcula deplasarea Doppler în spectrul de sunet al surselor în mișcare. Vectorul viteză este specificat de trei coordonate ale punctului său final (punctul de pornire al vectorului viteză este considerat a fi punctul (0, 0, 0)). Trebuie remarcat faptul că FMOD (cum ar fi DirectSound3D) nu calculează coordonatele unui obiect în mișcare. Această sarcină trebuie rezolvată de programator, transmițând funcțiilor FMOD datele necesare pentru a simula exclusiv imaginea sonoră într-un anumit punct din spațiu și la un moment dat. Adică, în esență, FMOD (ca DirectSound3D) calculează o imagine sonoră statică, pe care programatorul o poate face dinamică pentru ascultător (player), schimbând adesea poziția surselor de sunet.

În acele funcții FMOD pentru care un vector trebuie să fie transmis ca parametru, se folosește un pointer către o structură formată din trei numere reale (float) sau către o matrice formată din trei numere reale (float). Adică, următoarele două construcții vor fi interpretate în mod egal de funcțiile FMOD:

/* matrice */ float pos = (10.0f, 2.0f, 4.2f); /* structura */ struct VECTOR ( float X; float Y; float Z; ); VECTOR poz = (10.0f, 2.0f, 4.2f);

Modelul spațial din FMOD include alți parametri de mediu care afectează propagarea undelor sonore. Folosind funcțiile FMOD, puteți seta gradul de atenuare a sunetului și severitatea efectului Doppler.

Obiecte peisaj sonor în FMOD

În FMOD, există două tipuri de obiecte în spațiul sonor tridimensional: sursele de sunet și ascultătorii. Spre deosebire de DirectSound3D, FMOD acceptă un model de ascultător multiplu. În toate celelalte privințe, ambele sisteme sunt similare.

Sursele de sunet în FMOD pot fi doar punctuale și nedirecționale, ceea ce înseamnă că sursa nu are dimensiuni proprii și propagarea sunetului din această sursă este omnidirecțională. Poziția de ascultare, dimpotrivă, este orientată. Pentru a face acest lucru, este specificată direcția a doi vectori ortogonali de dimensiunea unității. Primul vector orientează direcția feței, adică indică unde se uită ascultătorul. Al doilea vector este întotdeauna îndreptat în sus din partea de sus a capului, adică indică direcția axei verticale a ascultătorului. Modulul fiecăruia dintre acești vectori este egal cu o unitate de lungime, deci se numesc unități (modulul unui vector este calculat ca rădăcina pătrată a sumei pătratelor lungimilor proiecțiilor sale pe axele de coordonate) .

Funcții pentru lucrul cu sunet 3D

Pentru simplitatea prezentării, mai jos sunt nu numai funcțiile FMOD care sunt direct responsabile pentru crearea sunetului surround, ci și toate acele funcții pe care un programator trebuie să le folosească pentru a lucra cu biblioteca FMOD. Mai mult, în listă funcțiile sunt situate în secvența aproximativă în care ar trebui să fie apelate în programul care interacționează cu FMOD. În documentația care vine cu FMOD, toate funcțiile enumerate mai jos sunt plasate în secțiunea „FSOUND API Reference”.

  • FSOUND_GetVersion() - returnează versiunea bibliotecii FMOD instalată pe computer. Valoarea returnată trebuie comparată cu constanta FMOD_VERSION, care stochează numărul versiunii FMOD pentru care a fost compilat programul.
  • FSOUND_SetOutput () / FSOUND_GetOutput () - selectează/obține sistemul de sunet de bază (Windows Multimedia, DirectSound, A3D etc.). Selectarea sistemului de bază trebuie făcută înainte de a apela funcția FSOUND_Init().
  • FSOUND_SetDriver () / FSOUND_GetDriver () - selectează/obține numărul dispozitivului de ieșire (placă de sunet). Selecția dispozitivului trebuie făcută înainte de a apela funcția FSOUND_Init().
  • FSOUND_SetMixer() /FSOUND_GetMixer() - selectează/obține tipul de mixer digital. Selecția mixerului trebuie făcută înainte de a apela funcția FSOUND_Init(). Determinarea tipului de mixer nu este necesară, deoarece FMOD va determina automat cea mai bună opțiune disponibilă.
  • FSOUND_Init() - inițializează sistemul de sunet FMOD.
  • FSOUND_Sample_Load() - se încarcă în memorie și decodifică un fișier audio (sunt acceptate .wav, .mp2, .mp3, .ogg, .raw etc.).
  • FSOUND_3D_SetDistanceFactor() - vă permite să setați unități de lungime altele decât metrii.
  • FSOUND_3D_SetDopplerFactor() - vă permite să setați offset-ul Doppler. Valoarea de bază (1,0) corespunde vitezei sunetului 340 m/s.
  • FSOUND_3D_SetRolloffFactor () - vă permite să setați nivelul de pierdere a energiei undelor sonore (atenuare). Valoarea de bază (1,0) corespunde condițiilor normale.
  • FSOUND_PlaySoundEx() - redă fișierul de sunet încărcat în memorie prin canalul de sunet.
  • FSOUND_3D_SetAttributes() / FSOUND_3D_GetAttributes() - setează/obține vectorul de poziție și vectorul viteză al sursei de sunet.
  • FSOUND_3D_SetMinMaxDistance() / FSOUND_3D_GetMinMaxDistance() setează/obține distanța de auz minimă și maximă a sursei de sunet. Distanța minimă este o astfel de distanță de la sursa sonoră la ascultător, la scăderea volumului sunetului nu mai crește, ci rămâne la valoarea pe care a atins-o la distanța minimă. Setând diferite distanțe minime, de exemplu, pentru un avion și un bondar, le puteți face la fel de vizibile pentru ureche, în ciuda faptului că zumzetul motorului va fi perceput ca un sunet mai puternic. Distanța maximă este distanța de la sursa sonoră până la ascultător, de la care volumul sunetului nu mai scade, ci rămâne la nivelul la care a ajuns la distanța maximă. Aceasta înseamnă că, indiferent cât de departe este sursa de sunet, aceasta va fi auzită.
  • FSOUND_SetPaused() - Întrerupe/reia redarea audio într-un canal.
  • FSOUND_3D_Listener_SetAttributes () / FSOUND_3D_Listener_GetAttributes () - setează/obține vectorul de poziție, vectorul viteză și vectorii de orientare ai ascultătorului.
  • FSOUND_Update () - actualizați starea mixerului de sunet, adică actualizați starea panoramei sunetului, după care toate schimbările de poziție a ascultătorului sau a surselor de sunet au efecte.
  • FSOUND_Sample_Free() - Eliberează memoria de datele audio încărcate de funcția FSOUND_Sample_Load().
  • FSOUND_Close() - Descarcă sistemul de sunet FMOD.

Această listă este minimul necesar și nu include o serie de funcții care vă permit să obțineți informații suplimentare despre placa de sunet, algoritmi de procesare a sunetului acceptați etc., precum și să controlați unii parametri de redare a sunetului.

Algoritm pentru utilizarea FMOD în programele de joc

Accentul nostru se va concentra pe jocurile care folosesc sunet surround (3D). De regulă, în jocuri există o buclă principală de joc, în cadrul căreia obiectele de joc se mișcă în spațiu. O astfel de mișcare poate fi cauzată de acțiunile jucătorului (de exemplu, într-un simulator de mașină, poate fi rotirea volanului la dreapta sau la stânga) sau o schimbare a situației de joc (de exemplu, într-un joc de acțiune, un monstru se poate apropia) . După calcularea noilor coordonate ale obiectelor, poziția surselor de sunet ar trebui, de asemenea, modificată, astfel încât acestea să corespundă noii poziții a obiectelor în spațiul de joc.

Ciclul jocului, de regulă, este precedat de acea parte a programului în care sunt inițializate variabilele și sunt încărcate bibliotecile și resursele necesare. Când utilizați FMOD, această parte ar trebui să conțină următoarele funcții: FSOUND_SetOutput, FSOUND_SetDriver și FSOUND_SetMixer. Puteți trece -1 (0FFFFFFFFh) ca parametru pentru a determina automat sistemul de sunet de bază la funcția FSOUND_SetOutput.

După inițializarea cu succes a FMOD, este necesar să plasați datele de sunet în memorie în conformitate cu scriptul jocului. Funcția FSOUND_Sample_Load, care este responsabilă pentru acest proces, acceptă mai multe formate de sunet și încărcarea, de exemplu, a unui fișier .mp3, din punctul de vedere al unui programator, nu este diferită de încărcarea unui fișier în format wav. Aici intră în joc avantajele bibliotecii FMOD, permițându-vă să simplificați procedura plictisitoare de creare a bufferelor de sunet și de încărcare a datelor în ele, caracteristică DirectSound. Rezultatul FSOUND_Sample_Load va fi un pointer către o mostră de sunet aflată în memorie. Dacă ne întoarcem la terminologia DirectSound, acesta va fi un analog al unui tampon de sunet secundar. Eșantionul audio specificat poate fi utilizat pentru a crea mai multe surse audio 3D fără a fi nevoie de a crea copii suplimentare ale acestui eșantion.

Acum că datele necesare au fost încărcate, puteți începe să creați o imagine audio tridimensională. Trebuie reținut că schimbarea vectorului de poziție și a vectorului de viteză, precum și a multor alte caracteristici ale sursei de sunet, este posibilă numai direct în timpul redării sunetului de către funcțiile FSOUND_PlaySound și FSOUND_PlaySoundEx, prin urmare, înainte de a plasa sursa de sunet în orice punct din spațiu. , trebuie să începeți să redați acest sunet. Cu toate acestea, la apelarea acestor funcții, sunetul va fi redat în punctul în care se află ascultătorul, ceea ce poate perturba scena jocului (de exemplu, un monstru care ar trebui să se apropie din colțul cel mai îndepărtat mârâie brusc sub urechea jucătorului). Pentru a evita un astfel de incident, funcția FSOUND_PlaySoundEx() oferă un parametru special care întrerupe imediat redarea sunetului. O sursă silențioasă poate fi plasată în locul dorit fără riscul de a perturba scena jocului și de a relua redarea sunetului. Pentru ca modificările în imaginea sonoră să aibă efect, trebuie să apelați funcția FSOUND_Update.

Trebuie spus că în termeni FMOD, redarea audio are loc printr-un canal, așa că orice dorește un programator să facă cu o sursă audio 3D trebuie făcut folosind funcții care funcționează cu canalul. Primul parametru în astfel de funcții este numărul canalului.

Sintaxa pentru apelarea funcției FSOUND_PlaySoundEx este următoarea:

Int F_API FSOUND_PlaySoundEx (canal int, FSOUND_SAMPLE *sptr, FSOUND_DSPUNIT *dspunit, caracter semnat startpaused);

Ca parametri, această funcție primește numărul canalului prin care va fi redat sunetul; un pointer (descriptor sptr) către o probă de sunet aflată în memorie; un pointer (manerul dspunit) către blocul de canal la care ar trebui să se alăture canalul nou creat (acest parametru poate avea valoarea NULL); steag de pauză, care trebuie să fie TRUE pentru a întrerupe imediat redarea audio.

Dacă este necesar să se creeze un nou canal, atunci constanta FSOUND_FREE este trecută în parametrul canalului. Dacă este necesar ca sunetul să fie redat pe toate canalele existente, atunci constanta FSOUND_ALL este transmisă canalului.

Funcția returnează numărul (descriptorul) canalului prin care este redat sunetul. Dacă apare o eroare, funcția returnează -1 (0FFFFFFFFH). Numărul canalului (descriptorul) este necesar pentru a funcționa cu funcțiile stratului de legătură, de exemplu, FSOUND_3D_SetAttributes.

Astfel, crearea și poziționarea unei surse de sunet poate fi implementată programatic astfel:

FSOUND_SAMPLE *samp1 = NULL; int canal1 = -1; /* verificați versiunea FMOD */ if (FSOUND_GetVersion()

Trebuie amintit că funcțiile FSOUND_PlaySound și FSOUND_PlaySoundEx plasează sursa de sunet la poziția curentă a ascultătorului, prin urmare, dacă parametrul de canal al acestor funcții specifică numărul (descriptorul) unui canal existent, atunci, în ciuda faptului că pentru acest canal o altă poziție decât cea de ascultător, sursa de sunet se va muta în continuare în poziția de ascultător. Pentru a evita distorsiunea imaginii sunetului, înainte de a apela FSOUND_PlaySoundEx, este necesar să salvați poziția și viteza sursei de sunet în variabile speciale, obținând aceste valori folosind funcția FSOUND_3D_GetAttributes. Apoi apelați FSOUND_PlaySoundEx pentru a întrerupe redarea; apoi mutați sursa în punctul dorit folosind valorile salvate și abia apoi continuați redarea. Secvența de acțiuni specificată, printre altele, se aplică direct sunetelor odată redate (adică unor astfel de surse care nu emit sunet continuu, ci sună doar atunci când are loc un anumit eveniment în joc).

Pentru a schimba poziția, viteza și orientarea ascultătorului în spațiu, utilizați funcția FSOUND_3D_Listener_SetAttributes. Iată sintaxa acesteia:

Void F_API FSOUND_3D_Listener_SetAttributes(const F_FLOAT_API *pos, const F_FLOAT_API *vel, F_FLOAT_API fx, F_FLOAT_API fy, F_FLOAT_API fz, F_FLOAT_API tx, F_FLOAT_FLOAT_, F_FLOAT_FLOAT_);

Ca parametri, această funcție primește un pointer către o triadă de coordonate de poziție (pos), un pointer către vectorul viteză (vel), componentele X, Y și Z ale unui vector unitar care definește orientarea frontală a capului ascultătorului (fx, fy). , fz); Componentele X, Y și Z ale vectorului unitar care determină orientarea verticală a capului ascultătorului (tx, ty, tz). În ciuda tipului void, funcția, conform documentației oficiale, returnează TRUE dacă execuția sa a avut succes și FALSE în cazul unei erori.

Spre deosebire de DirectSound3D, FMOD poate avea mai mult de un ascultător. Acesta este conceput pentru console de jocuri, unde un dispozitiv de joc poate fi folosit de mai mulți jucători în același timp. Ascultătorul curent este selectat folosind funcția FSOUND_3D_Listener_SetCurrent.

Când jocul este finalizat și în segmentul final al codului programului sunt eliberate resursele ocupate de program, este necesar să se utilizeze funcțiile FSOUND_Sample_Free, la care se trece un pointer (descriptor) al unui fragment de date sonore din memorie ca un parametru și FSOUND_Close, care este apelat fără parametri și descarcă sistemul de sunet FMOD.

FSOUND_Sample_Free(samp1); FSOUND_Close();

Eroare la procesare

Majoritatea funcțiilor FMOD, dacă nu se specifică altfel în documentație, returnează TRUE la succes. Dacă apare o eroare în funcție, este returnat FALSE. Pentru a obține informații suplimentare despre eroare, utilizați funcțiile FSOUND_GetError și FMOD_ErrorString. Ultima funcție este o macrocomandă, așa că trebuie inclus fișierul antet FMOD_errors.h.

Funcția FSOUND_GetError nu necesită parametri și returnează codul de eroare care a apărut la executarea funcției FMOD. Macrocomanda FMOD_ErrorString ia acest cod ca parametru și returnează o descriere text a erorii. Iată un exemplu de apelare a acestor funcții:

/* imprimă un mesaj de eroare în modul consolă */ printf("Eroare: %s\n", FMOD_ErrorString(FSOUND_GetError()));

Gestionarea resurselor și plăci de sunet low-end

Astăzi, există plăci de sunet cu performanțe și capacități diferite. Unele dintre ele sunt capabile să accepte până la 100 de canale hardware pentru redarea sunetului 3D, altele - nu mai mult de patru. Ar fi miop să ne concentrăm asupra plăcilor de sunet „slabe” atunci când dezvoltați jocuri. Cu toate acestea, o eroare care poate apărea atunci când există o lipsă de canale hardware într-un joc cu un număr mare de surse de sunet poate face jocul complet inoperabil pe grupul specificat de plăci de sunet. Ca o cale de ieșire din această situație, FMOD sugerează utilizarea funcției FSOUND_SetMinHardwareChannels.

Această funcție este apelată o dată înainte de a apela FSOUND_Init și setează numărul minim de canale hardware care trebuie să fie suportate de placa de sunet. După aceasta, fie întregul număr de canale specificat la apelarea FSOUND_SetMinHardwareChannels va fi redat folosind canale hardware, fie suportul hardware nu va fi folosit și mixarea canalelor va avea loc în software. Cu alte cuvinte, de exemplu, dacă aveți 16 sunete și cardul are același sau mai multe canale hardware, atunci redarea va trece prin aceste canale. Dacă se dovedește că cardul are doar 4 canale, atunci amestecarea tuturor sunetelor se va face în software.

Sprijin prioritar

FMOD implementează un sistem prioritar. Dacă multe surse audio trebuie redate pe un număr limitat de canale, atunci unele pot fi mai importante decât altele. Dacă, de exemplu, personajul principal din joc este un shooter, atunci reproducerea sunetului unei împușcături ar fi probabil cea mai importantă. Deci, această sursă de sunet (împușcătura) ar trebui să fie setată la cea mai mare prioritate folosind FSOUND_SetPriority. Sunetele mai puțin importante nu vor fi redate dacă toate canalele disponibile sunt deja ocupate.

Concluzie

Materialul prezentat mai sus este necesar pentru a vă familiariza cu capacitățile FMOD în domeniul lucrului cu sunetul surround și pentru a începe să utilizați această bibliotecă în programele dumneavoastră. Dar acest articol nu este suficient pentru a afla despre toate capabilitățile bibliotecii FMOD. Următorul pas ar putea fi studierea exemplelor incluse în pachetul de distribuție FMOD.