Sie sind auf Seite 1von 39

DOKUMENTATION

Fachhochschule Wedel Praktikum Virtual Reality Sommersemester 2010 Thema: djBench Andreas Fischer (Matr.-Nr. 6380) Christoph Kipping (Matr.-Nr. 6086) Marcel Nss (Matr.-Nr. 61 55) Philipp Zabel (Matr.-Nr. 3206)

Inhalt 1. Allgemeine Problemstellung ....................................................................................................................... 1 1.1 Einleitung ................................................................................................................................................. 1 1.2 Das djBench-Projekt ............................................................................................................................ 1 1.3 Zielgruppe ................................................................................................................................................ 1 2. Benutzerhandbuch ....................................................................................................................................3 2.1 djBench - die CoBench-App.....................................................................................................................3 2.1.1 Ablaufbedingungen ........................................................................................................................3 2.1.2 Programminstallation ....................................................................................................................4 2.1.3 Programmstart ..............................................................................................................................4 2.1.4 Bedienungsanleitung .....................................................................................................................4 2.1.4.1 Die Oberche .............................................................................................................................4 2.1.4.1.1 Kongurations-Men.............................................................................................................5 2.1.4.1.2 Hauptbildschirm....................................................................................................................6 2.1.4.2 Der Programmablauf ................................................................................................................ 10 2.1.4.2.1 Die Musikbibliothek wechseln.............................................................................................. 10 2.1.4.2.2 Eine Platte auegen............................................................................................................. 11 2.1.4.2.3 Einen bergang zwischen zwei Tracks erzeugen ................................................................. 11 2.1.4.2.4 Einen Eekt hinzufgen ....................................................................................................... 11 2.1.4.2.5 Die Slipmats tauschen ......................................................................................................... 11 2.1.5 Fehlermeldungen .......................................................................................................................... 11 2.1.5.1 Settings-Men ........................................................................................................................... 11 2.1.5.2 Plattenkoer ..............................................................................................................................12 2.1.5.3 Dateibrowser .............................................................................................................................12 2.1.6 Wiederanlaufbedingungen ............................................................................................................12 2.2 Lightshow - die CAVE-App .....................................................................................................................12 2.2.1 Ablaufbedingungen .......................................................................................................................12 2.2.2 Programminstallation ..................................................................................................................12 2.2.3 Programmstart ............................................................................................................................12 2.2.4 Bedienungsanleitung ...................................................................................................................13 2.2.5 Fehlermeldungen .........................................................................................................................15 2.2.6 Wiederanlaufbedingungen ...........................................................................................................15 3. Programmierhandbuch ........................................................................................................................... 16 3.1 Entwicklungskonguration ..................................................................................................................... 16 3.2 Problemanalyse..................................................................................................................................... 16 3.2.1 Benutzeroberche ..................................................................................................................... 16 3.2.2 Sound ......................................................................................................................................... 19 3.2.3 Lightshow ...................................................................................................................................20 3.3 Realisierung............................................................................................................................................21 3.3.1 Benutzeroberche ......................................................................................................................21 3.3.2 Sound .........................................................................................................................................29 3.3.3 Lightshow ....................................................................................................................................31 3.4. Beschreibung grundlegender Datenstrukturen .....................................................................................32 3.4.1 CoBench-App ..............................................................................................................................32 3.4.2 CAVE-App ...................................................................................................................................33 3.5 Programmorganisationsplan .................................................................................................................34 3.6 Programmtests .....................................................................................................................................35 I

ALLGEMEINE PROBLEMSTELLUNG

1. Allgemeine Problemstellung 1.1 Einleitung Bei dem vorliegenden Bericht handelt es sich um eine Dokumentation fr die Software djBench, welche im Rahmen des Praktikum Virtual Reality 1 an der FH Wedel zum Wintersemester 2010 entstand. Die Dokumentation soll sowohl die Funktionsweise bzw. Bedienung der Anwendung verdeutlichen, als auch die bei der Umsetzung eingeossenen Ideen und aufgetauchten Probleme aufzeigen. 1.2 Das djBench-Projekt Es soll eine Multitouch-Anwendung entstehen, die einem realen DJ-Set nachempfunden ist. Zustzlich ist eine Lichtshow zu realisieren, die sich ebenfalls ber die Multitouch-Applikation steuern lsst. Das DJ-Set besteht dabei aus zwei Plattenspielern, einem Audiomischpult und einem virtuellem Plattenkoffer. Wie in der Realitt soll es mglich sein, Musikstcke aus dem Koer zu whlen und diese dem jeweiligen Abspielgert zuzuordnen. Die Plattenspieler erlauben dann das getrennte Starten und Stoppen des Tracks, das Setzen einer beliebigen Liedposition und das Anpassen der Abspiel-Geschwindigkeit. Anschlieend lassen sich ber das Mischpult fr jeden Kanal (also fr jeden Plattenspieler) spezische Lautstrken und Eekte einstellen. Auch das berblenden zwischen den Kanlen mit Hilfe eines Schiebereglers (Crossfader) gilt es umzusetzen. Da beim simultanen Mischen von Musikstcken eine Vorhrfunktion nahezu unerlsslich ist, soll es spter auch mglich sein ber eine Cue-Funktion beliebige Kanle auf einen Kopfhrerausgang umzuleiten, um diese vorab synchron abmischen zu knnen. Die CoBench, eine Art Computer-Werkbank, die das Steuern einer Anwendung mit Hilfe von Multitouch erlaubt1, bietet im Zusammenspiel mit dem SDK (Vers. 1.1.585.5456) und der Tracking-Engine EVOVIS der eyefactive GmbH eine gute Grundlage fr eine derartige Anwendung. Eine Lichtshow soll das Club-Gefhl fr den Anwender noch steigern und dem Virtual Reality-Aspekt mehr Ausdruck verleihen. Diese wird dreidimensional in die CAVE, einem Wrfel mit vier Projektionschen, der dem Betrachter dank Shutter-Technik einen 3D-Eindruck vermittelt2, projiziert. Sie ist so zu realisieren, dass sie sich der gespielten Musik anpasst und mit Hilfe eines zustzlichen Panels auf der CoBenchAnwendung ber eine Netzwerkverbindung steuern lsst. Darber hinaus ist es angedacht, die in die CAVE integrierte Bodenplatte ber Filtern verschiedener Frequenzbereiche derart anzusteuern, dass der Bass fr den Benutzer verstrkt und somit deutlicher wahrgenommen wird. Die vielen Kongurationsmglichkeiten verlangen ein Men, ber das sich z.B. die einzelnen Ausgabekanle (Soundkarten/Stream) whlen lassen. Auch fr die optional aktivierbare Lichtshow bedarf es einiger zur Laufzeit nderbarer Einstellungen wie dem Hinzufgen bzw. Entfernen des Steuer-Panels und dem Anpassen der IP-Adresse und des Lichtshow-Server-Ports. Optional knnte dieses Men auch der Darstellung eines Dateibrowsers dienen, ber den sich der MusikOrdner oder auch die Textur der Slipmat, also der Filzmatte auf einem der Plattenspieler, aussuchen lassen. 1.3 Zielgruppe In erster Linie ist die Software zu Prsentationszwecken gedacht. Sie soll die Mglichkeiten der modernen Computertechnik aufzeigen und z.B. auf Messen technikinteressierte Jugendliche fr einen Informatik-Studiengang begeistern. Darber hinaus soll es das CoBench-Programm jedoch auch einem normalen DJ erlauben, mit Hilfe von Multitouch aufzulegen. Aus diesem Grund ist, ganz im Sinne der VR, unbedingt auf eine intuitive und realittsnahe Abbildung des DJ-Equipments zu achten.
1 FH Wedel Prof. Dr. Christian-A. Bohn: VR-Lab, Prof. Dr. Christian-A. Bohn, vers. 9. August 2010, 20. Dezember 2010 <http://cg.fh-wedel.de/vrlab/infrastruktur/cobench/index.html>. 2 FH Wedel Prof. Dr. Christian-A. Bohn: VR-Lab, Prof. Dr. Christian-A. Bohn, vers. 9. August 2010, 20. Dezember 2010 <http://cg.fh-wedel.de/vrlab/infrastruktur/cave/index.html>.

ALLGEMEINE PROBLEMSTELLUNG

Die CAVE-Anwendung muss voraussichtlich speziell auf die Gegebenheiten im VR-Labor der FH Wedel abgestimmt werden, weshalb ihr Einsatzbereich weitestgehend auf interne Veranstaltungen (z.B. Tag der oenen Tr) beschrnkt sein wird.

BENUTZERHANDBUCH

2. Benutzerhandbuch Die djBench ist eine Multitouch-DJ-Simulation die es dem Anwender erlaubt, wie mit einem realen DJ-Set aufzulegen. Zustzlich lsst sich mit der Software optional eine 3D-Lichtshow steuern. Auf den folgenden Seiten nden Sie alle notwendigen Informationen zu den Anwendungen, ihrer Installation und der Bedienung. Dabei unterscheidet dieses Handbuch zwischen der Multitouch-Applikation djBench fr die CoBench auf der einen Seite und dem CAVE-Programm fr die Lichtshow auf der anderen. 2.1 djBench - die CoBench-App 2.1.1 Ablaufbedingungen Damit Sie die djBench-Anwendung ausfhren knnen, muss Ihr Multitouch-System folgende Anforderungen erfllen: Mindestens: Hardware Prozessor: Speicher: Grak: Sound: Eingabegert: Software Betriebssystem: Tracking-Software: Streaming-Server: Linux: Ubuntu 9.10 EVOVIS 1.0.918 Icecast 2 in Verbindung mit Lame 3.98 (Encoding-Software) Intel Pentium mit 2.4GHz oder kompatibel 2GB Arbeitsspeicher, sowie 200MB freier Festplattenspeicher 256MB Grakkarte mit 3D-Beschleunigung, Projektor mit 1280 x 800 Pixeln (dann keine Lichtshow-Steuerung mglich) Eine Stereo-Soundkarte Standard-Tastatur (102 Tasten) und Maus zum Starten, Infrarot-Kameras (zur Steuerung der Anwendung per Multitouch)

Abhngigkeiten (Linux): Alle Abhngigkeiten, die vom eyefactive-SDK gefordert sind (install_dependencies.sh) Empfohlen: Hardware Prozessor: Speicher: Grak: Sound: Eingabegert: Software Betriebssystem: Tracking-Software: Streaming-Server: Linux: Ubuntu 9.10 EVOVIS 1.0.918 Icecast 2.3 in Verbindung mit Lame 3.98.4 (Encoding-Software) Intel Pentium mit 2.7GHz oder kompatibel 4GB Arbeitsspeicher, sowie 300MB freier Festplattenspeicher 512MB Grakkarte mit 3D-Beschleunigung, zwei Projektoren mit einer Ausung von insgesamt 2048 x 768 Pixeln (Lichtshow-Steuerung damit mglich) Zwei Stereo-Soundkarten Standard-Tastatur (102 Tasten) und Maus zum Starten, Infrarot-Kameras (zur Steuerung der Anwendung per Multitouch)

Abhngigkeiten (Linux): Alle Abhngigkeiten, die vom eyefactive-SDK gefordert sind (install_dependencies.sh)

BENUTZERHANDBUCH

2.1.2 Programminstallation Vor der Installation von djBench mssen zunchst alle Quelldateien aus dem Subversion-Repository heruntergeladen werden. In dessen Wurzel-Verzeichnis bendet sich ein Shell-Skript mit dem Namen setup.sh, welches dafr sorgt, dass alle bentigten Bibliotheken in die dafr vorgesehenen Ordner entpackt. Da beide Anwendungen (CoBench und CAVE) aus dem gleichen Repository erzeugt werden, braucht dieser Schritt nur einmalig durchgefhrt werden. Um eine ausfhrbare Datei des Programms zu erhalten, muss die Anwendung mit Hilfe des enthaltenen Makeles kompiliert werden. Dazu gengt ein Aufruf von make -f djb_Makele ber eine Shell Konsole. Anschlieend bendet sich im bin-Ordner die Datei, mit der die Applikation gestartet werden kann. 2.1.3 Programmstart Bevor Sie djBench starten, muss die Tracking-Engine EVOVIS aktiviert werden. Beim Starten auf einem System mit den Mindestanforderungen, sollte EVOVIS mit Hilfe des taskset-Befehls3 fest an den ersten verfgbaren Prozessor gebunden werden. Andernfalls kann es beim Verwenden der djBench zu Tonaussetzern oder Grakfehlern kommen. Wenn Sie bereits im Vorfeld wissen, das Sie als Ausgabekanal einen Stream nutzen mchten (z.B. wenn Sie die djBench zusammen mit der Lichtshow in der CAVE betreiben wollen), muss vor Programmstart auch ein Icecast-Server gestartet werden. Hierfr nutzen Sie bitte die Icecast-Kongurationsdatei icecast_djBench.xml aus dem Ordner bin/djBench/ des Installationspfades. Standardmig sind die Einstellungen so vorkonguriert, dass sich die Anwendung bei Bedarf mit einem lokal gestarteten Icecast-Server (IP-Adresse: 127.0.0.1 Port: 8000) verbindet. Alternativ knnen sie den Server auch auf einem externen System starten und ber das Netzwerk eine Verbindung aufbauen. Hierzu mssen Sie lediglich mit Hilfe eines Editors in der Datei settings_djBench.ini im Ordner bin/djBench/data/ (Installationspfad) die Eintrge shoutcastSource und shoutcastListener anpassen. Weitere Einstellungsmglichkeiten sind in der Datei dokumentiert. Beachten sie bitte, dass nderungen in der Icecast-Kongurationsdatei (z.B. das Umstellen der Portnummern) in jedem Fall eine Anpassung der INI-Datei nach sich ziehen! Anschlieend starten Sie die djBench-Anwendung, indem Sie das Shell-Skript djBench_gamemode.sh bzw. djBench_gamemode_taskset.sh im Ordner bin/djBench/ ausfhren. Im ersten Fall wird die Software normal gestartet, sodass das Betriebssystem die Verteilung der Prozesse auf die verschiedenen CPUs vornimmt. Diese Variante ist fr Systeme gedacht, die den empfohlenen Hardware-Anforderungen entsprechen. Das zweite Shell-Skript bindet das Programm fest an den zweiten Prozessor. Wenn Sie EVOVIS, wie bereits im ersten Absatz dieses Kapitels beschrieben, fest an den ersten Prozessor gebunden haben, sollten Sie zum Starten der Anwendung dieses Skript benutzen. Somit ist gewhrleistet, dass sich die ressourcenhungrige Tracking-Software und die DJ-Simulation gegenseitig nicht negativ beeinussen und es zu keinen Soundoder Grakfehlern kommt. 2.1.4 Bedienungsanleitung In diesem Kapitel wird Ihnen anschaulich der Umgang mit der djBench sowie den enthaltenen Funktionen und Einstellungsmglichkeiten erklrt. 2.1.4.1 Die Oberche Unmittelbar nach Programmstart erscheint der Hauptbildschirm des Programms mit dem Kongurationsmen im Vordergrund. Die folgenden Unterabschnitte bringen Ihnen die Oberche nher und zeigen Ihnen, wo Sie welche Funktionalitt nden.

3 taskset(1) - Linux man page, Robert M. Love, 27.02.2011 <http://linux.die.net/man/1/taskset>.

