# Blickrichtung auf Stereosound übertragen



## Olop01 (15. Jun 2016)

Hallo Java-Fans!

Ich versuche derzeit, Sounds die ich auf dem Smartphone abspiele, künstlich im Raum zu verorten indem sich die Stereolautstärke (links oder rechts) bei der Drehung mit dem Smartphone verändert. Dreht sich der Hörer zum Beispiel nach links, wird der Sound auf dem linken Ohr leiser. 

Ich kann den Azimuth des Gerätes auslesen mit Werten von 0 bis 359. Weiterhin kann ich die Stereolautstärke einer Soundquelle mit 0.0 bis 1.0 für jeden der beiden Kanäle (links und rechts) separat bestimmen.

Mein Problem ist, dass ich es nicht schaffe, diese 360 Grad-Werte dynamisch auf die Soundlautstärke zu projizieren (also dass sie sich abstufen, statt einfach nur ab einem gewissen Gradwert komplett auf 0 oder 1 zu schalten).

Kann man die Gradveränderung die gemessen wird, nicht irgendwie auf die Lautstärke von links und rechts transportieren?

Ich weiß, das ist ein krasses Thema und es steht nicht fest, dass das so 1 zu 1 in der Realität funktioniert. Ich würde es trotzdem gerne ausprobieren, bin aber kein wirklich guter Mathematiker und noch ziemlich neu in Java.

Habt ihr Ideen / Ansätze, wie so eine Klangverortung (auch wenn sie nur grob ist) in Java Code umsetzbar wäre?

Für eure Vorschläge bedanke ich mich im Voraus


----------



## mrBrown (15. Jun 2016)

Du könntest aus der Gradangabe den Punkt auf dem Einheitskreis bestimmen, der x-Wert ist dann die relative Lautstärke.
Der Wert liegt dann in [-1,1]. Ton mehr von Rechts wäre dann positive, mehr von Links negative Werte, also fürs Linke Ohr die Werte negieren. Außerdem muss es dann noch auf [0,1] gemappt werden.

Reicht's als Ansatz? 


Spielt denn die Lautstärke überhaupt eine wesentliche Rolle bei Lokalisierung?


----------



## Olop01 (15. Jun 2016)

Hui, Einheitskreis, das ist knapp 10 Jahre her.. 

Danke erstmal für deine Antwort mrBrown! Wenn ich das richtig verstehe, dann muss ich um den x-Wert zu erhalten, den Kosinus von meinem Azimuth (z.B. 30 Grad) nehmen. Der x-Wert ist bei 0 Grad 1.0, bei 90 Grad 0.0 und bei 180 Grad -1.0.

Diesen Wert muss ich jeweils auf den linken und rechten Lautstärkewert aufrechnen bzw. abziehen.

Dreht man sich nach rechts, beträgt der Winkel 0 Grad, x=1.0. Der gewünschte Wert für den Sound (L|R) wäre in dieser Situation 1|0. Hier muss ich x sozusagen vom Wert der vollen Lautstärke subtrahieren. Dies würde auch funktionieren, da mit steigender Gradzahl bzw. Blick zum Zentrum x (und damit der Lautstärkeabzug) kleiner wird.

Analog für den Blick nach links muss für X der Betrag gebildet und vom Lautstärkewert für links abgezogen werden. 

Habe ich das soweit korrekt gedacht?


----------



## mrBrown (15. Jun 2016)

Betrag kannst du nicht nutzen, du musst schon negieren (da |-1|==|1|), und das mappen auf [0,1] nicht vergessen. Sonst passts


----------



## Olop01 (16. Jun 2016)

Ich verstehe nicht genau, was du mit "mappen" meinst?


----------



## mrBrown (16. Jun 2016)

Olop01 hat gesagt.:


> Ich verstehe nicht genau, was du mit "mappen" meinst?


Jeder Wert aus [-1,1] muss auf einen Wert aus [0,1] abgebildet (=gemappt) werden


----------



## Olop01 (20. Jun 2016)

Also, ich bin noch am herum rechnen gerade...

Wenn ich eine Soundquelle habe, die aus 90° kommt. Dann kann ich mit dem Sinus von diesem Wert die gewünschten Werte erreichen. 

Heißt, Kopf geradeaus (Richtung 90°) dann sound(1|1).

Kopfdrehung nach rechts (Winkel abnehmend) dann sound(1 | sin x)
Kopfdrehung nach links (Winkel zunehmend) dann sound(sin x | 1)

ABER: Was wenn ich den Kopf weiter drehe? Beide Werte auf null setzen, wenn Winkel > 180°? Würde darin enden dass der jeweils mit 1 voll bespielte Kopfhörer plötzlich komplett leise wird.

Eine bessere Lösung wäre, die Lautstärke des zugewandten Ohres durch den sin x zu reduzieren und die Lautstärke des abgewandten Ohres durch sin x / 2. Dann hätte ich das Problem dass er bei Blick geradeaus (90°) lediglich 0.5 wäre, anstatt 1. Also: Blick geradeaus 90° (1|0.5), Blick rechts 45° (0.5|0.25), Blick ganz rechts (0|0).

