kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Erweiterung der Android-Processing-VR-Funktionalität um den Befehl "spiel(...)"

(EN google-translate)

(PL google-translate)

Effizientes Audiostreaming ist keine so einfache Sache. Der Soundkarte müssen in zeitlich festen Intervallen Blöcke (Arrays fester Größe) übergeben werden, in den bereits die zu spielenden Sampleverläufe abgespeichert sind. Um diese Blöcke bereitzustellen, müssen alle ggf. gleichzeitig klingende Kanäle in ihrem Verlauf berechnet und zusammengemischt werden. Wenn zudem eine räumliche Positionierung im 3D-Raum gewünscht ist, muß auch hierfür zusätzlich berechnet werden, wie laut und in welcher Phase diese Klänge aktuell beim Zuhörer ankommen. Schließlich gibt es verschiedenartig synthetisierte Klänge: Sie können aus einem Audiofile stammen, oder einer primitiven Wellenfunktion entsprechen, die einfach berechnet wird entspringen.

Für den Fall, dass wie hier noch parallel zur Darstellung im Smartphone, die Klänge auch auf einem externen System bei Wunsch zu hören sein sollen, müssen hierzu auch noch die entsprechenden Mechanismen bereitgestellt und konfiguriert (IP-Nummer des Ziels u.ä.) werden können.

Entwurf der Funktion spiel(...)

Um für Kompatibilität mit den Möglichkeiten des WFS-Labors zu sorgen, werden dazu kompatible Manipulationsmethoden definiert.

Folgende Parameter könnten die Funktion spiel(...) bestimmen:


WFS-Befehle (OSC):

BEFEHL                          BEDEUTUNG                           PARAMETER/TYP
"/WONDER/source/activate"       Punktquelle aktivieren
"/WONDER/source/deactivate"     Punktquelle deaktivieren
"/WONDER/source/type"           Punkt- oder Ambient
"/WONDER/source/position"       Neue Position nach Delta t[s]     
"/WONDER/source/color"          Farbe in Visualisierung

Ardour-Befehle (OSC): (Hier sind die Soundquellen als Wav-Files mit 48kHz Samplingrate zur Verfügung gestellt)

STARTEN:
"/ardour/goto_start"            Band zurückspulen
"/ardour/transport_play"        Band starten
"/ardour/loop_toggle"           ... geloopt

STOPPEN:
"/ardour/loop_toggle"           geloopt rückgängig
"/ardour/transport_stop"        stoppen.

Zeitmanagement:
Für eine schnelle Reaktion sollten die Sample-Pakete nicht zu groß gewählt werden,
die zyklisch zur Soundkarte geschickt werden.
Außerdem bietet es sich an, für den Sound auf dem Android eine reduzierte Samplingrate zu nehmen,
um auch auch eine größere Anzahl von Kanälen in Echtzeit berechnen zu können.

Erfahrungswert für Android:
Anzahl der Samples pro Paket (Puffergröße): 512
Samplerate 11025 Samples pro Sekunde
Merken der Samples als short-Werte.
Da Stereo: 2x512==1024 short-Werte für den Puffer nötig.
Wiederum erfolgt die Angabe der Größe im Konstruktor in Byte, short==2Byte, deshalb 4x512==2048

Die kleinste (Basis)-zeiteinheit für den Prozeß ist dann (Verarbeitungsdauer eines Blocks):
512/11025 == 0,046439909 Sekunden, also ungefähr 50ms
Dieses Verarbeitungsintervall läge auch im Bereich des Möglichen der WFS-Anlage.

Auch der Dopplereffekt sollte im Android-Device mit berücksichtigt werden.

spiel(TYP oder Dateiname, eigene Frequenz oder Miditonhöhe, Mapping auf Wunschfrequenz oder Midihöhe, Lautstaerke, x, y, z-Position im Raum)  

Beispiele:
Synthetische Funktionen werden so formuliert, dass ihre Periode 1s ist und damit ihre Frequenz 1Hz
spiel("Dreieck",1.0,440.0,0.0,100,100,100);
spiel("orgel60.wav",60,72,1.0,200,100,100);


Funktionsköpfe:
void spiel(String typ, int midi_quelle, int midi_klang, float laute, float x, float y, float z)
void spiel(String typ, float freq_quelle, int midi_klang, float laute, float x, float y, float z)
void spiel(String typ, int midi_quelle, float freq_klang, float laute, float x, float y, float z)
void spiel(String typ, float freq_quelle, float freq_klang, float laute, float x, float y, float z)


Code 0-1: Entwurf der Funktion spiel(...) und Entwurf der dahinter liegenden Mechanismen.