BENUTZERHANDBUCH

2.1.4.1.1 Kongurations-Men

Abbildung 2a: Settings-Men mit Hauptfenster im Hintergrund.

Im Kongurations-Men knnen Sie die Ausgabegerte fr den Ton whlen und eine Verbindung zur CAVE herstellen, um zustzlich ein Steuerpult fr die Lichtshow zu aktivieren. Es erscheint beim Programmstart, lsst sich jedoch auch zu einem spter jederzeit ber den Settings-Button im Hauptfenster (siehe Pkt. 2.1.4.1.2) nen. Die Optionen fr die Soundausgabe (Dialoggruppe Sound) erscheinen beim berhren des Eingabefeldes als Dropdown-Men. Der Master Output bezeichnet dabei den Haupt-Ausgabekanal, also den Ton, der nach dem Mixen und Belegen mit Eekten ausgegeben wird. Wenn Sie die Option Streaming-Server whlen, stellen Sie bitte im Vorfeld sicher, dass ein Icecast-Server gestartet und alle Voreinstellungen hierfr korrekt getroen wurden. ber den Cue Output lsst sich zustzlich ein Ausgabegert fr das Vorhren whlen. Wenn Sie die Steuerung der Lichtshow (Dialoggruppe Lightshow) aktivieren mchten (durch Berhren des Eingabefeldes Enable einen Haken setzen), sind zuvor die CAVE-Applikation zu starten (siehe dazu: 2.2.3) und als Master Output (unter Sound) die Option Streaming-Server zu whlen. Im Feld IP-Adress und Port mssen die IP-Adresse und der Port der CAVE angegeben werden, auf der die Lichtshow luft. Hier erscheint jeweils eine virtuelle Tastatur beim Berhren des Feldes, die die Eingabe der gewnschten Werte erlaubt. Sollten entweder das Lichtshow-Programm noch nicht gestartet worden oder die IP- bzw. PortEinstellung fehlerhaft sein, erscheint beim Besttigen des Dialogs mit OK eine Fehlermeldung im unteren Fensterbereich.

BENUTZERHANDBUCH

2.1.4.1.2 Hauptbildschirm

Abbildung 2b: Das Hauptfenster mit aktiviertem Lichtmischpult.

Auf dem Hauptbildschirm benden sich alle fr das Auegen bentigten Gerte, also zwei virtuelle Plattenspieler, ein Mixer und ein virtueller Plattenkoer. Optional knnen Sie ber das Kongurations-Men zustzlich ein Lichtmischpult aktivieren (s.o.). Zwei Buttons erlauben sowohl das Anzeigen des Kongurationsmens (Settings), als auch das Festsetzen bzw. Lsen der Gertepositionen (Positions). Erscheint das Schloss-Icon auf dem Positions-Knopf geschlossen und rot gefrbt, sind die Gerte an ihrer aktuellen Position xiert. Ist es hingegen genet und grn, knnen sie an bestimmten Punkten mit den Fingern angefasst und beliebig auf der Oberche verschoben werden. Der Plattenkoer

Abbildung 2c: Die virtuelle Plattenkiste.

hnlich wie beim von Apple-Produkten bekannten Cover Flow4 stehen auch auf der djBench die einzelnen Stcke der Musik-Bibliothek zur Verfgung. Wahlweise kann man hier ber das Wischen mit einem einzelnen Finger ber den Cover-Bereich (Abb. 2c, Nr.1) oder das Verschieben des Scroll-Balken (Abb. 2c, Nr. 2) durch die Musik-Bibliothek navigieren. Zur besseren Orientierung werden in der Statusleiste (Abb. 2c, Nr. 3) auerdem der Titel des Songs, der Knstler und der Albumname des hervorgehobenen Musikstcks (in der Mitte des Cover-Bereichs) angezeigt. Das bettigen des Buttons Change Folder im oberen, rechten Bereich des Plattenkoers net das Men
4 Cover Flow Wikipedia, vers. 5. Oktober 2010, 26.02.2011 <http://de.wikipedia.org/wiki/Cover_Flow>.

BENUTZERHANDBUCH

fr die Auswahl des Musikordners (siehe Punkt 2.1.4.1.3), dessen Inhalt zur Verfgung gestellt werden soll. Der Knopf Reload Library neben der Statusleiste erlaubt das Leeren des Bibliothek-Caches und neu-laden des kompletten Ordner-Inhalts. Diese Option ist vor allen Dingen dann wichtig, wenn neue MP3-Dateien in einen Ordner kopiert wurden und diese noch nicht im Cache enthalten sind bzw. in der Bibliothek angezeigt werden. Die Plattenspieler

Abbildung 2d: Der Plattenspieler mit aufgelegtem Musikstck.

Von der Gestaltung der Oberche hnelt der Plattenspieler sehr seinem realen Pendant. Um ihn zu starten, muss der Start/Stop-Schalter (Abb. 2d, Nr. 1) bettigt werden. Ist zustzlich eine Platte aus dem Plattenkoer aufgelegt (Beschreibung siehe Kapitel 2.1.4.2.2), lsst sich der Tonarm (Abb. 2d, Nr. 2) per Drag & Drop mit dem Finger an die gewnschte Liedposition bewegen, wobei der Lied-Anfang auen und das Lied-Ende innen liegen. Alternativ knnen Sie die Position auch ber den Scroll-Balken im Track-Display (Abb. 2d, Nr. 3) setzen. Auerdem werden in dieser Anzeige noch das Coverbild, der Song- und Knstler-Name, sowie die aktuell verstrichene und die verbleibende Track-Zeit des spielenden Liedes dargestellt. Zur Anpassung der Abspielgeschwindigkeit dient der Pitch-Regler (Abb. 2d, Nr. 4). Den aktuellen Pitch-Wert knnen Sie vom LC-Display (Abb. 2d, Nr. 5) ablesen und ber die nebenstehenden Plus-/Minustasten feinjustieren. Der Plattenteller ist komplett beweglich und erlaubt somit zustzlich ein Anschieben Abbremsen und Scratchen der Platte. Beim Berhren mit zwei gespreizten Fingern, wird der Teller leicht um einen konstanten Wert (1,5%) gebremst, was das Anpassen zweier parallel laufender Tracks vereinfacht. Rechts neben dem Track-Display benden sich schlielich noch zwei Buttons (Abb. 2d, Nr. 6). Der Linke net mit einem Touch das Slipmat-Auswahlmen (siehe Punkt 2.1.4.1.3) ber das Sie eine eigene Hintergrund-Textur fr den Plattenteller whlen knnen. Der rechte Eject-Knopf entfernt, hnlich wie bei einem CD-Player, die aufgelegte Platte vom Spieler und stoppt den Drehteller.

BENUTZERHANDBUCH

Der Mixer

Abbildung 2e: Das 2-Kanal-Mischpult.

Der Mixer stellt das Herzstck der djBench dar. Mit ihm kann der komplette Ton bearbeitet und angepasst werden. Neben der getrennten Lautstrkeregelung fr jeden Kanal und einem Crossfader, stehen zustzlich eine Eekt-Einheit und eine separate Vorhr-Regelung fr den Kopfhrerausgang zur Verfgung. Der Master Output lsst sich mittels zweier Drehregler, Balance und Level, in seiner rumlichen Verteilung (links/rechts) und seiner Intensitt anpassen (Abb. 2e, Nr. 1). Eine Bargraph-Anzeige der dB-Werte hilft Ihnen auerdem bei der korrekten Justierung. Fr jeden Plattenspieler stehen eine Gruppe von Dreh- und Schiebereglern, sowie ein Cue-Knopf zur Verfgung (Abb. 2e, Nr. 2). Dem bei Programmstart linken Plattenspieler ist dabei der Kanal mit der 1 zugeordnet und dem Rechten der Kanal 2. ber die Schieberegler lsst sich intuitiv die jeweilige Kanal-Lautstrke whlen und mit der dB-Anzeige berprfen. Ein Drehen der Knpfe mit den Bezeichnungen Hi, Mid und Low verndert den entsprechenden Bereich des Frequenzbandes, sodass sich beispielsweise Bsse verstrken lassen. Bei besonders leise oder laut aufgenommenen Musikstcken hilft der Gain-Regler und hebt bzw. senkt die Lautstrke des Tracks auf ein ertrgliches Niveau. Durch aktivieren des Cue-Knopfes wird der dazugehrige Kanal zustzlich auf den Cue Output gelegt und kann mit dem Kopfhrer vorgehrt werden. Um zwischen den beiden Kanlen hin und her zu blenden, muss der Crossfader (Abb. 2e, Nr. 3) entweder nach links (Kanal 1) oder rechts (Kanal 2) verschoben werden. ber den Mixing-Drehknopf im Phones-Bereich (Abb. 2e, Nr. 4) knnen Sie, hnlich wie beim Crossfader, zwischen dem Cue Output und dem Master Output umschalten, sofern der Cue-Button aktiviert ist. Der gemixte Ton ist dann ausschlielich ber den Vorhr-Kanal, also in der Regel ber an die Cue Soundkarte angeschlossene Kopfhrer, zu hren. Auch die Lautstrke fr den Cue Ausgang lsst sich ber Level separat anpassen. Die Eekt-Einheit (Abb. 2e, Nr. 5) bietet Ihnen eine weitere Mglichkeit den Sound aktiv zu verndern. Hierfr stehen zwei Eekte zur Verfgung, ein Echo (Button Nr. 1) und ein sogenannter Flanger (Button Nr. 2), zwischen denen Sie per Knopfdruck whlen knnen. Zustzlich sind diese Eekte ber die Drehknpfe Time und Depth vernderbar. ber Time stellen Sie die Millisekunden ein, um die der Eekt verschoben wirkt. Den aktuellen Wert knnen Sie im Display ber den Eekt-Auswahl-Buttons ablesen. Mit Depth lsst sich die Strke beeinussen. Dry bedeutet dabei wenig hrbar und Wet beschreibt einen deutlich wahrnehmbaren Eekt. Der gewhlte Eekt lsst sich dann bei Bedarf ber den Eect On/O-Schalter zuschalten. Ist er eingeschaltet, leuchtet der Knopf gelblich.

BENUTZERHANDBUCH

Das Lightshow-Pult

Abbildung 2f: Das Lichtmischpult.

Wenn Sie die djBench zusammen mit der CAVE-Lichtshow betreiben, knnen Sie diese ber das LightshowPult steuern. Die Lichtshow beinhaltet in der Regel mehrere Visualisierungen, zwischen denen Sie mit Hilfe der Pfeiltasten im Display (Abb. 2f, Nr. 1) hin- und herschalten knnen. Die aktuell gewhlte Visualisierung erscheint jeweils im Display, links neben den Pfeiltasten. Zustzlich benden sich in der unteren Reihe des Displays anschaulich die Zahlenwerte der darunter liegenden Schieberegler. Im Feld Light-Color (Abb. 2f, Nr. 2) nden Sie verschiedenfarbige Schalter mit eine Frbung fr die Visualisierung ausgewhlt werden kann. Der Knopf Shue (wei) bedeutet, dass die Frbung sich in regelmigen Abstnden automatisch ndert. Vier Slider unterhalb der Lichtfarbe (Abb 2f, Nr. 3) ermglichen eine weitere Konguration der Show. Ist als Lichtfarbe Shue gewhlt, beeinussen Fading die berblendzeit zwischen den verschiedenen Farben und Pause die Zeit zwischen den berblendungen. Im Display erscheint die jeweilige Zeit in Millisekunden. Lucency steht fr den prozentualen Grad der Transparenz der erscheinenden Objekte. Auerdem bieten einige Visualisierungen die Mglichkeit, einen weiteren Parameter zu beeinussen (z.B. die Detailgenauigkeit einer Kugeldarstellung). Hierfr ist der Custom-Regler gedacht, der in diesem Fall entsperrt wird und ber den Sie dann einen Prozentwert einstellen knnen.

BENUTZERHANDBUCH

Der Dateibrowser

Abbildung 2g: Der Dateibrowser fr die Musikordner-Auswahl.

Den Dateibrowser erreichen Sie entweder beim Wechseln des Musikordners oder bei der Auswahl einer Slipmat-Textur. Da er in beiden Fllen gleich funktioniert, wird hier exemplarisch die Musikordner-Auswahl beschrieben. Nach dem nen des Menfensters erscheint der Browser in Form einer Dialoggruppe. In der berschrift werden (maximal) die letzten drei Ordner des aktuellen Pfades und das Ordner aufwrts-Symbol abgebildet, wobei der gewhlte Ordner hellgrau erscheint (Abb. 2g, Nr. 1). Durch Berhren eines der Pfadelemente wechseln Sie in diesen Ordner. Die Unterordner des aktuellen Pfades werden im Bereich Browse Folder (Abb. 2g, Nr. 2) dargestellt. Wenn Sie in der Ordnerstruktur eine Ebene tiefer gehen mchten, knnen Sie hier den entsprechenden Ordner whlen. Die Ansicht aktualisiert sich unmittelbar nach Ihrer Wahl. Sollten mehr Objekte im Ordner enthalten sein als die Auswahlbox Platz bietet, knnen Sie durch Wischen ber den dunkelgrauen, mit Pfeilen markierten Bereich hoch- und runter-scrollen. Im Select-Bereich (Abb. 2g, Nr. 3) erscheinen alle auswhlbaren Objekte. Beim Musik-Ordner-Auswahlmen sind es Dateiordner, im Falle des Slipmat-Mens eine Reihe von Bilddateien. Auch diese Liste ist scrollbar. Wenn Sie das gewnschte Objekt gefunden haben, ist dieses ber einen Touch selektierbar. Der Hintergrund eines selektierten Objekts verfrbt sich dunkelgrau. Durch Besttigen Ihrer Auswahl mit Ok wird diese bernommen und das Menfenster wird geschlossen. 2.1.4.2 Der Programmablauf Nach Konguration des Settings-Mens zu Programmstart ist die djBench einsatzbereit. In diesem Abschnitt werden einige Situationen beschrieben, die Ihnen den Einstieg in die Verwendung der Software erleichtern sollen. 2.1.4.2.1 Die Musikbibliothek wechseln Im Plattenkoer werden stets alle der im gewhlten Ordner und seinen Unterordnern enthaltenen MP3-Dateien angezeigt. Um einen neuen Ordner als Bibliothek zu laden, mssen Sie den Button Change Folder im Plattenkoer berhren und im Dateibrowser einen neuen Ordner auswhlen.

10

BENUTZERHANDBUCH