Kann ich den Sinus-Wert für die jeweils abgewandte Seite irgendwie früher auf null setzen, als den zugewandten, mit der Bedingung dass beide Werte immer bei 0 (abgewandt) und 1 (voll zugewandt) stehen? Also der abgewandte Wert muss irgendwie exponential sinken, oder?


----------



## mrBrown (20. Jun 2016)

Ganz ohne großes Rumrechnen, Nase liegt bei 0°: 
Sound von vorn:
sin(0°)=0, da aus [-1,1] mappen auf [0,1] => 0,5 fürs eine Ohr, fürs andere Ohr -sin(0°)=-0 => 0,5
Sound von der Seite:
sin(90°)=1 => 1 fürs eine Ohr, fürs andere Ohr -sin(90°)=-1 => 0


Will man immer einen mindestwert, mappt man nicht auf [0,1] sondern zb [0.5,1], dann sinds immer min 0.5
Will mans exponential, mappt nimmt man e^-(x):x \in [0,1]

Je nachdem was halt Sinnvolle Werte sind, ich weiß nicht ob der Winkel in der Realität überhaupt einen hörbaren Einfluss hat...


----------



## Olop01 (20. Jun 2016)

Warte mal ... dafür kann ich doch x² einfach nehmen, oder?
Also if Winkel 0 < 90 then sound (sin x, sin x²)
if Winkel 90 < 180 then sound (sin x², sin x). Das sollte doch prima klappen.

Jetzt muss ich nur noch herausfinden, was ich mit Soundquellen mache, die nicht aus der 90° Richtung kommen sollen. Ich möchte gerne Sounds aus vier Winkeln haben (also einen aus 0°, einen aus 90°, einen aus 180° und einen aus 270°).

Ich kann hier nicht einfach alle Sounds aus den restlichen drei Kategorien umrechnen auf die 90° Variante, da damit ja alle der 4 Sounds aus der selben Richtung (90°) kommen würden.

Hätte ich angenommen eine Soundquelle aus 90° kommend und eine aus 180° kommend und schaue in die Richtung 135°, hieße das sound1 (0.25|0.5), sound2 (0.5|0.25).

Hmmm...

EDIT: Du hast gerade parallel zu mir geantwortet - dieser Post bezieht sich somit nicht auf deinen


----------



## mrBrown (20. Jun 2016)

mit x^2 kommst du auch bei 0 an.

Bei sin ist bereits jeder Winkel passend drin


----------



## Olop01 (20. Jun 2016)

Ah, so viel wie ich von deinem Post nachvollziehen kann, hieße das, wenn ich zur Soundquellrichtung schaue, hat der Sound nur 0,5 Lautstärke auf jedem Ohr, oder?

Also der Wert 0 ist schon gut, weil ich den Sound nur hören möchte, wenn ich ihn sozusagen anschaue. Drehe ich mich in eine Richtung weg, so ist er spätestens bei 90° Abweichung auf beiden Ohren tot. Dabei soll mit fortschreitender Abweichung das jeweils dem Sound abgewandte Ohr schneller leise werden als das dem Sound zugewandten.

Drehe ich mich weiter vom Sound weg als 90° so will ich ihn gar nicht mehr hören.

Vielleicht zum Hintergrund: Ich möchte eine kleine Klankulisse digital bauen. In der sollen aus 4 Ecken jeweils ein Geräusch kommen. Drehe ich im Raum, so kann ich damit gewissen Sounds zuhören und mich von den jeweils anderen drei abwenden.


----------



## Olop01 (20. Jun 2016)

Hier mal ein Bild mit Beispiel der Blickrichtung 135°


----------



## mrBrown (20. Jun 2016)

Olop01 hat gesagt.:


> Ah, so viel wie ich von deinem Post nachvollziehen kann, hieße das, wenn ich zur Soundquellrichtung schaue, hat der Sound nur 0,5 Lautstärke auf jedem Ohr, oder?



Ja, in Richtung Sound schauen wäre 0.5 auf beiden Ohren, Sound von der Seite wäre 1 bzw 0.


Auf dem Bild wäre der Winkel zu sound1 45°
Für das Rechte Ohr wäre das dann sin(45°) = 0.70 => 0.85
Für das Linke Ohr -sin(45°) = -0.70 => 0.15 (bzw 1-0.85)
Zusammen für beide Ohren hört man also immer 100%


Soll das Maximum bei 45° statt 90° liegen, müsste es passen, einfach mit dem doppeltem Winkel zu rechnen (zumindest für die zugewandte Seite, >45° müsste man das abgewandte auf 0 setzten. 
0° wären dann 0.5, 45° 1 und 90° 0 für die entsprechende Seiten


----------



## Olop01 (20. Jun 2016)

Okay danke, ich werde es damit noch einmal ausprobieren. Hoffentlich habe ich nun Erfolg


----------

