Pagina 1 din 1

Producerea sunetului 3D in programare

Scris: 20 Feb 2014, 00:24
de Vortex
De cand am ascultat clipul asta:
https://www.youtube.com/watch?v=IUDTlvagjJA
Mi-am dorit o biblioteca software care sa faca 3d audio prin casti, adica sa poata pozitiona un sunet in toate cele trei dimensiuni, folosind doar castile.
In sfarsit a aparut un wrapper pentru o biblioteca mai complicata (OpenalSoft) care face asta:
http://camlorn.net/posts/camlorn_audio-01.html
Am instalat-o, am scris un mic program de test si pare sa mearga. Sunetul se aude la stanga, la dreapta, in spate, mai sus, mai jos. Am inca ceva probleme sa-l fac sa se auda in fata. Pun mai jos codul de test pe care l-am folosit. E in python, pentru ca biblioteca vine cu bindings de python. Pentru un simplu test n-am mai stat sa fac binding-uri pentru limbajul preferat de mine. Interfata nu e cea mai eficienta si poate nici codul optim, a fost scris pentru verificarea viabilitatii bibliotecii:
import camlorn_audio

import time

camlorn_audio.init_camlorn_audio()
s=camlorn_audio.Sound3D(filename=r"a.wav")
s.set_looping(True)
print(camlorn_audio.default_hrtf_location)
x=0
y=0
z=0
while True:
p=raw_input("enter position")
if p=="d":
x=x+1
elif p=="a":
x=x-1
elif p=="w":
z=z-1
elif p=="s":
z=z+1;
elif p=="r":
y=y+1
elif p=="q":
y=y-1
s.set_position(x,y,z)
s.play()
print(x,y,z)
time.sleep(0.11)

Cum ziceam, n-am reusit sa fac sunetul sa se auda in fata. Citind mai multe informatii despre tehnologia folosita de biblioteca (HRTF) am aflat ca sunt parametri specifici pentru fiecare persoana. Exista pe internet liste cu parametri pentru diverse persoane, eu am incercat sa introduc cateva, dar n-am avut rezultate satisfacatoare. Link-ul pe care l-am folosit este:
http://www.reddit.com/r/oculus/comments/1fzonq/ .
O sa mai incerc si altele. Aplicatiile bibliotecii ar putea fi in primul rand in jocuri audio, apoi in diverse aplicatii de "auditory display".
Cea mai recenta aplicatie este un add-on de NVDA care transmite prin 3d audio pozitia controlului focusat:
http://camlorn.net/posts/a-development- ... poken.html

Scris: 21 Feb 2014, 01:14
de Manu
Da, am ascultat clipul ala si... e tare, m-a dat gata când mi-a pus punga pe cap... :)
O biblioteca din asta tot asteptam si noi pentru BGT.
Bine ca ai postat-o, poate o sa incerc si eu ceva, sa vedem daca pot interactiona cumva cu ea.

Scris: 21 Feb 2014, 09:12
de GruiaVelicu
Foarte tare.

Scris: 21 Feb 2014, 23:37
de Vortex
@Manu: Tipul a publicat biblioteca pe Audiogames si a zis ca nu o sa faca personal bindings pentru bgt, le poate face cine are nevoie. De aici deduc ca sunt realizabile. Explica el in documentatie cum sunt facute functiile C din dll.

Scris: 22 Feb 2014, 18:43
de IonPop
@Vortex: Este intr-adevar o biblioteca care ar fi foarte utila in dezvoltarea de jocuri pentru orbi, fara sa fie nevoie ca programul sa creeze intr-un mod foarte complicat sunet surround, si fara sa fie nevoie de un sistem de boxe surround.

Am testat si programul facut de tine, desi a fost un pic de bataie de cap fiindca codul luat cu copy/paste din pagina web a pierdut indentarea, asa ca nu a functionat din prima.

Nu am avut timp sa ma uit prin documentatie, dar m-am uitat putin in modulele de Python pe care le instaleaza.
Acel binding de Python nu este unul super profesionist, fiindca nu se ofera codul sursa in C/C++ ca sa poata fi apoi compilat automat pe orice sistem de operare, ci doar se ofera fisierele .dll pentru Windows care apoi sunt apelate in modulele Python.
Este mai simplu asa, dar din fericire este mai simplu si de vazut cum apeleaza modulele Python functiile din fisierele .dll.