2.1.4.2.2 Eine Platte auegen Whlen Sie bitte zunchst den gewnschten Musiktitel im Plattenkoer aus. Anschlieend mssen Sie das Cover des Tracks mit zwei gespreizten Fingern berhren und die erscheinende Kopie des Coverbilds auf den gewnschten Plattenspieler ziehen. Beim Loslassen verschwindet das Coverbild und die Platte wird aufgelegt. 2.1.4.2.3 Einen bergang zwischen zwei Tracks erzeugen Legen sie die beiden Musikstcke auf je einen Plattenspieler auf. Den Crossfader verschieben Sie anschlieend in die Richtung des zuerst abzuspielenden Liedes. Starten Sie beide Musikstcke und schieben Sie den Lautstrkeregler des ersten Stcks hoch. Der Titel ist ber den Master Output zu hren. Anschlieend schieben Sie entsprechend den Regler des zweiten Kanals hoch und aktivieren seinen Cue. Dieser Track ist dann einzig ber den Cue-Ausgang, also in der Regel per Kopfhrer, zu hren. Wenn Sie nun auch den Cue-Button des Kopfhrer-Ausgangs aktivieren, hren Sie den auf dem Master-Ausgang liegenden ersten Titel parallel im Kopfhrer. Jetzt haben Sie die Mglichkeit den zweiten Titel (z.B. in seiner Geschwindigkeit) auf den Ersten abzustimmen. Anschlieend knnen Sie mit dem Crossfader zum anderen Kanal berblenden. 2.1.4.2.4 Einen Eekt hinzufgen Um einen Eekt auf den Master Output zu legen, whlen Sie diesen bitte zunchst aus und kongurieren ihn ber die Drehknpfe der Eekt-Einheit. Danach lsst sich der eingestellte Eekt jederzeit ber die Eect On/ O-Taste zuschalten. 2.1.4.2.5 Die Slipmats tauschen ber das Slipmat wechseln-Symbol des entsprechenden Plattenspielers gelangen Sie zum Dateibrowser. Hier knnen Sie durch Ihr Dateisystem browsen und die gewnschte Grakdatei auswhlen. Nach der Besttigung mit Ok wird die Textur auf den Plattenspieler geladen. 2.1.5 Fehlermeldungen Bei der Ausfhrung des Programms kann es zu Fehlern bei der Bedienung kommen. In den folgenden Listen nden Sie alle mglichen auftretenden Fehler mit Erklrung und entsprechenden Lsungsvorschlgen. Die Listen sind nach Erscheinungsort gegliedert. 2.1.5.1 Settings-Men Fehlermeldung Select StreamingServer as Master! Bedeutung Die Lichtshow wurde aktiviert aber als Master Output wurde kein Stream gewhlt. Es konnte keine Verbindung zum in der settings_djBench.ini angegebenen Server aufgebaut werden, da dieser entweder nicht gestartet wurde oder falsch konguriert wurde. Lichtshow soll aktiviert werden, aber es ist nicht genug Platz auf Bildschirm, um das Steuerpult anzeigen zu lassen. Lsung Da die Lichtshow als Eingangssignal einen Stream bentigt, mssen Sie einen Streaming-Server starten und diesen als Master Output whlen. Icecast starten bzw. die Einstellungen in der settings_djBench.ini (im Unterordner bin/data/) und icecast_djBench.xml (im Ordner bin/djBench/icecast/) korrigieren. Anwendung ohne Lichtshow oder auf einem Device mit hherer Ausung starten.

Please start StreamingServer rst!

Display too small!

Could not connect to Cave! Device could not be found!

Lichtshow-Steuerung soll aktiviert IP-Adresse und Port korrigieren bzw. werden, aber es konnte keine Verbin- Lichtshow-Applikation auf der CAVE stardung zur CAVE aufgebaut werden. ten. Fehler bei der Auswahl der Soundkarte. Falls z.B. eine USB-Soundkarte nach dem Programmstart entfernt wurde, die Software neustarten. 11

BENUTZERHANDBUCH

2.1.5.2 Plattenkoer Fehlermeldung No Library could be found! 2.1.5.3 Dateibrowser Fehlermeldung Please select a le. Bedeutung Im Select-Feld wurde noch keine gltige Datei gewhlt. Lsung Eine im Select-Feld angezeigte Datei whlen und mit Ok besttigen. Einen im Select-Feld angezeigten Ordner whlen und mit Ok besttigen. Bedeutung In dem eingestellten Musikordner wurde keine Musik gefunden. Lsung ber Change Folder kann im Dateibrowser ein anderer Musikordner gewhlt werden.

Please select a folder. Im Select-Feld wurde noch kein gltiger Ordner gewhlt.

