# Gezieltes Ansteuern mehrerer Boxen



## Darokh (24. Feb 2012)

Hi,
für ein Projekt, an dem ich derzeitig arbeite (bzw. experimentiere), suche ich eine Möglichkeit, wie ich 4 oder sogar 8 Boxen gezielt ansprechen kann.

Ich arbeite an der Uni und wir experimentieren mit Sound-Lokalisation. Derzeitig haben wir ca. 20 Boxen in einer Reihe vor einem Probanden stehen. Aus einer Box kommt dann ein Ton und der Proband muss sagen, woher der Ton kam. Das Programm, was dort verwendet wurde, ist aber uralt und wurde von einem Informatiker entwickelt, der nun weg ist. Somit stehen wird mit den Klamotten nun da.

Nun haben wir als Alternative Töne generiert, die über 2 Boxen abgespielt werden und den Eindruck vermitteln, sich irgendwo auf einer Horizontalen vor dem Probanden zu befinden. Das geht, aber klappt natürlich nur auf der horizontalen Ebene.

Ich würde nun aber gerne 4 Boxen in einem Quader vor dem Probanden anordnen, so dass der Ton auch von oben links, unten rechts oder irgendwo dazwischen kommen kommen könnte. Noch besser wäre natürlich sogar 8 Boxen - also auch noch hinter dem Probanden, so dass man den Ton irgendwo im Raum sich befinden lassen kann. Das ist aber denke ich reine Utopie...

Aber nun stehen wir natürlich vor 2 großen Problemen:
a) die Boxen werden bei uns über eine sogenannte NIDAQ Box angeschlossen - die bietet dann über einen Port Anschlussmöglichkeiten für 16 Boxen. Ich hab natürlich keinen Plan wie das Ding funktioniert. Wie würdet ihr denn die Soundboxen einzeln ansprechen?

b) Mir fehlt die Technologie, mit der ich diese Töne überhaupt so abbilden lassen kann. Es müssen ja nicht nur Lautstärke, sondern auch die Phase und die Verzögerung der jeweligen Box berücksichtigt werden. Dolby Surround wäre ja auch eine Option, aber das läuft glaube ich auch eher auf eine horizontalen Ebene, so dass Töne von Oben nur schwer dargestellt werden können (glaube ich zumindest...)

Hat jemand eine Idee, wo ich mir das anlesen kann bzw. worauf ich da zurückgreifen kann? Irgendetwas muss es da ja geben...


----------



## Marco13 (24. Feb 2012)

Gibt es eine Software/Doku zu dem, was der andere Entwickler verwendet hat? Eine schnelle Websuche liefert z.B. Java Interface for National Instruments Drivers - National Instruments - FALLS dort irgendwo eine nidaq-DLL und ggf. headers und Doku existieren, könnte man vielleicht mit JNI was machen...


----------



## maki (24. Feb 2012)

> Dolby Surround wäre ja auch eine Option, aber das läuft glaube ich auch eher auf eine horizontalen Ebene, so dass Töne von Oben nur schwer dargestellt werden können (glaube ich zumindest...)


"Dolby Surround" ist imho keine Option, wurde im letzten Jahrhundert eingemottet, irgendwann von zB. Dolby Digital abgelöst, was nix anderes ist als MP3 für mehrere Kanäle... aber wenn du 8 vollwertige Kanäle brauchst, wirst du mit DTS/Dolby/etc. pp. nicht weit kommen, ist aber nicht wild, bei diesen Standards geht es um andere Dinge als das was du vorhast (Standard für kompromiertes/unkomprimiertes Audio für Filme & Konzerte, etc. pp.)

Würde da wie Marco13 schon gesagt hat mal den Hersteller der Hardware (NIDAQ Box) kontaktieren bzw. Googeln.


----------



## Darokh (24. Feb 2012)

Keine Doku, kein gar nichts vom Entwickler. Man hat "damals" einfach nicht nachgedacht...ich werd mal am Montag schauen, ob ich an den Hersteller herankomme.

Ansonsten noch irgendwelche Vorschläge, wie ich die Boxen einzeln ansprechen kann?

Und dann: Selbst WENN ich es kann, habe ich das Problem ja noch nicht gelöst, wie man den Sound dann so darbieten kann, dass er beispielsweise bei 4 frontalen Boxen an einem bestimmten Punkt vor dem Probanden im Raum liegt / herzukommen scheint.

Hat da jemand Erfahrung mit?