Daca cineva este interesat sa foloseasca acele biblioteci in alte limbaje, cred ca
cel mai usor este sa studieze modulele de Python instalate in directorul in care este instalat Python
lib/site-packages/camlorn_audio.
si sa acceseze la fel bibliotecile dll.

Este cam dificil sa diferentiezi un sunet care vine exact din fata de un sunet care vine exact din spate, asta in general, nu doar pe computer.

In viata de toate zilele noi ne miscam incontinuu, asa ca sunetul ramane foarte putin timp exact din spate sau exact din fata, fiindca daca miscam capul putin spre stanga sau spre dreapta, in mod automat una dintre urechi ajunge mai aproape de sunet iar alta mai departe, si deci ne putem da imediat seama daca sunetul este din fata sau din spate.
La fel este si daca folosim un sistem de boxe surround, dar daca folosim doar casti stereo atunci degeaba miscam capul fiindca vom auzi tot acelasi lucru.

Mai are un rol important si cunostintele noastre si ideile preconcepute pe care le avem. De exemplu, in cazul acelui clip cand auzeam foarfecile sau aparatul de tuns bazaind pe langa cap, sau ni-l imaginam pe frizer, in mod absolut sigur ca ni-l imaginam ca stand in spatele nostru.
Iar cand frizerul s-a rotit la un moment dat incet prin spatele nostru intr-un ritm constant, am putut oarecum banui ca si-a continuat drumul si a facut un cerc in jurul nostru, dar altfel nu este foarte clar daca el chiar pare ca a ajuns si in fata sau a facut doar semicercuri in spate.
Asa ca acea problema cu pozitionarea sunetului fata-spate este o problema mai complicata.

Scris: 25 Feb 2014, 22:04
de Vortex
@IonPop: Mda, trebuia sa ma gandesc la indentarea din python. Codul sursa nu-i disponibil pentrru ca asta-i un binar, se gaseste pe bbitbucket:
https://bitbucket.org/camlorn/camlorn_audio

Am mai citit si eu despre front-backk diferentiation. M-am gandit la o solutie, sper sa-mi fac timp (si mai ales chef) s-o testez in viitorul apropiat.:)

Scris: 03 Mar 2014, 22:11
de Campus
Salutare
E intr-adevar impresionant clipul cu frizeria desi cateodata nici eu nu localizez sunetele fata-spate. Eu cred ca asta depinde mai ales de pozitionarea laterala a receptorilor auditivi fata de cap in melcusorul acela din ureche, deci e aproape imposibil de simulat cu o simpla casca. Ar fi nevoie de 2 casti pozitionate una mai in fata si una mai in spate pe acceasi parte, cred.
Pana acum eu am folosit bass.dll in jocuri dar nu incercasem inca sa setez sunetul 3d ci il manipulam manual cu balans si volum. De cand am citit topicul asta mi-am propus sa vad ce se poate emula si in bass.dll si am facut un programel, mai mult din joaca, de testare a sunetului 3d cu bass.dll.
Practic programelul reda un sunet si permite manipularea unor parametrii pentru a da impresia de spatialitate. Proggramelul nu are meniuri, are doar scurtaturi de taste si niste elemente simple de interfata.
Scurtaturile de taste sunt:
  • O - incarca un fisier mp3. Fisierele sunt redate in loop si mono. Implicit am pus in exemplu un fisier cu sunetul unui tren cu aburi.
    Spatiu - Redare/Pauza fisier audio
    Sageata sus, sageata jos - mareste, micsoreaza distanta fata - spate
    Sageata stanga, sageata dreapta - mareste, micsoreaza distanta stanga - dreapta
    Page up, Page Down - mareste, micsoreaza distanta sus - jos
    Enter - Reseteaza sunetul la valori implicite.
Bineinteles aveti nevoie de dot net framework 3.5. (este instalat implicit in windows 7)
Puteti descarca programelul aici