2.1.6 Wiederanlaufbedingungen Im Falle eines unplanmigen Programmabbruchs (z.B. durch Stromausfall oder Systemfehler) gehen sowohl die Daten ber den derzeit geladenen Musikordner, als auch alle aktuellen Einstellungen auf dem Mischpult, den Plattenspielern und im Settings-Men verloren. Sobald Ihr System wieder ordnungsgem arbeitet, kann auch die djBench wie gewohnt ausgefhrt werden. 2.2 Lightshow - die CAVE-App 2.2.1 Ablaufbedingungen Fr die Lighshow wird eine spezielle Umgebung bentigt, die die Bilder der Anwendung dreidimensional darstellen kann. Das CAVE-System der Fachhochschule Wedel bietet hierfr ein geeignetes Framework, um mglichst einfach mehrdimensionale Anwendungen zu entwickeln. Die CAVE besteht aus mehreren einzelnen Rechnern ist nach auen als geschlossenes System mit dem Netzwerk verbunden. Um die Software zu starten wird deshalb zustzlich eine SSH-Verbindung von einem beliebigen Computer aus bentigt. Unabhngig davon gelten folgende Anforderungen an die verwendete Hard- bzw. Software: Hardware Eingabegerte: Sound: Software Abhngigkeiten (Linux): Boost (vers. 1.38) - fr Netzwerk-Kommunikation 2.2.2 Programminstallation Um eine ausfhrbare Datei des Programms zu erhalten, muss die Anwendung mit Hilfe des enthaltenen Makeles kompiliert werden. Dazu gengt ein Aufruf von make release ber eine Shell Konsole. Anschlieend bendet sich im bin-Ordner die Datei, mit der die Applikation gestartet werden kann. Soll das Verzeichnis nach dem Kompiliervorgang bereinigt werden, ist make clean der entsprechende Befehl. Neben der ausfhrbaren Datei im bin-Ordner existiert ein Shell-Skript zum Starten, das einige Einstellungen automatisch vornimmt. 2.2.3 Programmstart Bevor das Programm gestartet werden kann, muss zuerst die CAVE vorbereitet werden. Dazu gehrt, dass die dazugehrigen Computer gestartet und die Projektoren eingeschaltet sind. Dies wird hier nicht weiter erlutert. Fr nhere Informationen bendet sich eine Anleitung auf dem Handout-Server der FH Wedel (Ordner: https://stud.fh-wedel.de/handout/Egge/VR/). Optional knnen noch die Tracking-Kameras gestartet werden. 12 Tracking-Kameras zur Bestimmung des Ortes des Benutzers (optional) Mindestens 2 Lautsprecher, empfohlen wird eine 5.1 Soundanlage

BENUTZERHANDBUCH

Da die Anwendung Musik-Daten bentigt, um ein vernnftiges Bild zu erzeugen, verbindet sie sich nach dem Starten mit einem Streaming-Server. Deshalb sollte vorher eingestellt werden, wie die IP dieses Servers ist und ob ein Proxy verwendet wird. Dafr mssen die Adressen in einer INI-Datei stehen, die als erster Parameter in das Programm gegeben wird. Wenn die Lichtshow zusammen mit djBench benutzt wird, muss auerdem die IP des Streaming-Servers, der die Daten der CoBench empfngt, angegeben werden. Mit folgenden Zeilen wird der Server konguriert:
01 [DJBENCH] 02 ; URI des Streaming Servers 03 CAST_SERVER_URI = http://127.0.0.1:8001/stream.m3u 04 ; Proxy-Server verwenden? (leer lassen, falls kein Proxy verwendet werden soll) 05 ; Beispiel: http://cwlan-cache.fh-wedel.de:3128 06 PROXY =

Fr das CAVE-Framework sind zustzliche Einstellungen notwendig. Dafr gibt es vorgefertigte INI-Dateien, die sich im Verzeichnis bin/djBenchVisualizer/res benden. Dort stehen die obigen Zeilen bereits drin. Wird zum Starten die start_stereo.sh verwendet, wird die 4Screens_passiveStereo_chromium_fullscreen.ini benutzt. Zum Testen des Programms auf einem normalen PC gibt es die start.sh, die alle vier Bilder der Projektoren in einem Fenster darstellt. Sobald die Verbindung mit dem Streaming-Server hergestellt wurde, steht in der Konsole die Zeile Create Mixer... done!. Nun knnen Befehle wie das Wechseln der Visualisierung ausgefhrt werden. Die CoBench-Anwendung kann sich zudem nun verbinden und die Steuerung bernehmen. 2.2.4 Bedienungsanleitung Bei der Anwendung handelt es sich um ein Konsolen-Programm, weshalb es keine grasche Oberche zur Verfgung stellt, mit der Aktionen durchgefhrt werden knnen. Aber es ist mglich die Visualisierungen ber das Netzwerk zu steuern. Das CoBench-Programm nutzt diese Schnittstelle, um die Lichtshow zu beeinussen. Nachdem die CAVE-Applikation gestartet wurde und mit einem Streaming-Server verbunden ist, knnen Kommandos gesendet werden. Folgende Befehle sind mglich: Wechseln zur vorherigen bzw. nchsten Visualisierung (insgesamt vier mgliche Visualisierungen) Setzen einer bestimmten Farbe oder des automatischen Farbwechsels Den Zeitabstand zwischen zwei Visualisierungen und zwischen zwei kongurieren Die Transparenz der Visualisierung einstellen Einen von der aktuellen Visualisierung beliebig genutzten Wert verndern Wird die CoBench-Anwendung verwendet, muss das Lichtshow-Modul in den Einstellungen aktiviert werden. Anschlieend stehen einige Knpfe und Regler mit den oben beschriebenen Funktionen zur Verfgung. Nhere Informationen hierzu benden sich im Abschnitt 1.2.4.

13

BENUTZERHANDBUCH

Visualisierungen Towers

Abbildung 2h: Towers-Visualisierung.

In einer matrixfrmigen Anordnung in der Gre 5x5 sind quadratische Blcke auf dem Boden zu sehen. Die Hhe der Balken passt sich den Frequenzen der Musik an, wobei in der Mitte die tiefen und nach auen hin die hheren Tne visualisiert werden. Der Custom-Wert kann nicht genutzt werden. Hurricane

Abbildung 2i: Hurricane-Visualisierung.

In dieser zweiten Visualisierung wurde ein Partikelsystem zur Hilfe genommen, um kleine Kugeln vom Boden aus in die Hhe zu schieen. Sie starten alle an der gleichen Position und zerstreuen sich je nach Frequenzausschlag kreisfrmig nach auen. Es knnen keine Vernderungen ber den Custom-Wert vorgenommen werden. Sphere

Abbildung 2j: Sphere-Visualisierung.

Bei Sphere handelt es sich um eine relativ einfache Visualisierung. Sie besteht lediglich aus einem Ball, dessen Gre sich nach der mittleren Frequenz richtet. ber den Custom-Wert ist es mglich, die Genauigkeit der Rundung anzupassen. Ist der Wert niedrig, so wird die Kugel eckiger und im Minimun ein Tetraeder. Je grer der Wert ist desto glatter wird der Ball.

14

BENUTZERHANDBUCH

Wave

Abbildung 2k: Wave-Visualisierung.

Wie der Name bereits verrt, ist bei Wave eine Art Welle dargestellt. Diese kommt dem Benutzer quasi entgegen und besteht aus mehreren horizontalen Linien. Auf ihnen sind die aktuellen Frequenzen von links nach rechts in tief bis hoch abgebildet. Der Custom-Wert ist deaktiviert. 2.2.5 Fehlermeldungen Fehlermeldung BASS_Init failed Bedeutung Lsung Der Ton konnte nicht ordnungsgem BASS_Init bernimmt das Verbinden mit gestartet werden. der Soundkarte und konnte dies nicht durchfhren. Eventuell ist die Soundkarte von einem anderen Programm belegt. Bitte berprfen Sie dieses und beenden gegebenenfalls die andere Anwendung. Fr nhere Informationen kann der mitgelieferte BASS-Fehler-Code herangezogen werden. Die Anwendung konnte keine VerbinBitte berprfen Sie die IP in der INI-Datei. dung zum Streaming-Server herstellen. Mglicherweise liegt ein Schreibfehler vor. Unter Umstnden ist auch ein ProxyServer notwendig, der ebenfalls in der INI-Datei eingestellt werden kann. Ansonsten kann fr nhere Informationen der mitgelieferte BASS-Fehler-Code benutzt werden. Der Mixer-Kanal zur Erzeugung des 5.1-Sounds konnte nicht erstellt werden. Mglicherweise liefert der Streaming-Server ungltige Audio-Daten oder das Format der Daten kann von der Anwendung nicht verarbeitet werden. Bitte versuchen Sie es mit einem anderen Streaming-Server. Die Sound-Kanle wurden nicht ordnungsgem initialisiert. Bitte starten Sie die Anwendung neu. Der Streaming-Server liefert Audio-Daten, die nicht von der Anwendung verarbeitet werden knnen.

Connection to streaming server failed

Could not create Mixer

No sound data available Could not play sound

Es ist kein Ton zum Abspielen vorhanden. Der Ton kann nicht abgespielt werden.

2.2.6 Wiederanlaufbedingungen Nach einem Absturz der Anwendung kann sie ohne Probleme neugestartet werden. Die Einstellung, welche Visualisierung gerade aktiv war und die anderen Kongurationswerte gehen allerdings verloren.

15

PROGRAMMIERHANDBUCH

3. Programmierhandbuch Das Programmierhandbuch enthlt neben den Informationen zu der bei der Entwicklung eingesetzten Hardund Software vor allen Dingen eine Analyse der Problemstellung und die daraus resultierenden Ideen und Lsungen fr die Umsetzung. 3.1 Entwicklungskonguration Die Computersysteme und Komponenten mit deren Hilfe die Software entwickelt wurde kann in vielerlei Hinsicht von Interesse sein und wird deswegen in diesem Kapitel aufgefhrt. Die fr die Entwicklung relevante Hardwareumgebungen waren zum Einen die Rechner des VR-Labors, auf denen die Hauptentwicklung der Software stattfand und zum Anderen die CoBench von Eyefactive. Im folgenden ist die Konguration der jeweiligen Systeme aufgefhrt. VR-Rechner: Prozessor: Arbeitsspeicher: Grakkarte: Soundkarte: Betriebssystem: CoBench: Prozessor: Arbeitsspeicher: Grakkarte: Soundkarten (extern): Betriebssystem: Intel Core 6600, 2.4GHz 2GB Nvidia GeForce 8800 GTS Delock USB Sound Box 7.1, Speedlink USB 2.0 Mini-Soundkarte Linux Ubuntu 9.10 Intel Core i5 750, 2.67GHz 2GB Nvidia GeForce GTX 275 HDA Intel (STAC92xx) Linux Ubuntu 9.10

3.2 Problemanalyse Einer der wichtigsten Aspekte bei der Umsetzung des gewhlten Projekts ist die mglichst realittsnahe Abbildung des DJ-Sets mitsamt Tanzche in die virtuelle Realitt. Dieser Abschnitt befasst sich daher exemplarisch mit einigen der nachzubildenden Gerte bzw. Objekte sowie den daraus resultierenden Problemstellungen und diskutiert mgliche Anstze hinsichtlich der Umsetzung. Bei der CoBench-Anwendung gilt es mglichst viele der bereits im Multitouch-SDK implementierten und getesteten Funktionalitten zu nutzen und sie bei Bedarf um eigene zu erweitern. Unter diesem Gesichtspunkt wird an einigen Stellen bereits in der Analyse auf das SDK verwiesen. 3.2.1 Benutzeroberche Als wesentliche Vorlage fr die Programm-Oberche dient ein Auege-Set, bestehend aus zwei Plattenspielern und einem 2-Kanal-Mischpult fr den Sound. Zustzlich werden eine Art virtueller Plattenkoer, ber den sich die aufzulegenden Lieder whlen lassen, und eine Steuereinheit fr die Lichtshow bentigt. Auch ein Konzept fr die Menfhrung zur Konguration einzelner Komponenten ist unerlsslich. Texturen Zunchst gilt es die Objekte, die auf der Oberche erscheinen sollen, grob anzuordnen und zu skizzieren. Darauf aufbauend entstehen immer feinere und genauere Abbildungen des tatschlichen Interfaces. Im letzten Schritt mssen die Materialien der jeweiligen Elemente in einzelne Textur-Graken extrahiert werden. Damit die verschiedenen Bilddateien und verwendeten Schriftarten bei Korrekturen whrend der Umsetzung problemlos ausgetauscht werden knnen, sollte ihre Verwaltung gebndelt werden und zentral zugreifbar sein. 16

PROGRAMMIERHANDBUCH

Plattenspieler Ein realer Plattenspieler bietet neben dem einfachen Abspielen und Stoppen eines Musikstcks auch Mglichkeiten zur Anpassung der Geschwindigkeit und zum direkten Sprung an eine bestimmte Liedposition mit Hilfe des Tonarms. Aufbauend auf das Widget-Konzept des Frameworks scheint es sinnvoll, die einzelnen beweglichen Bauteile als eigenstndige Widgets zu implementieren. Mit Hilfe eines Event-Listeners und selbst denierten Auslsern knnen somit zur Laufzeit verschiedene Funktionen angesteuert werden. Mit einem Tempo von etwa 45 U/min soll sich der Plattenteller nach Aktivierung durch einen Start/StopKnopf drehen. Der Musiktitel wird dann (bei aufgesetzter Nadel) in seiner Originalgeschwindigkeit abgespielt. Darber hinaus gilt es das Beschleunigungs- und Abbremsverhalten mittels Touches zu simulieren. Da auf der CoBench zwar Berhrungen erkannt werden jedoch nicht ihre Druck-Intensitt, soll ein leichtes, konstantes Bremsen der Platte ber das Auegen von zwei Fingern mglich sein. Bei der Umsetzung des Pitch-Schiebereglers, der die stufenlose Anpassung der Abspielgeschwindigkeit in einem gewissen Bereich ermglicht, spielt die Sensibilitt des Multitouch-Systems eine wichtige Rolle. Weil die Pitch-Einstellungen unter Umstnden bis auf zwei Nachkommastellen korrekt sein mssen, sind bei der Realisierung ggf. zustzliche Vorkehrungen zur Feinjustierung zu treen. Wie sein echtes Vorbild soll sich der virtuelle Tonarm per Drag & Drop an beliebiger Lied-Position auf der Platte absetzen lassen. Der aktuelle Winkel beim Loslassen muss dann in die entsprechende Track-Zeit umgerechnet werden (Nadel innen entspricht 100%, Nadel auen 0% der Liedlnge). Demzufolge muss es der abgesetzten Tonkopf optisch, wie beim Original, mit zunehmender Spielzeit immer weiter zum Mittelpunkt der Schallplatte wandern. Zustzlich ist ein LC-Display angedacht, auf dem aktuelle Liedinformationen des aufgelegten Titels, sowie ein Statusbalken fr die Lnge des Tracks erscheinen. Die notwendigen Daten mssen zur Laufzeit aus dem ID3-Tag extrahiert bzw. ber die Soundbibliothek ausgelesen und mit dem Text-Objekt des Frameworks dargestellt werden. Mischpulte fr Sound und Licht Die Mischpulte bestehen im Wesentlichen aus Dreh- bzw. Schiebereglern, unterschiedlichen Druck-Knpfen, und Displays. Diese mssen im Hintergrund, ber das Auslsen von Events (hnlich wie beim Plattenspieler), die unterschiedlichen Funktionen der Sound- bzw. Lichtsteuerung aufrufen. Fr die Druck-Knpfe stehen im SDK bereits die notwendigen PushButton-Widgets zur Verfgung. Die brigen Regler mssen mit Hilfe des SDK selbst entwickelt werden. Um Code-Dopplung zu vermeiden sollte bei der Umsetzung darauf geachtet werden, hnliche Widgets zusammenzufassen und ber Parameter kongurierbar zu machen. Die Schieberegler beispielsweise unterscheiden sich lediglich in ihren Texturen und ihrer Neutralstellung. Daher knnten sowohl der Pitch-Slider auf dem Plattenspieler, als auch die Lautstrkeregler auf dem Mixer mit Hilfe desselben Widgets realisiert werden. hnlich verhlt es sich mit den Drehknpfen. Neben den Texturen mssten hier die Anschlge in Form von Min-/Max-Winkeln kongurierbar sein. Menfhrung Beim Start der Anwendung soll ein Kongurationsmen die Mglichkeit geben, die Ausgabe des Sounds auf verschiedene Soundkarten aufzuteilen bzw. den Ton in Form eines Audio-Streams an einen Server zu senden. Auch Einstellungen fr das Ansteuern einer Lichtshow (IP-Adresse mit Portnummer) gilt es mit in das Formular aufzunehmen. Mit Hilfe eines Overlay, das sich ber die gesamte sichtbare Flche ausbreitet, sollen die Objekte im Hintergrund des Mens gesperrt werden. hnlich wie beim bekannten Lightbox-Skript5 fr Internetseiten wird somit einerseits das Men in den Fokus des Betrachters gerckt und andererseits ein versehentliches Bedienen sich berlagernder Widgets verhindert. Fr das Besttigen bzw. Abbrechen des Dialogs sind zwei Buttons am Ende des Formulars vorgesehen. Nach
5 Lightbox (JavaScript) Wikipedia, the free encyclopedia, vers. 13. August 2010, 20. Dezember 2010 <http://en.wikipedia.org/wiki/Lightbox_(JavaScript)>.

17

PROGRAMMIERHANDBUCH

dem Absenden hat eine Validierung der eingegebenen Daten zu erfolgen, deren Ergebnis bei Bedarf in Form von Fehlermeldungen ausgegeben wird. Auf hnliche Weise wie das Settings-Men sollen auch die Slipmat- und Musikordner-Auswahl umgesetzt werden. Anstelle der Dialoggruppen ist jedoch ein GTK+-hnlicher Dateibrowser vorgesehen, ber den eine Datei bzw. ein Ordner selektiert werden kann. Das Wechseln zwischen den Ordnern und Auisten ihrer Inhalte erfordert dabei spezielle Dateioperationen, die in einer Hilfsklasse zusammengefasst werden knnten. Alle notwendigen Eingabefelder, Buttons und Auswahllisten sind als Widgets bereits im eyefactive-SDK enthalten und bilden somit eine solide Grundlage fr die Entwicklung komplexer Strukturen, wie den erwhnten Browser. Darber hinaus dient ein gleichartiger Aufbau der Menfhrung der Benutzerfreundlichkeit und bietet zustzlich Raum fr die quantitative Optimierung des Codes. Plattenkoer Der Plattenkoer dient der Auswahl und Anzeige von Musikstcken. Dabei soll sich das Design und die Haptik an die von Apple-Produkten bekannte Titelauswahl mit Cover Flow-Visualisierung orientieren. Jedes Lied soll durch ein passendes Cover und die entsprechenden Track-Informationen in einem einzelnen Objekt (Record-Widget) dargestellt werden. Die Navigation durch die Musikauswahl wird dabei durch entsprechendes Wischen ber das Display erreicht. Der aktuelle Titel soll zustzlich durch Animation hervorgehoben werden. Auf den ersten Blick bietet es sich fr die Umsetzung dieser Anforderungen an, alle Record-Widgets dem im SDK integrierten Animations-Manager hinzuzufgen und mittels der Beschleunigung des relevanten Fingerblobs zu animieren. Dem Manager werden sowohl die neue Gre als auch die neue Position jedes RecordWidgets bergeben. Eine performantere Lsung wre, lediglich ein einzelnes Record-Widget zu animieren und bei jedem Animationsschritt die brigen Widgets relativ zum nchsten bzw. vorherigen Stck zu positionieren. Der Vorgang der Titelauswahl sollte mittels Drag & Drop geschehen; so kann das gewnschte Lied auf den entsprechenden Plattenteller gezogen und abgespielt werden. Hierbei ist zu berlegen, wie man zwischen einem Blob fr das Durchsuchen des Koers und einem fr die Auswahl eines Musikstcks unterscheiden kann. Hierbei sind drei Herangehensweisen in Erwgung zu ziehen: Position des erkannten Blobs (z.B. auf oder neben einem Cover), Dauer des erkannten Blobs (d.h. Verweildauer auf einer bestimmten Position), Anzahl der erkannten Blobs (z.B. Navigation mit einem und Drag & Drop mit zwei Fingern). Musikbibliothek Weiterhin ist es fr die Realisierung des Plattenkoers notwendig, Musikdateien auf einem Datentrger auszulesen, in einer Bibliothek zu speichern und anschlieend zu verarbeiten. Die Anforderungen an die Musikbibliothek ergeben sich implizit aus den Anforderungen des Plattenkoers. Diese erfordern, dass die ID3-Tags (Zusatzinformationen in Form von Metadaten) der MP3-Dateien ausgelesen werden mssen. So erhlt man beispielsweise Informationen ber den Interpreten oder den Titel, die zusammen mit dem Dateinamen in einer geeigneten Listenstruktur gespeichert werden knnen. Des Weiteren sollte es aus Performance-Grnden mglich sein den Inhalt der Bibliothek, d.h. die Daten der Liste, als Cache in einem XML-Dokument abzulegen. Dies htte den Vorteil, dass nicht bei jedem Neustart des Programms eine neue Musiksammlung ausgelesen und erstellt werden msste, sondern lediglich das erstellte XML-Dokument. Daraus ergibt sich, dass eine Klasse entwickelt werden muss, die das Parsen von XML-Dateien problembezogen bernimmt.

18

PROGRAMMIERHANDBUCH

3.2.2 Sound Plattenspieler Bei einem klassischen DJ-Set wird ein Plattenspieler (auch: Turntable) als Musikabspielgert verwendet. Dieser wird spter an einen Mixer angeschlossen, der den Sound zur Wiedergabe an einen Verstrker weiterleitet. Da beim Auegen zwei Musikstcke ineinander bergeblendet werden, ist das wichtigste Merkmal eines DJtauglichen Plattenspielers die Mglichkeit, die Abspielgeschwindigkeit von Hand selbst einzustellen, damit diese berblendung elegant und kaum hrbar vollzogen werden kann. Die Implementierung des Turntables der djBench sollte also in der Lage sein, ein derartiges Verhalten zu ermglichen. Ebenso wichtig wie die Geschwindigkeitsnderung ist die Tatsache, dass der DJ im wahrsten Sinne des Wortes direkt in die Musik eingreifen kann. Die laufende Platte kann jederzeit mit den Fingern angehalten oder wieder losgelassen werden und durch schnelles Vor- und Zurckbewegen wird das so genannte Scratching ausgefhrt. Mit djBench muss es daher mglich sein, die Abspielrichtung des Soundmaterials zu ndern oder es beispielsweise komplett durch die Bewegung mit der Hand manuell wiederzugeben. Ein denkbarer Ansatz wre es, zwei identische Audioquellen, wobei eine von beiden rckwrts abgespielt wird, parallel laufen zu lassen, um bei Bedarf schnell zwischen ihnen umschalten zu knnen. Die Wiedergabe darf nicht nur ein einfaches Starten bzw. Stoppen ermglichen, sondern muss zu jedem Zeitpunkt individuell steuerbar sein. Mischpult Den zweiten Teil des DJ-Sets bildet das Mischpult. Mit seiner Hilfe mssen berblendungen zwischen verschiedenen Eingangskanlen mglich sein. Ein Weg die Lautstrkeregelung des Ausgangssignals vorzunehmen darf ebenso wenig fehlen, wie die Mglichkeit einzelne Kanle separat vorzuhren. Auch Equalizer fr jeden Kanal sind unabdingbar. Eekte gehren dagegen nicht zur Grundausstattung eines Mixers dazu, sind aber, wie auch bei der Entwicklung der djBench, oft vorhanden. Sind diese Voraussetzungen erfllt, erhlt man ein funktionsfhiges DJ-Set. Im Rahmen dieses Projektes soll ein einfaches Mischpult mit zwei Kanlen und einer kleinen Eekteinheit umgesetzt werden. Um dieses Vorhaben zu realisieren muss in erste Linie berlegt werden auf welche Weise das Routing der Eingangsquellen des Mixers intern stattnden soll. So kann das Signal eines einzelnen Kanals ber mehrere Wege vom Eingang bis zum Ausgang gelangen. Gleichzeitig muss beachtet werden, dass fr das Vorhren ein separater Ausgang bentigt wird. Und auch die Eekte knnen nicht wahllos auf der Signalstrecke platziert werden, denn sie sind abhngig davon, ob sie fr jeden Kanal einzeln oder nur fr die Summe gelten sollen. Dadurch wird ihre Position beim Routing bestimmt. Zustzlich muss die Lautstrke an vielen Stellen geregelt werden. Einerseits wirkt sie sich auf das gesamte Signal andererseits nur auf bestimmte Teile dessen aus. Generell gibt es sicherlich mehrere Mglichkeiten diese Anforderungen umzusetzen es scheint aber sinnvoll die Implementierung einem echten Mischpult nachzuempnden. Streaming Neben der Klrung der Fragen zur internen Umsetzung der realittsgetreuen Nachempndung eines DJ-Sets mssen auch berlegungen angestellt werden, auf welche Art und Weise die Soundwiedergabe von djBench letztendlich funktionieren soll. Um die bereits skizzierte Variante der Wiedergabe eines Masters und die gleichzeitige Mglichkeit des Vorhrens umzusetzen, werden mindestens zwei getrennte Audioausgnge bentigt. Diese Aufgabe ist entweder ber den Einsatz einer entsprechenden Soundkarte mit zwei oder mehreren Ausgngen bzw. durch die Verwendung von zwei Soundkarten mit jeweils einem Ausgang zu lsen. Nachdem diese beiden Varianten einen Ansatz fr die Benutzung nur eines Rechners darstellen bleibt zu klren, auf welchem Wege mehrere Abnehmer den Sound des Programms empfangen knnen. Die CAVEAnwendung bentigt beispielsweise eine solche externe Verbindung, denn ohne die Musik kann keine dynamische Visualisierung erfolgen. Es wre denkbar die Audio-Rohdaten mittels UDP Broadcast zu verteilen, um sie dann auf Clientseite empfangen zu knnen. Dabei muss aber beachtet werden, dass hier die komplette Funktionalitt eigenstndig implementiert werden msste. Abhilfe wrde eine zweite Variante schaffen. Durch den Einsatz eines Audio Streaming-Protokolls in Verbindung mit einem Streaming-Server wrden alle Rahmenbedingungen vorhanden sein und es msste lediglich fr eine Anbindung an den Server aus dem Programm heraus gesorgt werden. Da die BASS Audiobibliothek schon Methoden zur Verwendung der Streaming-Dienste bietet, scheint die zweite Option wohl die geeignetste. 19

PROGRAMMIERHANDBUCH

3.2.3 Lightshow Empfangen der Sound-Daten In der Lightshow-Anwendung werden die Sound-Daten bentigt, die von der CoBench Applikation erzeugt werden. Dafr ist eine Netzwerkkommunikation notwendig, da die CAVE nur so Daten empfangen kann und ber keine andere Schnittstelle verfgt. Je nachdem welche Methode zum Verschicken der Audio-Daten gewhlt wird, muss die Lightshow in der Lage sein, die Daten entsprechend zu empfangen. Bei einem UDP-Broadcast sind eigene Algorithmen notwendig, um die Pakete entgegen zu nehmen. Wird allergings ein Streaming-Protokoll verwendet, muss die Anwendung lediglich dafr ausgelegt sein, sich mit einem Streaming-Server zu verbinden und erhlt darber die Daten. Verarbeitung der Sound-Daten Fr eine Visualisierung werden die Audio-Frequenzen bentigt, die ber das Netzwerk empfangen werden. Diese liegen nicht unbedingt in einer Form vor, die sofort von der Anwendung benutzt werden kann. Deshalb mssen die Daten erst entsprechend dekodiert werden. Bei der Verwendung eines eigenen Protokolls ist die Programmierung einer Routine ntig, die mit den ankommenden Daten umgehen kann. Wird ein Streaming-Protokoll benutzt, dann gibt es oftmals zahlreiche Bibliotheken (wie z.B. BASS), die die Verarbeitung bernehmen und damit die Entwicklungszeit reduzieren. Es bleibt zu klren, in welchem Format die Sound-Daten vorliegen und wie sie anschlieend von den Visualisierungen genutzt werden knnen. Die Audio-Frequenzen werden in diskreter Form bentigt, wobei die Anzahl der Unterteilungen mglichst variabel sein muss. Hug sind die Musikdaten als FFT-Daten abgelegt, die erst umgerechnet werden mssten. Mittels der BASS-Bibliothek kann auf die FFT-Daten zugegrien werden. Wiedergabe der Sound-Daten Die CAVE verfgt ber eine 5.1 Soundanlage, wobei die Bodenplatte mit vier Subwoofern verbunden ist. Der Ton sollte aus allen Boxen zu hren sein, um die beste Wirkung zu erzielen. Wnschenswert wre es zudem, wenn die Subwoofer-Spur genutzt wird, um die Bodenplatte in Schwingungen zu versetzen. Abhngig von der Verteilung der Musik vom djBench-Programm stehen nicht unbedingt 5.1-Daten zur Verfgung. Deshalb wird eventuell eine Umwandlung erforderlich sein. Das Upmixing des Sounds von 2.0 auf 5.1, wie es zum Beispiel beim Streaming notwendig ist, kann ber zwei Wege realisiert werden. Als ein mglicher Ansatz knnte die Hardware diese Aufgabe bernehmen, da sie meist standardmig ber eine solche Funktionalitt verfgt. Der Vorteil dabei lge darin, dass die Umformung schneller durchgefhrt werden kann. Zu beachten ist hierbei, dass diese Konguration systemabhngig und deshalb nur fr die CAVE gltig wre. Einen anderen Ansatz wrde die softwaretechnische Transformation der Daten darstellen, was unter Umstnden einen hheren Aufwand zu Folge htte. Da im 2.0-Audio keine Bass-Spur vorhanden ist, muss diese aus dem rechten und linken Kanal berechnet werden. Dabei sollten nur die tiefen Frequenzen bernommen werden, was mit einem Tief-Pass-Filter mglich ist. Die meiste Hardware bietet dieses auch an und mittels Software kann es ebenso umgesetzt werden. Visualisierung des Sounds in 3D Es ist geplant ber ein Lightshow-Modul im djBench-Programm die Visualisierungen in der CAVE zu wechseln. Das heit, es mssen mehrere Darstellungen vorhanden sein. Wnschenswert wre eine einfache Erweiterungsmglichkeit fr weitere Visualisierungen, weshalb diese modular aufgebaut werden sollten. Um eine einheitliche Schnittstelle zu ermglichen, knnte eine abstrakte Oberklasse entwickelt werden, von der alle Visualisierungen erben. Dies vereinfacht die Verwaltung der einzelnen 3D-Eekte. Auerdem wrden Parameter wie Farbe, Wechselgeschwindigkeit etc. allgemein nutzbar sein. Fr eine dreidimensionale Darstellung wird fr jedes Auge ein eigenes Bild bentigt. Die daraus resultierenden zwei Bilder pro Zeitabschnitt mssen von den Projektoren abwechselt angezeigt werden. Dabei ist der Betrachterpunkt bei beiden unterschiedlich, wodurch der 3D-Eekt entsteht. Das Erzeugen der Bilder wird automatisch von dem CAVE-Framework der FH Wedel bernommen, weshalb keine weiteren Routinen ntig sind. 20

PROGRAMMIERHANDBUCH

Um die Eekte an die Musik anzupassen, muss auf die Sound-Daten zugegrien werden knnen. Dies knnte zum einen jede Visualisierung eigenstndig bernehmen, was aber zu viel redundanten Code fhren wrde, oder eine Sound-Klasse bietet entsprechende Funktionalitten an. Letzteres wre softwaretechnisch der saubere Weg. Steuerung der Visualisierungen ber das Netzwerk Mit Hilfe der CoBench-Anwendung soll zwischen den einzelnen Visualisierungen gewechselt sowie deren Parameter angepasst werden knnen. Dafr ist eine Kommunikation ber das Netzwerk erforderlich, bei der Kommandos an die Lightshow bertragen werden. Diese Befehle mssen im djBench-Programm (Sender) und in der CAVE-Anwendung (Empfnger) bekannt sein. Hierfr eignet sich ein eigenes Protokoll, das von beiden Applikationen eingebunden und verwendet wird. Die Frage ist, wie die bertragung erfolgen soll. Zur Auswahl stehen UDP und TCP. Da die Lightshow das djBenchProgramm zustzlich ber die zur Verfgung stehenden Visualisierungen informieren sollte, ist eine Kommunikation in beide Richtungen notwendig. Fr den einfachen Verkehr der Befehle ber das Netzwerk reicht die Funktionalitt des UDP-Protokolls. Wenn eine berprfung gewnscht wird, ob die bertragung unterbrochen wurde, wird allerdings eine verbindungsorientierte Kommunikation bentigt, wie sie mit dem TCP-Protokoll mglich ist. 3.3 Realisierung 3.3.1 Benutzeroberche Main-Widget Die durch das SDK vorgegebene Struktur des Ineinanderschachtelns verschiedener Widgets, erfordert das Anlegen eines sogenannten Main-Widgets (djbMainWidget) beim Starten der Anwendung, der innerhalb der yfApp-Klasse beschrieben ist. Dieses erstreckt sich als Hauptfenster ber die komplette Oberche und beinhaltet, je nach Programmzustand, die entsprechenden Bedienelemente und ihre Initialisierungs-Aufrufe. Da sich die Menfhrung unmittelbar auf der Ebene des Hauptfensters bewegt, wurde auch ihre gesamte Logik, wie etwa die Erzeugung und Validierung der Men-Formulare, in dieser Klasse implementiert.
01 void djbMainWidget::dlgClickedOk(const djbDialogEventArgs& args) 02 { 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 } } break; default:; remErrorMsgsFromDlg(); //evtl vorhandene Fehlermeldungen lschen vector <string> strErrorMsg; //Alle Fehlernachrichten bool addLight = false; switch(args.getDialogID()) { [...] case eDlgChangeMusicFolder: { yfPropertyMap tmpMap; mp_dlgwMenu->getFormValues(tmpMap); //map aus dialog holen string path(tmpMap.get("path", "/")); //path holen string selectedObject(tmpMap.get("selectedObject", "")); //selektiertes Objekt if ((selectedObject != "") && (mp_rcRecordCaseWidget != 0)) mp_rcRecordCaseWidget->setMusicLibraryPath(path + selectedObject); else strErrorMsg.push_back("Please select a folder.");