Habe zwar schon viel gegoogled, aber das klingt alles nur danach, wie ich den Ton erstelle - aber nicht nach meinen Problem...


----------



## DerFeivel (24. Feb 2012)

Darokh hat gesagt.:


> Aber nun stehen wir natürlich vor 2 großen Problemen:
> a) die Boxen werden bei uns über eine sogenannte NIDAQ Box angeschlossen - die bietet dann über einen Port Anschlussmöglichkeiten für 16 Boxen. Ich hab natürlich keinen Plan wie das Ding funktioniert. Wie würdet ihr denn die Soundboxen einzeln ansprechen?
> 
> b) Mir fehlt die Technologie, mit der ich diese Töne überhaupt so abbilden lassen kann. Es müssen ja nicht nur Lautstärke, sondern auch die Phase und die Verzögerung der jeweligen Box berücksichtigt werden. Dolby Surround wäre ja auch eine Option, aber das läuft glaube ich auch eher auf eine horizontalen Ebene, so dass Töne von Oben nur schwer dargestellt werden können (glaube ich zumindest...)
> ...




Handelt es sich bei deiner Box (in etwa) um so etwas?

http://www.goindustrial.co.nz/odin/images/308711/Low-Cost-Multifunction-Data-Acquisition-DAQ-Device-from-National-Instruments-308711-o.jpg

Ich hab sowas mal vor ca. 4 Jahren mit Matlab angesprochen...kann ja mal gucken, ob ich da vielleicht noch irgendwo was zu habe.


----------



## Darokh (24. Feb 2012)

Hi,
hm, ja, das kann gut sein.

Vor 10 min habe ich erfahren, dass wir aber auch einfach _selbstgebaute_ Boxen haben, die über einen USB Anschluss an einen COM-PORT überbrückt werden, und dort dann die besagte 8 / 12 / 16 Anschlüsse haben, an die dann taktile Stimulatoren (die vibriren dann...) oder Leuchtdioden angeschlossen werden.

Da soll es dann wohl jemanden geben, der die Dinger zumindest gebaut hat. Derzeitig stelle ich aber noch in Frage, ob der mir auch verraten kann, wie man die denn bitteschön per Java anspricht.

Soweit ist mein Stand jetzt gerade, am Montag erfahre ich wohl mehr als jetzt 

@DerFeivel: wenn du magst, kann du mir das ja per Mail schicken: ralf.suerig( at )uni-hamburg.de.
Die Frage ist, ob mir der Matlab code da in Java weiterhilft. Da habe ich leider keine Erfahrung mit (wie in so vielen Sachen gerade...muss mich eben überall gerade einarbeiten)
Auf jeden Fall schonmal vielen Dank!


----------



## Marco13 (24. Feb 2012)

Wie man die Töne generiert, die dann aus einer der Boxen kommen, würde sich vermutlich (!) klären, wenn man eine Spezifikation dieser NIDAQ-Software (bzw. der DLL) hätte. Im einfachsten Fall, wenn wirklich immer nur ein Sinussignal auf eine Box gelegt werden muss, könnte das _tehoretisch_ sogar mit vergleichsweise wenig Aufwand manchbar sein ...
*wunschträum: *

```
sentThisStuffTo(boxNumber, sineWaveData);
```
:joke:
Aber natürlich kann es umgekehrt auch beliebig kompliziert sein und zu beliebigen Problemen kommen...


----------



## Darokh (29. Feb 2012)

Also, jetzt habe ich mal ganz konkrete Aussagen:

Keine NIDAQ Box, die wird nicht gebraucht, sondern:

*Soundausgabe*
Für die Soundausgabe (für 8 Lautsprecher) haben wir nun 3 Soundkarten (2 Stereo, eine mit Quadrophonie) eingebaut.

1. Frage:
Wie kann ich über Java gezielt eine Box einer bestimmten Soundkarte ansteuern?
Ich habe z.B. eine Soundkarte mit einem Output für Stereoboxen. Nun möchte ich auf einer Box einen Ton abspielen. Wie funktioniert das?

*LED Leuchten*
Zusätzlich sollen LED Leuchten angesprochen werden.
Dazu wird über einen LPT Port eine Box mit 8 Anschlüssen für die LEDs angeschlossen. Die Box benötigt einfach nur ein binäres Signal (der Informatiker sprach von 126/ 127 Möglichkeiten). Ich muss also über den LPT Port ein bestimmtes binäres Signal senden, die Box weiß dann was sie zu tun hat.