Scris: 04 Mar 2014, 02:29
de Manu
Ma intreb care e diferenta intre fata si spate, eu am senzatia ca e tot pe baza de mai tare si mai incet...
Testul ar fi: apasa altcineva sageata fata / spate, se poate deduce in ce directie a fost mutat sunetul?
Cred ca au facut ei ceva functii bazate pe volum, asa incercau si la unele jocuri cu masini, practic trecea masina pe la stanga ascultatorului din fata in spate, avand sunetul putin pozitionat in stanga si dat de la incet mai tare, apoi de la tare iar catre incet.
Probabil ar putea fi creata senzatia de trecere in viteza din fata in spate, facand ca atunci când masina trece pe langa, deci sunetul e la volum maxim, sa se dea tot mai incet dar si spre centru... Eventual si la apropierea din fata sa fie la inceput pe centru. Practic ar trebui ca sunetul sa descrie un usor arc de cerc.
Incerc si eu sa fac un test cu un sunet de motor care sa urmeze un astfel de arc de cerc in care pan-ul sa fie coordonata x si volumul x. Ar trebui ca ascultatorul sa fie pozitionat pe punctul de intersectie a doua axe, acolo unde volumul sa fie 0 maxim si pan-ul 0 centru. In momentul când masina ar fi la stanga mea, y ar fi 0, iar y ar fi sa zicem -3. Oare care ar fi o formula de corespondenta intre x si y astfel incat sa formeze un ar de cerc foarte mare, cu centrul undeva la 0 pe coordonata y volum si +100 pe axa x pan.
Un alt factor ar mai fi si viteza cu care suentul ar trece de la un punct la altul, viteza care ar trebui sa creasca treptat usor spre volum 0 si sa scada treptat dinspre volumul 0.
Ar fi interesant de gasit cele mai bune formule. Cei care au cunostinte mai avansate in trigonometrie, geometrie sau ce o fi necesar, ne-ar putea spune cam care ar fi o astfel de formula pentru a nu sta sa o descoperim euristic prin incercari.
Am incercat miscarea cu programelul lui Campus si cred ca da putin senzatia de trecere in viteza pe langa, doar ca imi e greu sa imi dau seama când e la volum maxim pentru a apasa putin pe sageata dreapta atunci cand e deja si in cel mai stanga punct al traiectoriei.

E ceva destul de complicat se pare, probabil ca auzul stie cu adevarat sa preia sunetul dintr-un spatiu mai larg.
Cred ca niste teste ar putea decide cam care ar fi cele mai bune solutii de a simula deplasarea 3D pe baza volumului, pan-ului si eventual cu putin ajutor al pitch-ului.

Scris: 04 Mar 2014, 08:43
de IonPop
Si eu m-am gandit ca poate ar ajuta daca ar exista niste casti cu doua difuzoare mai mici, unul ceva mai in spate si unul putin mai in fata.
Dar nu stiu daca este asa. Ma gandesc ca pana la urma, sunetul ajunge doar in doua puncte inauntrul celor doua urechi, indiferent de unde ar veni el, din fata sau din spate.
Daca sunetul vine de la un spatiu oarecare de ureche, deci nu din casti, ar putea exista o diferenta fina datorita formei lobului urechii care arata diferit in partea din fata in comparatie cu partea din spate, asa ca din experienta am putea deduce daca sunetul vine din fata sau din spate.
Dar daca sunetul vine din castile montate pe urechi, deci acel sunet nu va reactiona cu mediul inconjurator, nu va rezona cu niciun element din camera si nici macar forma lobului urechii nu va mai conta, cred ca in mod teoretic nu ne putem da seama daca sunetul vine din fata sau din spate. Cred ca ar fi nevoie de smecherii si de efecte care sa ne dea impresia ca acel sunet vine din fata sau spate. Un bun test ar fi daca cu orice biblioteca de sunet s-ar crea doua programe, unul care sa redea un sunet fix, care nu isi schimba pozitia, si care ar trebui sa se auda fix din fata, si un al doilea program care ar reda acelasi sunet ca venind fix din spate. Iar apoi altcineva sa ruleze unul sau altul dintre programe, trebuind sa ghicim de unde se aude sunetul. Daca sunetul este in miscare se poate crea o iluzie auditiva care sa ne dea impresia ca sunetul vine din fata sau spate.

Desenare cerc audio

Scris: 22 Mar 2014, 20:51
de Manu
Am apucat să aflu modalitatea de desenare a unui cerc într-un sistem de coordonate carteziene.

Astfel, având centrul un punct cu coordonatele x_center şi y_center, o rază radius şi unghiul Alpha, punctul x, y de pe cerc la un anume grad Alpha este:
x = x_center + radius * cosinus de Alpha
y = y_center + radius * sinus de Alpha

Am desenat astfel un cerc audio, unde sunetul îşi schimbă pan-ul (poziţia stânga / dreapta) dupa x, iar pitch-ul (poziţia sus / jos) dupa y.
Am observat că îmi sună mai bine daca reduc la jumătate distanţa între două puncte x, astfel încât diferenţa dintre maxim stânga şi maxim dreapta să fie mai mică, doar aşa mi s-a părut că e mai mult un cerc decât un oval culcat.