21

PROGRAMMIERHANDBUCH

23 24 25 26 27 28 29 30 31 }

if (strErrorMsg.size() == 0) { mp_dlgwMenu->close(); // Men schlieen } else { addErrorMsgsToDlg(strErrorMsg); }

Ausschnitt aus der djbMainWidget-Klasse: Auswertung des Settings-Formulars mit Generierung von Fehlermeldungen

Somit lieen sich zustzlich das ndern des Musikordners und die Auswahl einer benutzerdenierten Slipmat zur Laufzeit an dieser zentralen Stelle mit den dazugehrigen Widgets verbinden. Auch die brigen, Widgetbergreifenden Ereignisse (Laden eines Tracks aus dem Plattenkoer, ndern des Ausgabekanals zur Laufzeit usw.) werden hier an die jeweiligen, voneinander unabhngigen Teilnehmer verteilt. Texturen Der wichtigste Faktor bei der Gestaltung war die optimale Nutzung des zur Verfgung stehenden Platzes fr die Oberche in Verbindung mit den geplanten Bedien-Elementen. Erste Tests fanden daher mit sehr einfach geformten Objekten aus dem SDK statt, um ein Gefhl fr die Gren zu bekommen. Aus Grnden der Usability wurde hierbei auch eine Mindestgre fr die kleineren Bedienelemente ermittelt. Nicht zuletzt spielte bei der Anordnung und beim Design auch die mgliche Portierung der djBench auf ein anderes, kleineres Multitouch-Device eine Rolle. Auf der Basis von Screenshots wurde mit Hilfe von Adobe Photoshop schlielich ein optisch ansprechendes Design entwickelt, das smtliche Bestandteile des DJ-Sets abbildet. Zur Verstrkung des VR-Eindrucks lag hier ein besonderes Augenmerk auf der mglichst realen Darstellung der Gerte. Durch entsprechende Aufteilung des Designs in verschiedene Ebenen lieen sich die einzelnen Texturen schlielich problemlos in ein fr das SDK lesbares Grakformat extrahieren (siehe Programmordner unter bin/djBench/data/media/images/textures). Neben dem Design mit Hilfe von Texturen wurden bei der Umsetzung auch hug die SDK-internen Gestaltungsmglichkeiten genutzt. Diese erlauben z.B. das Einfrben der jeweiligen Formen und ihrer Rahmen mit RGBA-Farben. Auerdem kann fr die Darstellung von Text eine beliebige TrueType-Schriftart gewhlt werden, was vor Allem fr die dynamischen Textanzeigen im LC-Display der Plattenspieler und im Plattenkoer sinnvoll ist. Die gesamten Farb-, Textur- und Schrift-Informationen wurden anschlieend in der Klasse djbTexCong gesammelt und fr den zentralen Zugri auf Basis eines Singleton-Templates implementiert. Durch die zentrale Verwaltung des gesamten Erscheinungsbildes lassen sich nicht nur kleinere Korrekturen an selbigem vornehmen, sondern auch eine sptere Erweiterung der Software um ein Skin-System6 wre mglich. Plattenspieler Bei der Umsetzung des Plattenspielers konnten nur bedingt SDK-eigene Elemente direkt genutzt werden. Durch ihre komplexen Funktionalitten mussten der Plattenteller (djbPlatterWidget) mit seinem Tonarm (djbTonearmWidget) und auch der Pitch-Schieberegler (djbFadeSlider) als eigene Widget-Klassen implementiert werden. In der Plattenspieler-Klasse selbst (djbTurntableWidget) werden die verschiedenen Bestandteile zunchst initialisiert und dabei ber String-Parameter mit ihren Texturen belegt. Einen weiteren Turntable-KunstruktorParameter stellt die Referenz auf das zu steuernde Sound-Objekt dar. Das heit der Plattenspieler wurde so konzipiert, dass in ihm smtliche Ereignisse zur Steuerung eines Musikstcks gesammelt und auf den Soundkanal angewendet werden. Als Beispiel wird hier das Ereignis erlutert, das beim Bremsen/Beschleunigen des Plattentellers ausgelst wird:
6 Skin (Computer) Wikipedia, vers. 16. September 2009, 14. Februar 2011 <http://de.wikipedia.org/wiki/Skin_(Computer)>.

22

PROGRAMMIERHANDBUCH

In der updateInterval-Methode des Tellers, die zur Laufzeit in zeitlich nicht konstanten Abstnden aufgerufen wird, werden die verschiedenen Bedien-Situationen (Starten/Stoppen durch Start-/Stop-Knopf des Plattenspielers, Abbremsen mittels zweier Finger, Scratchen) abgeprft und schlielich bei jeder Geschwindigkeitsnderung ein Event ausgelst und an das Turntable-Widget weitergegeben.
01 // Schauen ob sich Geschwindigkeit verndert hat und ggf Event aufrufen. 02 if (fabs(m_fValue - (getVelocityRotationDir() * getVelocityRotation())) >= 0.0001) 03 { 04 05 06 07 08 09 10 } Auszug aus dem Quellcode der Methode updateInterval der Klasse djbPlatterWidget m_fValue = getVelocityRotationDir() * getVelocityRotation(); djbPlatterWidgetEventArgs pwa(m_iPlatterID, ,m_fValue ,static_cast<int>(m_fValue) ,valueToPercent(m_fValue)); yfNotifyEvent(g_evChanged, pwa, this);

Als Status wird ein Objekt der Event-Klasse (djbPlatterWidgetEventArgs, Variable pwa) mit der GUI-ID sowie diskrete und prozentuale Geschwindigkeitswerte des Plattentellers bergeben. Der Plattenspieler als bergeordnetes Objekt fgt dem Teller beim Initialisieren einen Event-Listener hinzu und ruft bei Auftreten des Ereignisses die Methode platterHasChanged auf:
01 void djbTurntableWidget::platterHasChanged(const djbPlatterWidgetEventArgs& args) 02 { 03 04 05 06 07 08 } Quellcode der platterHasChanged-Methode innerhalb der djbTurntableWidget-Klasse } // wird aufgerufen, sobald sich Dreheschwindigkeit des Tellers ndert if (mp_tawTonearm->getTonearmIsOn()) { mp_sttSoundTurntable->setPitch(args.getPercent() / 100.0);