2. Frage:
Wie spreche ich in Java einen LPT Port an und kann über diesen etwas verschicken?

Gruß,
Darokh


----------



## Marco13 (29. Feb 2012)

Zu dem Audio-Sachen: Du könntest ggf. mal sowas laufen lassen wie

```
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.Mixer.Info;
import javax.sound.sampled.SourceDataLine;

public class AudioDevicesTest
{
    private static final int sampleRate = 1024 * 16;
    private static final int channels = 2;
    
    public static void main(String[] args)
    {
        AudioFormat audioFormat = 
            new AudioFormat(sampleRate, 8, channels, true, true);
        byte data[][] = createData();
        Info[] mixerInfos = AudioSystem.getMixerInfo();
        for (Info mixerInfo : mixerInfos)
        {
            System.out.println("Mixer info: "+mixerInfo);
            try
            {
                DataLine.Info dataLineInfo = new DataLine.Info(
                    SourceDataLine.class, audioFormat);
                Mixer mixer = AudioSystem.getMixer(mixerInfo);
                if (!mixer.isLineSupported(dataLineInfo))
                {
                    System.out.println(
                        "No source data line with given " +
                        "audio format supported");
                }
                else
                {
                    SourceDataLine line = 
                        (SourceDataLine) mixer.getLine(dataLineInfo);
                    line.open(audioFormat, sampleRate);
                    line.start();
                    for (int i=0; i<channels; i++)
                    {
                        line.write(data[i], 0, sampleRate);
                    }
                    line.drain();
                    line.close();
                }
            }
            catch (LineUnavailableException e)
            {
                e.printStackTrace();
                continue;
            }
        }
    }
    
    private static byte[][] createData()
    {
        int seconds = 1;
        int frequency = 1000;
        byte data[][] = new byte[channels][sampleRate * seconds * channels];
        for (int j=0; j<channels; j++)
        {
            for (int i = 0; i < sampleRate * seconds; i++) 
            {
                double period = (double)sampleRate / frequency;
                double angle = 2.0 * Math.PI * i / period;
                data[j][i*2+j] = (byte)(Math.sin(angle) * 127);
            }
        }
        return data;
    }
    
}
```

Das sollte auf allen verfügbaren Soundkarten (die mindestens Stereo unterstützen) jeweils links und rechts einen Pipton abspielen (ggf. auf manchen mehrfach). Für das Vierkanal-Ding müßte man das AudioFormat anpassen, aber als erster Test, ob aus allen Boxen was rauskommt, könnte das schon helfen.

Den Parallelport sollte man ja mit sowas wie ParallelPort ansteuern können, damit hab' ich aber noch nie was gemacht. (Auch hier gilt: Im Idealfall ist es nur sowas wie port.setByte(0x13);, aber es kann auch deutlich komplizierter sein...)


----------



## Empire@Work (1. Mrz 2012)

Ohne euch jetzt zu nahe treten zu wollen, 

aber löst es doch wenigstens diesmal mit etwas mehr zukunftssicht.
-> Parallelport ist tot, es wird spätestens in 1-2 Jahren extrem schwierig überhaupt noch neue Computer zu finden die den haben
-> Serialport ist weitestgehend ähnlich.

Meine empfehlung wäre ja das ding komplett neu aufzusetzen und dann richtig zu machen,
je nachdem was ihr braucht (nur sinustöne? nur töne verschiedener tonhöhen?)

Zb. könnte man einen Arduino Mega nehmen, (nur beispielhaft es gibt bestimmt 1000 andere Lösungen)
dann hat man: 14 output pins mit pwm simulierten analog signal, für beeep töne reicht das vollkommen aus
(und noch zig dutzende weitere digitale für die leds)
-> vorteil wäre eine Hardware, die genau spezifiziert ist, und wo es mehr als nur einen Herstelle gibt, zudem ist sie recht günstig (weniger als 50€)
-> Der Arduino wird dann per usb (was ja auf absehbare zeit noch existieren wird und abwärtskompatible ist) angesteuert auf welchen output er welche Hz zahl erzeugen soll (bzw hz zahlen und mit welcher verzögerung)
-> Somit kann man die ganze logik in eine Java bibliothek kapseln die dann von den jeweiligen Testmodulen eingebunden wird.

Das ganze neu zu machen ist sicherlich einiger aufwand, aber dafür hätte man in 2-3 Jahren nicht dasselbe Problem schonwieder.


----------