Am creat folosind un arc de cerc şi trecerea unui motor prin stânga ascultătorului aflat la x=0 şi y=0.
Pentru asta am setat ca centrul cercului audio să fie la x=+30, iar raza acestuia să fie de 35, astfel încât atunci când deplasarea se află la 180 de grade, deci fix în stânga ascultătorului (y=0), x să fie la -5.
Am început aşadar sunetul la 156 grade şi am mers 48 grade până la 204, gradul 180 fiind la mijloc între aceste două valori.
Desigur că mişcarea este în sens trigonometric, Alpha=0 fiind în dreapta, în cel mai estic punct, iar 180 grade fiind iar la y=0, cel mai vestic punct. În explicaţia anterioară am pornit de la premisa că centrul cercului este la y=0.

Pun mai jos link-uri către două ZIP-uri care conţin codul, executabilul şi fişierele sunet pentru cercul audio şi pentru motocicletele care trec la o viteză reglabilă.
Viteza poate avea valori de la 1 la 9, modificându/se prin apăsarea cifrelor corespunzătoare de pe tastatură. Pentru a vedea importanţa modificării vitezei in funcţie de apropiere şi depărtare, ar fi bine să se încerce şi cu viteza 9.
În cazul motocicletei nu am folosit pitch, ci volumul pentru axa y, volum care creşte până la 0 atunci când y ajunge la 0 şi scade apoi, asta pentru ca să pară că se apropie şi apoi se depărtează.
De asemenea, pentru a părea mai real, viteza creşte pe măsură ce volumul se apropie de 0 şi scade apoi pe măsură ce se depărtează din nou de 0. Viteza este de fapt un număr de milisecunde între trecerea de la un grad Alpha la următorul.

Ambele progrămele se închid apăsând tasta q. Este nevoie de închidere manuală pentru că cercul se tot aude întruna, iar motocicletele tot vin una dupa alta, funcţiile care simulează mişcarea fiind plasate în loop-uri infinite.

Descărcare CercAudio.zip
Descărcare MotocicleteInTrecere.zip

Codul în BGT pentru cercul audio este:

Cod: Selectaţi tot

void play_circle() {
int x_center=0;
int y_center=100; // 100 este pitch-ul normal.
int radius=20; // un cerc cu raza de 20.
int alpha_start=0;
int alpha_to_run=360;
double PI=3.1416; // e nevoie de PI pentru transformare în radiani.

// pentru valorile de pe cele două axe care se modifică la fiecare grad:
double x=0;
double y=0;

// Buclă cu 360 de iteraţii la valorile actuale:
// Modificând Alpha_start şi Alpha_to_run se pot crea arcuri de cerc.
for(int alpha=alpha_start; alpha<(alpha_start+alpha_to_run); alpha++) {
// Calculăm valorile pe axa x, cea pentru pan:
/*
Funcţiile BGT pentru sinus şi cosinus cer radiani,
astfel că am transformat gradele:
radian = Alpha * PI / 180
/*
x=x_center+radius*cosine(alpha*PI/180);
// x pan se simte prea mult în comparaţie cu y pitch, astfel că îl reducem la jumătate:
x/=2; 
s.pan=x;

// Calculăm valorile pe axa y, va fi o modificare a pitchului pentru a da senzaţia sus/jos:
y=y_center+radius*sine(alpha*PI/180);
s.pitch=y;

wait(20);
} // end for.
} // end play_circle.

Scris: 28 Ian 2019, 02:35
de Vlad_Ciotescu
salutare.
in momentul de fata a aparut o librarie numita lib audio verse care este pe
github .
este facuta tot de camlorn, dar este mult mai usor de folosit. problema este ca proiectul a fost abandonat, si functioneaza doar pe windows, desi dezvoltatorul a planuit sa-l faca si pentru mac. acolo puteti gasi inclusiv codul sursa a librariei care este facut in c++.
dar in acel cod chiar se simte acel sunet 3d. sam tupy a adaptat dll-ul si pentru BGT in urma cu ceva timp, dar numai un grup restrans are acces la el.
dar sincer v-as sfatui sa treceti la un alt limbaj de programare deoarece bgt nu a mai fost actualizat de mult timp.
eu unul am trecut la python, pentru ca e un limbaj destul de simplu de folosit si suporta multiplatforming. dar nu sunt in masura sa oblig pe cineva sa renunte la un limbaj de programare.