Hier wird schlielich die genderte Geschwindigkeit des Plattentellers auf das Soundkanal-Objekt bertragen, sofern der Tonarm sich auf der Platte bendet. Auf hnliche Weise werden auch die Ereignisse des Tonarms verarbeitet. Im Gegensatz zum Plattenteller sind die Auslser der Ereignisse jedoch innerhalb der (von der yfWidget-Klasse) geerbten Blob-Methoden zu nden. Wird der Tonarm berhrt, stoppt der auf dem Gert abgespielte Track und beginnt erst dann wieder, wenn der Tonabnehmer auf der Platte abgesetzt wird. Da die Blob-Methoden nur aufgerufen werden, sobald sich Blobs auf dem Widget ndern, wirkt sich dies ressourcenschonend auf das System aus. Zustzlich wird innerhalb der Plattenspieler-Klasse permanent die aktuelle Track-Position ausgelesen. Zum einen wird diese fr die Anzeige im Display genutzt und zum anderen zur korrekten Berechnung des Winkels fr die Nadelstellung des Tonarms. Das vielleicht wichtigste Element bei der Steuerung der djBench stellt jedoch das Schieberegler-Widget (djbFadeSlider) dar. Wichtig, weil es auf unterschiedliche Weise an vielen Stellen wiederverwendet werden kann. Beim Plattenspieler sind das zum einen der Pitch-Regler, zur Anpassung der Abspielgeschwindigkeit, und zum anderen der Statusbalken, der gleichzeitig zur alternativen Positions-Auswahl fr das Lied dient. Er wurde daher so konzipiert, dass sein Aussehen ber Konstruktor-Parameter variabel gestaltet werden kann. Zudem sind das Festsetzen und Unsichtbarmachen des Regler-Knopfes ber entsprechende Funktionen (setLock bzw. setSliderVisibility) geregelt. Da der Regler-Knopf das einzige bewegliche Element des Reglers darstellt wurde er in eine separate Klasse ausgelagert (djbFadeSliderBtn). Events werden hier wiederum in den Blob-Methoden behandelt und an das bergeordnete Fade-Slider-Objekt weitergereicht. Dort wird er mit der aktuellen Position des Buttons verrechnet und abermals als Ereignis an das nchst-hhere Widget bergeben, wo es z.B. zur Steuerung der Geschwindigkeit genutzt werden kann. 23

PROGRAMMIERHANDBUCH

Als problematisch stellte sich whrend der Umsetzung vor Allem die nicht vorhandene Synchronitt des abspielenden Sounds mit der Optischen Steuerung heraus. Der zeitliche Versatz zwischen den Aufrufen der jeweiligen Update-Funktionen fhrt daher zu einem leichten Delay, das heit dass der Sound nicht direkt, sondern mit minimaler Verzgerung auf nderungen der optischen Steuerung reagiert. Auch das Rechnen mit Float-Werten und damit verbundene Ungenauigkeiten spielen hierbei eine Rolle. Wegen der im Vergleich zur Gre verhltnismig geringen Ausung, mussten zudem die bereits in der Problemanalyse angesprochenen Manahmen zur Feinjustierung des Geschwindigkeitsreglers in Form von +/--Buttons eingebaut werden. Mischpulte hnlich wie beim Plattenspieler, laufen auch in den Mischpult-Klassen die Ereignisse der eingesetzten Steuer-Elemente in Form von prozentualen Werten zusammen. Beim Sound-Mischpult (djbMixerWidget) lassen sich diese unmittelbar auf den jeweiligen Ausgabekanal bzw. auf den Master-Ausgabekanal anwenden und beim Lichtmischpult (djbLightMixerWidget) auf ein Visualisierungs-Objekt. Wie schon beim Turntable-Widget wird das auch hier durch die bergabe einer Referenz auf die zu steuernden Objekte (djbSoundMixer bzw. djbVisualizationControl) im Kontruktor der Mixer-Klassen realisiert. Diese Art der Kopplung sorgt neben einer ordentlichen Trennung von Steuerung und Oberche zudem fr eine einfache Erweiterbarkeit des Systems. Als optisches Feedback fr den Nutzer wurden fr die Druckknpfe mehrere Status-Texturen angefertigt. Wie beim Original geben sie Aufschluss darber, welche Funktion derzeit aktiviert ist oder ob die Software einen Blob erkannt und somit das Drcken des gewnschten Buttons angenommen hat. Dafr werden die Buttons, ggf. zusammen mit ihrem aktuellen Status (ein- oder ausgeschaltet), in einem klassenglobalen VectorContainer mit Bezug auf ihre GUI-ID gespeichert. Sobald ein Ereignis registriert wird, wird die dazugehrige Methode aufgerufen (btnDown bzw. btnUp):
01 void djbMixerWidget::btnDown(const yfPushButtonEventArgs& args) 02 { 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 } // Icon setzen, wenn Pfad rauskommt if (strTex != "") m_pbArrPushButtons[args.getButtonID()].p_btn->setIcon(strTex); // Status togglen default:; [...] break; string strTex(""); // Pfad zur Textur switch (args.getButtonID()) { case eCh01Cue: // Icon umsetzen (eingedrckter Knopf) strTex = m_pbArrPushButtons[eCh01Cue].bIsOn ? djbTexCong::instance().getTex(djbTexCong::eMiwCueBigOnDown) : djbTexCong::instance().getTex(djbTexCong::eMiwCueBigOffDown);

21 m_pbArrPushButtons[args.getButtonID()].bIsOn = ! m_pbArrPushButtons[args.getButtonID() ].bIsOn; 22 } Ausschnitt aus dem Quelltext der btnDown-Methode in der djbMixerWidget-Klasse

Im Codeschnipsel ist zu erkennen, wie ber einen Case-Verteiler und nach Auswertung der Statusvariablen schlielich die korrekte Textur gesetzt wird. Fr den Sound-Mixer wurde auerdem noch ein Widget in Form eines Drehknopfs entwickelt. Wichtig war hier die in der Planung angesprochene Kongurierbarkeit, sodass der Knopf entweder als Lautstrkeregler 24

PROGRAMMIERHANDBUCH

mit festen Anschlagpunkten oder als Endlosdrehknopf ohne Begrenzung genutzt werden kann. Erreicht wird dies durch entsprechende Parameter im Konstruktor, die bei Bedarf eine Grenzwert-Prfung innerhalb der adjustRotation-Methode hinzuschalten. Auerdem kam bei beiden Mischpulten das bereits fr die Plattentellergeschwindigkeit bzw. den Track-Statusbalken verwendete Schieberegler-Widget zum Einsatz. ber die bereits erwhnte Mglichkeit des Feststellens lassen sich bei bestimmten Visualisierungen im Lichtmischpult optionale Regler sperren bzw. aktivieren. Auch die geplante beliebig einstellbare Neutralstellung wurde implementiert und beispielsweise beim Crossfader genutzt. Durch die spter geschaene Mglichkeit des Wechselns der Ausgabegerte bzw. des optionalen Zuschaltens einer Lichtshow ber ein Kongurationsmen, ergaben sich bei den Mischpulten ein paar kleinere Probleme. Die Soundmixer- bzw. Visualisierungs-Objekte mussten dabei nmlich jeweils neu initialisiert werden. Da die GUI-Elemente sich jedoch nicht gleichzeitig mit-initialisierten, war z.B. der Eekt-Button optisch noch eingeschaltet, aber im Soundmixer-Objekt durch den Reset abgeschaltet war. ber eine zustzliche Initialisierungs-Methode in jedem Mixer, die jeweils mit dem Reset des jeweiligen zu steuernden Objekts einhergeht wurde das Problem letztlich gelst. Menfhrung Strukturell ist die Menfhrung relativ stark an html-Formular angelegt. Die Oberste Ebene und somit das Menfenster, bildet das Dialog-Widget (djbDialogWidget). In ihm sind die optischen Eekte wie z.B. das Einund Ausfahren des Mens implementiert. ber Konstruktor-Parameter lsst es sich mit einem Men-Titel und -Icon versehen und beliebig in der Gre verndern. Standardmig benden sich zudem am unteren Ende des Fensters zwei Buttons zum Besttigen (OK) bzw. Abbrechen (CANCEL) des Dialogs. Das Dialog-Widget kann mehrere Dialog-Gruppen (djbDialogGroupWidget) beinhalten. Diese enthalten schlielich die tatschlichen Dialog-Eingabefelder des SDK. Da die Dialog-Gruppen wiederum ber Parameter mit beliebigen Unterberschriften und Icons konguriert werden knnen, bieten sie eine sehr gute Mglichkeit zur optischen Strukturierung der Meneintrge. Im Main-Widget lsst sich somit exibel das gewnschte Formular zusammenstellen. Innerhalb des Dialog-Widget werden alle Formulardaten in einer Map (yfPropertyMap) verwaltet. Beim Absenden des Formulars wird diese Map schlielich aus dem Main-Widget heraus ber eine Referenz ausgewertet und bei Bedarf werden entsprechende Fehlerausgaben generiert. Auch fr den GTK+-hnlichen Dateibrowser zur Auswahl der Slipmat bzw. des Musikordners bildet das Dialog-Widget die Grundlage. Anstelle der Dialog-Gruppen wird dem Men jedoch ein speziell entwickeltes Dateibrowser-Widget (djbFileBrowserWidget) hinzugefgt, wobei die selektierbaren Dateien ber einen Konstruktor-Parameter gewhlt werden knnen. Genau wie sein Gnome-Vorbild besteht der Dateibrowser aus einem Bereich, in dem der Pfad ordnerweise (bis zu drei Ebenen tief) nachgebildet ist (djbFilePathWidget), sowie je einem scrollbaren Auswahl-Fenster zum Navigieren auf Ordnerebene bzw. zum Auswhlen der Datei innerhalb des gewhlten Ordners (djbFileListWidget). ber entsprechende Dateioperationen, die in der Klasse djbFileOperations zusammengefasst sind, lsst sich somit das gesamte Dateisystem durchsuchen. Auf der Main-Widget-Ebene ndet wiederum die Analyse der Eingabe statt, wobei dann entsprechende Methoden, z.B. das Initialisieren der Platten im Plattenkoer nach Auswahl eines neuen Musikordners, angesteuert werden. Probleme traten hauptschlich bei der Entwicklung des Konfigurationsmens auf. Beispielsweise findet die Erkennung der zur Verfgung stehenden Sound-Devices lediglich bei Programmstart statt, sodass nachtrglich per USB angeschlossene Soundkarten nicht in der Auswahl erscheinen und selektiert werden knnen. Auerdem brachte die Verbindung der CAVE-Lichtshow mit der djBench einige Schwierigkeiten mit sich, sodass anfnglich falsche Fehlermeldungen produziert wurden. Dieses Problem lie sich jedoch durch die Implementierung einer regelmigen Abfrage des Verbindungsstatus zur Laufzeit beheben. Plattenkoer Die Hauptaufgabe bei der Realisierung dieser Anzeige-Komponente lag in der animierten Navigation. Dabei 25

PROGRAMMIERHANDBUCH

fhrte die dynamische Grenanpassung der Record-Widgets (djbRecordWidget), in Abhngigkeit der Lage, zu Schwierigkeiten bei der Positionierung. Grund dafr waren die erst zur Animationszeit auftretenden Skalierungen, die bei der Berechnung der Verschiebung, genauer der neuen X-Position, bercksichtigt werden mussten. Die Probleme traten bereits bei der ersten Realisierung des Plattenkoers auf und resultierten in mehreren Lsungsanstzen und -umsetzungen. Dabei stellte sich heraus, dass alle Mglichkeiten hnliche Probleme bezglich der Animation hervorriefen. Navigation Der Plattenkoer fr die Darstellung aller Lieder der Bibliothek ist durch das RecordCase-Widget (djbRecordCaseWidget) implementiert. Dieses besteht aus einem RecordFrame (djbRecordFrameWidget), das wiederum alle Record-Widgets enthlt. Das RecordCase dient als Wrapper, dem die anzuzeigende Musikbibliothek bei Erzeugung bergeben wird. Fr die eigentliche Anzeige und Navigation durch diese Sammlung ist das RecordFrame-Widget verantwortlich. Zur Navigation wird innerhalb der RecordFrame-Klasse stets das erste Record-Widget der Track-Liste dem SDK-eigenen Animations-Manager hinzugefgt und mit Hilfe der erkannten Blob-Translationen im Plattenkoerbereich animiert (animateRecordWidget-Methode mit den Parametern fTrans (oat), iXTransBlob (int) und add (int)). In jedem Animationsschritt wird anschlieend ber die restliche Liste iteriert, wobei die resultierende Position der brigen Record-Widgets gesetzt wird. Dabei stehen die Methodenparameter fTrans fr die vorberechnete neue Position der rechten Kante des Record-Widgets und iXTransBlob fr den faktorisierten Wert, um den die Eintrge des Koers nach links oder rechts verschoben werden. Das bedeutet, die eigentliche Translation des Blobs wird in einen Integerwert umgerechnet. Dieser besagt, um wie viele Stellen in der Sammlung weitergesprungen wird. Der add-Parameter in der animateRecordWidget-Methode ist der mit der Navigationsrichtung verechnete Parameter iXTransBlob. Die Funktion berechnet sowohl die endgltige neue Position des animierten Record-Widgets als auch seine tatschliche neue Gre. Die Animation wird mittels Manager wie folgt ausgefhrt:
01 p_waAnimation->setAnimationType(yfAnimation::eEaseOut); 02 p_waAnimation->animateSizeTo(yfSize2f(size ,size), 03 04 06 07 08 yfWidget::eRight, 10.0f); ,m_RecordWidgetPtrList.front()->getPosition(eBottom).y), yfWidget::eBottomRight, 20.0f);

05 p_waAnimation->animatePositionTo(yfPoint2f(fXTranslation

09 m_amManager.addAnimation(p_waAnimation);

Die anderen Widgets in der Bibliothek werden in der updateInterval-Methode anhand des animierten Record-Widgets positioniert und skaliert. Fr diese Komponenten muss eine Randbehandlung bezglich der Skalierung erfolgen.

26

PROGRAMMIERHANDBUCH

Das Anzeigefenster der Bibliothek ist ber ein Raster in unterschiedliche Abschnitte unterteilt:

Abbildung 3a: Plattenkoer-Widget mit angedeutetem Raster.

Die Randbereiche rechts und links sind als Standartgre zu verstehen. Sobald dann ein Record-Widget in einen anderen Bereich gelangt, wird seine Gre neu animiert. Die berprfung hierzu wird bei jedem Update der Anzeige vorgenommen. Es folgt ein exemplarischer Pseudeo C-Code, wie diese in der update-Funktion umgesetzt wurde:
01 if (RasterMitte->isInside(VorgngerPosition(eRight).x + m_fCoverPadding) - RasterMitteP osition(eLeft).x 02 03 04 05 } , VorgngerPosition (eTopRight).y - RasterMittePosition(eTopLeft).y))){ if (CurrRecordWidgetWidth != CenterCoverSize) resizeRecordWidget(p_rcRecordWidget, m_iCenterCoverSize);

Auswahl Die Selektion eines Musikstcks zum Abspielen ndet wie unter 3.2.1 beschrieben mittels Drag & Drop statt. Zur Unterscheidung des Durchsuchens der Bibliothek von der Auswahl eines Titels wird die Anzahl der Blobs ausgewertet: Mindestens zwei Finger dienen der Auswahl eines Musikstcks, wobei die Anzahl ber die getBlobCountMethode ermittelt und innerhalb der blobsDown-Methode des RecordFrame-Widgets ausgewertet wird. Um eine konsistente Animation der Widgets sicherzustellen, wird zunchst eine Track-Selektion zur Animationszeit ausgeschlossen. Auerdem ist es nicht mglich mehr als einen Titel zu einem bestimmten Zeitpunkt auszuwhlen und zu bewegen, was durch die boolesche Variable m_bIsDrag erreicht wird:
01 if (!m_bIsDrag && getBlobCount() >= 2 && !m_amManager.ndAnimation(m_WidgetAnimationPtrL ist.back()->getID()))

Anschlieend wird per Iteration ber die Record-Widget-Liste das ggf. gewhlte Widget identiziert:
01 if ((abs(mapGlobalToLocal(itBlobPtr->second->getCentroid()).x - p_rcRecordWidget->getPos ition().x) <= p_rcRecordWidget->getSize().width *0.5f) 02 && (abs(mapGlobalToLocal(itBlobPtr->second->getCentroid()).y - p_rcRecordWidget->getPos ition().y) <= p_rcRecordWidget->getSize().height*0.5f))

Wurde eine Auswahl erkannt, wird die makeDrag-Methode aufgerufen, die eine Kopie des selektierten Tracks erzeugt. Innerhalb der blobsUpdate-Methode wird dann anhand aller erkannter Blobs die Position des gezogegenen Objekts gesetzt. Beim Loslassen testet eine Kollisionserkennung zunchst, ob das Widget auf einem Plattenspieler abgelegt wurde. Die Erkennung des korrekten Widget-Typen erfolgt ber ber die yfPropertyMap. Alle Kind-Widgets innerhalb des Main-Widgets werden auf den isCollisionable-Schlssel getestet, der jedoch lediglich beim Plattenspieler (djbPlatterWidget) gesetzt ist: 27

PROGRAMMIERHANDBUCH

01 02 03 04 05 06 07

map< int, yfWidgetPtr > widgetPtr = *(getParent()->getParent()->getChildren()); map< int, yfWidgetPtr >::iterator it; yfPropertyMap pMap; for (it = widgetPtr.begin(); it != widgetPtr.end(); ++it){ pMap.clear(); it->second->getProperties(pMap); if (pMap.hasKey("isCollisonable")){

Daraufhin folgt die eigentliche Kollisions-Erkennung, die bei einer Berhrung ein Event mit den entsprechenden Informationen des ausgewhlten Tracks auslst und das Laden der Datei auf initiiert.
01 if ((it->second->getShape()->isInside(yfPoint2i(mapParentToGlobal(p_wWidget->getPosition (yfWidget::eTopLeft) ).x - it->second->getPosition(yfWidget::eLeft).x, mapParentToGlobal( p_wWidget->getPosition(yfWidget::eTopLeft) ).y - it->second->getPosition(yfWidget::eTopLe ft).y))) 02 || (it->second->getShape()->isInside(yfPoint2i(mapParentToGlobal(p_wWidget->getPo sition(yfWidget::eBottomLeft) ).x - it->second->getPosition(yfWidget::eLeft).x, mapParentTo Global(p_wWidget->getPosition(yfWidget::eBottomLeft) ).y - it->second->getPosition(yfWidget ::eTopLeft).y))) 03 || (it->second->getShape()->isInside(yfPoint2i(mapParentToGlobal(p_wWidget->getPo sition(yfWidget::eTopRight) ).x - it->second->getPosition(yfWidget::eLeft).x, mapParentTo Global(p_wWidget->getPosition(yfWidget::eTopRight) ).y - it->second->getPosition(yfWidget ::eTopLeft).y))) 04 || (it->second->getShape()->isInside(yfPoint2i(mapParentToGlobal(p_wWidget->getPo sition(yfWidget::eBottomRight)).x - it->second->getPosition(yfWidget::eLeft).x, mapParentTo Global(p_wWidget->getPosition(yfWidget::eBottomRight)).y it->second->getPosition(yfWidget ::eTopLeft).y)))) { 05 06 07 cRecordWidget->getTrackInfo().name 08 09 10 11 12 13 14 } djbRecordFrameWidgetEventArgs recfwa(mp_rcRecordWidget->getRecordID() ,it->rst ,mp_rcRecordWidget->getTrackInfo().path+mp_r ,mp_rcRecordWidget->getTrackInfo().image ,mp_rcRecordWidget->getTrackInfo().title ,mp_rcRecordWidget->getTrackInfo().artist ,mp_rcRecordWidget->getTrackInfo().album ,getMusicLibraryPath()); yfNotifyEvent(g_evRecCollision, recfwa, this);

Musikbibliothek Die Grundlage fr einen virtuellen Plattenkoer bildet eine, fr die Verarbeitung vorbereitete, Menge an Musikdateien. Zu diesem Zweck wurde die Klasse djbMusicLibrary erstellt, welche zum Auslesen und der anschlieenden Verwaltung von Musikdateien dient. Bei der Erzeugung eines Objektes dieser Klasse wird ein Pfad angegeben, der zur Laufzeit gendert werden kann. Anhand dieses Pfades werden vorhandene Musikdateien ausgelesen und die Bibliothek dynamisch aufgebaut. Dabei werden die ID3-Tags der MP3-Dateien mit Hilfe der C++-Bibliothek id3lib7 verarbeitet, die alle fr das Auslesen und Verarbeiten der Metainformation bentigten Funktionen bereitstellt. ber einen Aufruf der Methode getID3Tag der djbMusicLibrary-Klasse ist es somit mglich, alle relevanten Metadaten einer beliebigen Musikdatei auszulesen und in einem bergebenen Datencontainer (Aufbau siehe Punkt 3.4.1) zu speichern. Dabei wird auch ein temporrer Ordner fr die Albumcover erstellt, in den dem alle gefundenen Titelbilder abgelegt werden. Damit nicht bei jedem Verzeichniswechsel stets alle Ordner und Unterordner nach MP3s gescannt werden mssen, wird die Bibliothek in einer XML-Datei gecached: Mit Hilfe des externen Parsers TinyXML++8 wird nach jedem erfolgreichem Auslesevorgang ein XML7 id3lib - The ID3v1/ID3v2 Tagging Library, 26. Februar 2011 <http://id3lib.sourceforge.net>. 8 ticpp - Project Hosting on Google Code, 26. Februar 2011 <http://code.google.com/p/ticpp/>.

28

PROGRAMMIERHANDBUCH

Dokument mit allen Liedern und ihren Metadaten erzeugt und im Wurzelverzeichnis abgelegt. Diese dient bei erneutem Zugri auf den Ordner als Grundlage fr den Aufbau der Bibliothek. Treten beim Laden der XML-Datei Konsistenzfehler auf (z.B. enthaltene Datei ist nicht mehr vorhanden), werden der aktuelle Pfad neu gescannt und eine Cache-Datei angelegt. Sollte hingegen ein Coverbild nicht gefunden werden, so hat dies keinen neuen Auslesevorgang zur Folge, sondern es wird ein Default-Bild verwendet. 3.3.2 Sound Plattenspieler Die gewnschte Funktionalitt des Plattenspielers kann allein durch das simple nen und abspielen einer Audiodatei nicht zu erreichen. Es muss ein Weg gefunden werden, der es ermglicht die Wiedergabe eines Tracks vollkommen manuell zu gestalten. Um das zu erreichen ist folgendermaen vorgegangen worden: Mit Hilfe des verwendeten Soundframeworks knnen intern beliebig viele so genannte Streams angelegt werden. Um die Turntables fr djBench zu implementieren wurden drei dieser Audio-Streams benutzt. Der erste Stream kann als File Handle angesehen werden. Er ist lediglich dazu da, eine Audiodatei zu nen, zu dekodieren und fr weitere Schritte bereit zu stellen. Mit dem zweiten Stream, der lesend auf die dekodierten Daten des Ersten zugreift, wird die Vorwrts- und Rckwrtswiedergabe realisiert. ber ein Flag im Funktionsaufruf kann die Abspielrichtung bestimmt werden. Die Daten dieses Streams sind als Quelle mit dem Dritten verknpft. Der letzte Stream ermglicht die Anpassung der Abspielgeschwindigkeit. Anhand dieser Aufteilung knnen auf jeden geneten Track die gewnschten nderungen separat angewendet werden. Um das realistische Scratch-Verhalten zu simulieren wird die Abspielgeschwindigkeit an die Rotation der Platte gekoppelt und kann dadurch intuitiv beeinusst werden. Sobald die Geschwindigkeit einen negativen Wert erreicht, wir die Wiedergaberichtung umgekehrt.

Mischpult Die eben beschriebene Methodik der Nutzung verschiedener Streams eignet sich auch gut fr die Realisierung der gewnschten Funktionalitt des Mischpults. Neben der Verkettung dieser Streams ist es hier allerdings zustzlich erforderlich beispielsweise mehrere Streams zu einem zusammenzufassen oder einen in mehrere gleiche aufzuspalten, quasi zu kopieren. Das Mischpult besteht aus zwei Hauptkanlen, den beiden angeschlossenen Plattenspielern. Diese haben den Aufbau, der bei der Beschreibung der Umsetzung der Turntables bereits erlutert wurde. Beide Kanle werden durch einen so genannten Mixer-Stream zusammengefasst, welcher spter als Ausgangskanal genutzt wird. Um das Vorhren und Mixen unabhngig vom eigentlichen Masterausgang zu ermglichen, gibt es fr jeden Kanal eine Kopie, die sich genau wie der ursprngliche Stream verhlt. Diese Kopien laufen in einem zweiten 29

PROGRAMMIERHANDBUCH

Mixer-Stream zusammen und bilden dadurch einen unabhngigen zweiten Mixer. Die fr jeden Kanal verfgbaren Equalizereinstellungen werden bereits vor dem Klonen auf das Audiomaterial angewendet und sind dadurch fr Master und Cue gleichzeitig hrbar. Den mehr oder weniger dritten Hauptkanal am Mischpult bildet die Eekteinheit. Allerdings ordnet sie sich nicht neben den beiden anderen Eingngen ein, sondern wird erst auf die Summe vor dem Ausgang angewendet. Dadurch ist es nicht mglich verschiedene Eekte gleichzeitig auf einzelnen Kanlen zu haben, was aber laut Spezikation auch nicht angedacht ist. Das Signal, welches aus der Zusammenfassung der beiden Eingnge, den mglichweise angewendeten Equalizern und der Eekteinheit besteht, wird nun ein weiteres Mal auf gesplittet. Dadurch ist es mglich beispielsweise zwei verschiedene Soundkarten oder eine Soundkarte und den Streaming-Server als getrennte Ausgnge anzusprechen. Bei der Nutzung des Streamings ist im ganzen Ablauf darauf zu achten, dass Modikationen des Audiosignals auch direkt auf den Rohdaten der Eingnge ausgefhrt werden muss. Manche Funktionen der Audiobibliothek machen Modikationen zwar lokal hrbar, verndern die Daten des Audiosignals allerdings nicht. Eekte und Equalizer wren fr entfernte Zuhrer am Ende der Streams nicht zu hren. Fr die Kanle zum Vorhren muss auf diesen Umstand nicht geachtet werden, da sie nur zur lokalen Nutzung vorgesehen sind.

Streaming Wie in den Vorberlegungen beschrieben, soll fr djBench keine eigener Streamingdienst realisiert, sondern ein verfgbarer Dienst verwendet und entsprechend in das Programm eingebunden werden. Die verwendete Audiobibliothek BASS bietet dafr geeignete Methoden als Schnittstellen an und es ist lediglich dafr zu sorgen einen geeigneten Audio Encoder und einen Streaming-Server bereitzustellen. Fr die Kodierung der Audiodaten wurde LAME MP3 Encoder ausgewhlt. Er ist weit verbreitet und bietet eine gute Qualitt. Durch eine entsprechende Methode wird der Encoder von der Audiobibliothek aufgerufen und wandelt die Daten der Kopie des Master-Streams um, damit sie fr den Streaming-Einsatz geeignet sind. Im nchsten Schritt werden diese Daten durch den Aufruf einer weiteren Bibliotheksfunktion an den Streaming-Server weitergereicht. Der Server sorgt dann dafr, dass potentielle Zuhrer das Audiomaterial ver30

PROGRAMMIERHANDBUCH

wenden knnen. Aus Performance-Grnden ist es ratsam den Streaming-Server auf einem dedizierten System laufen zu lassen. Da die Bibliothek und die beiden externen Programme sehr eigenstndig fr die Erledigung ihrer Aufgaben sorgen, ist an dieser Stelle kein weiterer groer Implementierungsaufwand ntig. 3.3.3 Lightshow Empfangen der Sound-Daten Nach dem Starten der Anwendung wird eine Verbindung zu einem Streaming-Server aufgebaut, der den Sound des CoBench empfngt. Es kann sich dabei um Shoutcast oder Icecast handeln und die IP kann wie im Benutzerhandbuch beschrieben ber eine INI-Datei gesetzt werden. Die Funktionalitt bernimmt zu groen Teilen die BASS-Bibliothek, die ber eine Schnittstelle zum Verbinden und Abspielen verfgt. Falls die Verbindung aus irgendeinem Grund getrennt wird, versucht sich die Anwendung im Abstand von fnf Sekunden neu zu verbinden. Dies geschieht ber einen Thread, der im Hintergrund luft und stets die Verbindung berprft. Alle Sound-Operationen, wie auch die folgenden, sind in einer Sound-Klasse gekapselt. Verarbeitung der Sound-Daten Da fr das Verteilen des Sounds ein Streaming-Server verwendet wurde und damit ein Groteil der Arbeit durch die BASS-Bibliothek abgenommen wird, mssen lediglich die Daten von der FFT-Darstellung in einen nutzbaren Frequenz-Bereich umgerechnet werden. Dafr wurde eine Routine in der Sound-Klasse entwickelt, die die Transformation bernimmt. Die Anzahl der Unterteilungen des Spektrums kann dabei beliebig gewhlt werden, je nachdem wie es fr eine Visualisierung gewnscht ist. Bei der Towers-Visualisierung wird beispielweise in vier Frequenz-Bereiche aufgeteilt. Auf die damit erhaltenen Sound-Daten kann von einer Visualisierung direkt zugegreifen werden und anschlieend weiterverarbeitet werden. Wiedergabe der Sound-Daten Mit BASS ist es mglich eine Tabelle aufzustellen, in der angegeben wird, welcher Kanal (links bzw. rechts) vom Stereo-Sound auf welcher Box abgespielt werden soll. Es ndet hier also ein Upmixing in folgender weise statt: Upmix-Tabelle (Linke Spalte = linker Kanal, rechte Spalte = rechter Kanal):
01 Const oat matrix[12] = { 02 03 04 05 06 07 08 } 1.0f, 0.0f, // Links vorne 0.0f, 1.0f, // Rechts vorne 1.0f, 0.0f, // Links hinten 0.0f, 1.0f, // Rechts hinten 1.0f, 1.0f, // Center Box 0.1f, 0.1f // Subwoofer

Das Ansteuern der Bodenplatte der CAVE beispielsweise wird auf diese Weise realisiert. Zudem bietet BASS einen Tief-Pass-Filter an, der hier angewendet wird. Dieser leitet nur die Frequenzen weiter, die unter 50 Hertz liegen. Das Upmixing und der Filter konnten nur mittels eines zustzlichen virtuellen Mixerkanals umgesetzt werden. Dieser empfngt die Daten aus dem Streaming-Kanal und verndert die Daten entsprechend, bevor sie abgespielt werden. Visualisierung des Sounds in 3D Es wurde ein Singleton-Objekt entwickelt, das alle verfgbaren Visualisierungen verwaltet. Zudem bernimmt es den Farbverlauf und das Wechseln von Visualisierungen sowie weitere Kongurationen. Um eine klare Schnittstelle zu denieren, wurde eine abstrakte Klasse entwickelt, von der alle Visualisierungen erben mssen. 31

PROGRAMMIERHANDBUCH

Eine vererbte Klasse kann auf Werte wie die aktuelle Farbe zugreifen und diese benutzen. Auerdem gibt es einen custom-Wert, der beliebig verwendet werden darf. Dazu muss er im Konstruktor aktiviert werden. Dort wird auch der Name fr die Visualisierung gesetzt. Dies sieht dann folgendermaen aus:
01 M_bCustomizable = true; 02 M_strTitle = "Name der Visualisierung"

Alles was in der doRender-Methode steht, wird spter aufgerufen. Es kann normaler OpenGL-Code benutzt werden, um Grak-Eekte zu erzeugen. Die Sound-Daten benden sich in der Member-Variablen m_ vSoundData. Wenn das Holen der Audio-Daten verndert werden soll, kann die Methode retrieveSoundData berschrieben werden, ansonsten ndet standardmig eine Vier-Teilung des Spektrum statt. Steuerung der Visualisierungen ber das Netzwerk Um die Eekte der Lightshow ber das Netzwerk steuern zu knnen, agiert die Lightshow-Anwendung als TCP-Server. Dadurch kann sich ein beliebiges Programm verbinden und Befehle senden. Die Netzwerkkommunikation wurde mit der boost::asio-Bibliothek realisiert. Sobald sich eine Anwendung mit dem Server verbindet, werden dieser die Namen der verfgbaren Visualisierungen geschickt. Auerdem wird bermittelt, ob der custom-Wert genutzt wird. Anschlieend knnen Kommandos ausgefhrt werden, die in der Protokoll-Datei visualization_control_protocol.h aufgefhrt sind. Der Port fr den Server lautet 3334. Fr die CoBench-Anwendung wurde dieses Protokoll genutzt, um das Lightshow-Modul zu realisieren. Dafr ist die Klasse djbVisualizationControl erstellt worden, die sich mit dem Server verbindet und das Senden der Befehle bernimmt. Diese wird nur dann instanziiert, wenn in den Einstellungen angegeben wurde, dass die Lightshow genutzt werden soll. Bei einem Verbindungsverlust wird automatisch ein Neuaufbau versucht. Wegen dieser berprfung wurde TCP als Netzwerkprotokoll verwendet. 3.4. Beschreibung grundlegender Datenstrukturen Im Folgenden Abschnitt sind einige der zentralen Datenstrukturen von der djBench-Anwendung aufgelistet und beschrieben. 3.4.1 CoBench-App Speicherung aller relevanten Daten eines Musikstcks Fr das Laden und Abspielen eines Tracks sind sowohl die Speicherung des Dateinamens als auch der absolute Pfad zum Speicherort wichtig. Zustzlich wird das passende Albumcover fr die Darstellung eines Tracks innerhalb einer Musikbibliothek bentigt, das (falls vorhanden) aus dem ID3-Tag extrahiert und auf der Festplatte abgelegt werden kann. Auch den Pfad zum Speicherort gilt es dabei festzuhalten. Gleiches gilt fr die Meta-Informationen Knstlername sowie Lied- und Albumtitel. Die relevanten Daten fr jeweils einen Track sind durch die Datenstruktur track wie folgt dargestellt:
01 Typedef struct { 02 03 04 05 06 07 string name; string artist; string title; string album; string image; string path;

08 } track;

Alle eingelesenen Lied-Informationen bilden eine Liste (aus der C++ Standard Template-Bibliothek) mit Elementen diesen Typs. Lied-Informationen in einem XML-Dokument In der XML-Datei zum cachen der Musikbibliothek werden smtliche Informationen der Track-Liste gespeichert. 32

PROGRAMMIERHANDBUCH

Die zugrunde liegende XML-Struktur sieht dabei wie folgt aus:


01 <library> 02 03 04 05 06 07 08 09 10 11 12 <track> <name>NameDerDatei.mp3</name> <artist>Knstler</artist> <title>Titel</title> <album>Album</album> <image>RelativerPfadZumImage.jpg</image> <path>AbsoluterPfad</path> </track> <track> //weiterer Track </track>

13 </library>

Der Inhalt des Dokumentes wird von dem root-Element <library> umschlossen, was eine Musikbibliothek kennzeichnet. Innerhalb des root-Elements wird jeder Track mit dem Schlsselwort <track> eingeleitet. Ein track-Element beinhaltet schlielich die jeweiligen Lied-Informationen. Somit lsst sich eine beliebig groe Musikbibliothek abbilden. 3.4.2 CAVE-App Partikel Fr die Hurricane-Visualisierung wurde ein einfaches Partikelsystem entwickelt. Jedes einzelne Partikel ist ein Objekt mit folgenden Eigenschaften:
01 boost::array<oat, 3> m_vPosition; // Aktuelle Position 02 boost::array<oat, 3> m_vDirection; // Flug-Richtung 03 oat m_fSize; // Gre 04 int m_iBirthday; // Geburtszeitpunkt 05 int m_iLifetime; // Lebensdauer 06 bool m_bLife; // Flag, ob das Partikel lebendig ist 07 bool m_bIsDying; // Flag, ob das Partikel gerade stirbt 08 bool m_bBorn; // Flag, ob das Partikel geboren wurde 09 oat m_fFadeSpeed; // Geschwindigkeit fr das Verschwinden 10 oat m_fFadeInSpeed; // Geschwindigkeit fr das Erscheinen 11 oat m_fOpacity; // Aktuelle Transparenz 12 oat m_fSpeed; // Flug-Geschwindigkeit

ber eine Fabrikmethode kann ein neues Partikel erzeugt werden. TCP Kommunikation zur Steuerung der Visualisierungen Bei der Umsetzung der Steuerungsbefehle ber das Netzwerk mittels TCP wurde die asio-Bibliothek aus dem boost-Paket verwendet. Dabei ist es notwendig eine eigene Klasse fr den Server und eine fr die Verbindung zu einem Client zu entwickeln. Der Server akzeptiert Anfragen oder lehnt sie ab und bernimmt somit die Verwaltung der Clients. Sobald eine Verbindung hergestellt wurde, wird sie abgespeichert und fortlaufend auf ihre Gltigkeit berprft. ber eine Connection, die einen Socket enthlt, werden Befehle des Clients empfangen und beim Verbindungsaufbau werden einmalig die verfgbaren Visualisierungen bermittelt. Farbe Fr das berblenden der Farben von den Visualisierungen wurde eine Farb-Klasse erstellt. Diese enthlt die drei Farbanteile Rot, Grn und Blau und einen Alpha-Wert. Die Klasse verfgt ber eine Fabrikmethode zum Erzeugen von Farb-Objekten. Es knnen folgende vorgefertigte Farben erzeugt werden, die in einem Enumeration-Typ abgelegt sind:

33

PROGRAMMIERHANDBUCH

01 enum Color::ColorPreset { 02 03 }; Blue, Red, Yellow, Green, ColorCount

ColorCount dient dabei nur zur Bestimmung der Anzahl der vordenierten Farben. 3.5 Programmorganisationsplan yf*-Klassen Alle Klassen mit dem Prx yf wurden durch die eyefactive GmbH zur Verfgung gestellt und bilden das Framework, das zur Entwicklung einer Multitouch-Anwendung auf der CoBench verwendet werden kann. Die Klasse yfApp steht als einzige in direkter Verbindung mit den fr die djBench erstellten djb*-Klassen und kann als Hauptprogramm angesehen werden.

djb*-Klassen Das Prx djb kennzeichnet alle Klassen, die fr die djBench angelegt wurden. Sie bilden den Kern des Programms. Der Groteil der Klassen sind Widgets, die die Widgetklassen des Frameworks verwenden bzw. erweitern und fr die Gestaltung der Programmoberche bentigt werden. Die restlichen Klassen enthalten die Programmlogik und Dateioperationen.

34

PROGRAMMIERHANDBUCH

Lightshow Klassen Fr die Lichtshow in der CAVE wurde ein, von der FH Wedel zur Verfgung gestelltes, Framework zur 3D-Darstellung und Tracking verwendet. Es dient dabei als Grundgerst und wurde um entsprechende Funktionalitten erweitert. Die OpenAL-Bibliothek wurde dabei durch die BASS-Bibliothek ersetzt, um die Mglichkeit zu erhalten mit den Streaming-Servern kommunizieren und Audio-Daten auszulesen zu knnen. In der io.cpp-Datei des VR-Frameworks wird das Sound-Objekt, der TCP-Server zum Empfangen von Kommandos und das Manager-Objekt fr die Visualisierungen initialisiert und aktualisiert.bernehmen alle weiteren Funktionalitten. Dadurch ist die Lightshow-Anwendung relativ lose gekoppelt an das Framework gekoppelt.

Icecast und Lame Die Streaming Funktionalitt von djBench wurde nicht selbst implementiert. Sie baut zum einen auf die Untersttzung des verwendeten Audio-Frameworks BASS, sowie auf die Verwendung zweier externer Programme auf. Die Daten werden dabei ber entsprechende Methoden des Frameworks in den Encoder (Lame) und anschlieend an den Streaming-Server Icecast geleitet. 3.6 Programmtests Damit die Qualitt einer Software sichergestellt werden kann muss sie intensiv getestet werden. Das Testen kann und muss dabei auf verschiedenen Programmebenen durchgefhrt werden. Im Idealfall sind die Testflle aus der zugrunde liegenden Spezikation abzuleiten und bereits vor der eigentlichen Implementierung fertigzustellen. Funktionale Tests knnen natrlich erst nach der Fertigstellung erfolgen. Da bei der Entwicklung von djBench keine neuartigen Datenstrukturen implementiert wurden und die Software selbst keine komplexen Berechnungen durchfhrt, sondern eine bestimmte Funktionalitt erfllen soll, wurde auf Tests auf niedrigster Ebene in Form von Unit-Tests verzichtet. Die funktionalen Tests, die whrend bzw. nach Fertigstellung der einzelnen Teile durchgefhrt wurden lassen sich gedanklich in drei Abschnitte aufteilen. 35

PROGRAMMIERHANDBUCH

Oberche Das Testen der Programmoberche von djBench wurde whrend der gesamten Entwicklungsphase kontinuierlich durchgefhrt. Die Oberche besteht aus vielen einzelnen, simplen Widgets, die zu greren Objekten zusammengesetzt wurden. Durch die Verwendung von Graken als Skins bzw. Texturen erhlt die Anwendung erst ein realistisches ueres. Auf dessen Basis wurden die funktionalen Tests der Programmoberche durchgefhrt. Dabei galten verschiedene Bedienungsschritte aus realen Ablufen als Vorlage. Magabe fr das erfolgreiche Bestehen der Tests war die intuitive Umsetzung der Handlungsschritte mit dem Programm. Schwerwiegende Konstruktionsfehler der Bedienelemente konnten dabei meist nicht festgestellt werden. Vielmehr wurden durch diese Tests logische Fehler, wie die Rckgabe falscher Positionswerte der Potentiometer und Fader, aufgedeckt und korrigiert. Sound Eine gem den gewnschten Anforderungen funktionierende Soundwiedergabe bildet das Akzeptanzkriterium fr den erfolgreichen Projektabschluss. Aus diesem Grund wurde in diesem Bereich der meiste Testaufwand betrieben. Zunchst wurden, soweit mglich, die Schalter, Drehknpfe und Schieberegler des Mixers fr sich allein auf ihre korrekte Funktionalitt berprft. Eine Bedienung ber die Programmoberflche musste die entsprechende Vernderung in der Soundwiedergabe bewirken. Auftretende Fehler, welche meistens nur aus einer falschen Umrechnung der Parameter bestanden, konnten dadurch direkt behoben und eine Verkettung von Fehlern bei komplexeren Benutzeraktionen vermieden werden. Im Anschluss wurde das Mischpult als ganzes, durch Nachempfindung einer berblendung von zwei Tracks, in seiner Funktionsweise getestet. Da bei diesem Ablauf jeder Regler des Mixers bedient wird, war, nach Korrektur der festgestellten Fehler, die einwandfreie Funktion des Mischpults sichergestellt. Groe Probleme sind dabei nicht aufgetreten. Die Nachbesserungen beschrnkten sich auf geringe Parameteranpassungen bei der Effekteinheit und die Behebung der falschen Beeinflussung der Lautstrkeregler untereinander. Whrend die berprfung der korrekten Lautstrkewerte im Zweifelsfall auch durch die Ausgabe der Zahlenwerte htte berprft werden knnen, gestaltete sich der Test der Equalizer und Effekte hingegen etwas schwieriger. Referenzen bildeten hierbei andere Musikprogramme und ein echtes Mischpult mit Effekteinheit. Durch anwenden gleicher Soundvernderungen einerseits in djBench und andererseits im Referenzprogramm bzw. am Mischpult wurde das akustische Ergebnis verglichen. Neben der Funktionalitt der Soundmodifizierung des Mischpults ist es auch seine Aufgabe das Audiosignal zur direkten Ausgabe weiterzuleiten. Hierfr mssen zwei Kriterien erfllt sein. Einerseits die lokale Wiedergabe des Vorhr-Kanals und die Ausgabe des Masterkanals, sowie andererseits die bertragung zur entfernten Wiedergabe an den Streaming-Server. Das Umschalten der lokalen Wiedergabemglichkeiten und whlen von verschiedenen Soundkarten konnte einfach berprft und sichergestellt werden. Beim Test der Wiedergabe des Icecast-Streams mussten allerdings Latenzzeiten festgestellt werden. Diese waren zwar deutlich niedriger, als die Werte des Shoutcast-Streams, von Echtzeit-Playback konnte allerdings nicht gesprochen werden. Da dieser Umstand aber bereits bekannt und kalkuliert war, wurde lediglich auf eine nicht zu groe Verzgerung geachtet. Den wichtigsten Teil der Soundtests stellte die Umsetzung des Plattenspielers bzw. des Scratchens dar. Hier musste zum einen die Funktionsweise der Geschwindigkeitsnderung geprft werden und zum anderen die Bedienung des Plattenspielers von Hand, also das Scratchen, um die, laut Spezifikation geforderte, Qualitt zu erreichen. Der Pitch-Regler (fr Geschwindigkeitsnderungen) funktionierte auf Anhieb und ohne Probleme. Das Scratchverhalten hingegen bereitete einige Probleme. Die manuelle Wiedergabe bei sehr langsamer Geschwindigkeit klang sehr ruckelig und stockte, die Wiedergabe bei sehr hoher Geschwindigkeit klang unnatrlich und Artefakte waren hrbar. Dadurch waren an dieser Stelle hufige Nachbesserungen ntig. Letztendlich wurde aber ein zufriedenstellendes Ergebnis erreicht und die akustische Empfindung des Scratchens auf der djBench kommt der Realitt sehr nahe.

36

PROGRAMMIERHANDBUCH

Lichtshow Die Lichtshow konnte unabhngig von den restlichen Programmteilen getestet werden. Dazu wurde eine beliebige Audioquelle bentigt, um die Frequenzen, die die Bewegung des Lichtes beeinussen, auszulesen. Da es sehr schwierig und abstrakt ist, sich einen gewnschten Lichteekt allein anhand von Zahlenwerten im Kopf vorzustellen wurde hier whrend der Implementierung bereits sehr viel getestet. Dabei dienten die Visualisierungen von diversen Medienplayern als Referenzen. Getestet wurde das Reaktionsverhalten der Animation auf Synchronitt zur Musikwiedergabe, die konkrete Umsetzung der verschiedenen Darstellungen, sowie das Wechseln zwischen ihnen.

37

Das könnte Ihnen auch gefallen