Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html>
- <head>
- <title>"Signalverabeitung & Mustererkennung"</title>
- <meta charset="utf-8">
- </head>
- <body>
- <header>
- <h1>Signalverarbeitung und Mustererkennung 2015/2016</h1>
- <h2>Synthesizer-App</h2>
- </header>
- <div id="Gruppenaufzaehlung">
- <h2>Gruppe 2</h2>
- <ul>
- <li>Soeren Klante 570158</li>
- <li>Marvin Meier 570133</li>
- <li>Niklas Springhorn 570158</li>
- <li>Christopher Starck 570158</li>
- <li>Anuwat Pinithommanat 570158</li>
- <li>Donovan Wunderlich 570158</li>
- </ul>
- </div>
- <div id="Inhaltsverzeichnis">
- <h2>Inhaltsverzeichnis</h2>
- <ol>
- <li><a href="#Aufgabenstellung"><strong>Aufgabenstellung & Idee......................................2</strong></a></li>
- <li><a href="#AnwendungGestaltung"><strong>Die Anwendung und ihre Gestaltung...................9</strong></a></li>
- <li><a href="#ProblemeLoesungen"><strong>Probleme & Lösungen..........................................4</strong></a></li>
- <li><a href="#CodeAufbau"><strong>Code-Dokumentation..........................................5</strong></a></li>
- <li><a href="#ErweiterungVerbesserungsideen"><strong>Code-Dokumentation...........................................6</strong></a></li>
- </ol>
- </div>
- <div id="Content">
- <div id="Aufgabenstellung">
- <h2 id="#Aufgabenstellung">1. Aufgabenstellung & Idee</h2>
- <br/>
- <h3>Aufgabe</h3>
- <p>
- Die Aufgabe ist es, einen <strong>Synthesizer</strong> zu programmieren, der als <strong>mobile Applikation</strong> auf dem Betriebssystem
- Android verfügbar sein soll. Dabei gilt es, für den Großteil der Geräte Kompatibilität zu erschaffen: es soll
- mit dem <strong>API-Level 15</strong> programmiert werden.
- </p>
- <h3>Idee</h3>
- <p>
- Wir wollen einen Synthesizer erstellen, der vom Benutzer mithilfe einer Klaviatur und einem oder mehreren
- Reglern gesteuert werden kann. Unsere ersten Grundideen bzw. -features waren:
- </p>
- <ul>
- <li>Klaviatur</li>
- <li>Unterstützung von Polyphonie</li>
- <li>Flexible Hüllkurven: Attack, Decay, Sustain, Release</li>
- <li>Fortgeschritten: Steuerung von Wellenform-Anteilen (Sinus, Rechteck, Dreieck, Sägezahn)</li>
- </ul>
- </div>
- <div id="AnwendungGestaltung">
- <h2 id="#AnwendungGestaltung">2. Die Anwendung und ihre Gestaltung</h2>
- <br/>
- <h3>Gestaltung & Idee</h3>
- <p>
- Die Grundstruktur & Grundidee der Anwendung bezieht sich auf
- ein Tonstudio. Die Basisbestandteile eines Tonstudios bilden ein
- Masterkeyboard sowie Fader und auch Knöpfe, die für verschiedensten
- Einstellungen von Nöten sind. Diese Bestandteile haben wir in
- unsere Anwendung integriert.
- Auf dem Display eines Smartphones hat man nicht viel Platz, deshalb
- mussten wir uns überlegen, wie wir die Masse von Einstellungen für
- unsere Anwendung in ein Display von durchschnittlich 4-5 Zoll unterbringen.
- </p>
- <div id="picTonstudio">
- <img src="./pictures/tonstudio.jpg" height ="200" width="300" alt="Tonstudio"/>
- <p>Abbildung 1: Tonstudio inkl. Fader & Knöpfe</p>
- </div>
- <h3>Die Elemente der Anwendung</h3>
- <p>
- Letztendlich haben wir drei verschiedene Fader- und somit Steuereinheiten realisiert. Die Ganzheit der
- Anwendungselemente umfasst:
- </p>
- <ul>
- <li>Keyboard (1 Oktave)</li>
- <li>13 verschiedene Fader</li>
- <li>3 Buttons (Envelope/Mix/Phasenverschiebung)</li>
- <li>2x Graphen</li>
- </ul>
- <p>
- Das Display wird im <strong><em>Landscape-Modus</em></strong> ausgeführt. Das Keyboard befindet sich an der Unterseite des Bildschirms.
- Ein Tastendruck löst - visuell verdeutlicht durch ein Wechseln des Hintergrundbilds - die Tonerzeugung,
- die von den einzelnen Fader-Einstellungen abhängig ist.
- </p>
- <ul>
- <li><img src="./pictures/envBut.jpg" alt="Envelope ingame Button"/><p>Die Fader lassen sich nach oben 100% der Leistung oder nach unten 0% regulieren. Die
- Anwendung wird immer mit gedrückter ENV-Taste gestartet. Die ENV-Taste (Envelope)
- blendet bei Betätigung die Fader zur Einstellung der Parameter Attack, Decay, Sustain und
- Release ein. Anhand dieser steuert man die Amplitude des Tones über die Zeit.</p></li>
- <li><img src="./pictures/mixBut.jpg" alt="Mix ingame Button"/><p>Beim Drücken des MIX-Buttons wird die Skala, Bezeichnung der Fader und die Fader ausgetauscht.
- In diesem Zustand kann man die Signalmischung und damit die Klangfarbe bestimmen.
- Wie sehr soll ein Dreieck- oder ein Rechteck-Signal den Ton beeinflussen? Zudem
- verändert sich der Graph und stellt die aktuelle Frequenz, Amplitude und Phase dar.</p></li>
- <li><img src="./pictures/phsBut.jpg" alt="Phase ingame Button"/><p>Die Fader lassen sich nach oben 100% der Leistung oder nach unten 0% regulieren. Die
- Anwendung wird immer mit gedrückter ENV-Taste gestartet. Die ENV-Taste (Envelope)
- blendet bei Betätigung die Fader zur Einstellung der Parameter Attack, Decay, Sustain und
- Release ein. Anhand dieser steuert man die Amplitude des Tones über die Zeit.</p></li>
- </ul>
- <div id="ScreenOne">
- <p><img src="./pictures/screenOne.jpg" width="500" height="300" alt="Applikation first side"/></p>
- <p>Aktivierung des Envelope-Buttons. Der Graph der Hüllkurve erscheint
- mit den Standardwerten der Fader.</p>
- </div>
- <div id="ScreenTwo">
- <p><img src="./pictures/ScreenTwo.jpg" width="500" height="300" alt="Applikation second side" /></p>
- <p>Aktivierung des Mix-Buttons. Ein anderer Graph visualisiert einen
- Ausschnitt des aktuell erzeugten Tonsignals, entsprechende Fader
- ermöglichen die Justierung. Die Fader sind normalisiert: alle
- Faderwerte addiert werden immer auf 1 (100%) geregelt.</p>
- </div>
- <div id="ScreenThree">
- <p><img src="./pictures/screenThree.jpg" width="500" height="300" alt="Applikation third side"/></p>
- <p>Aktivierung des Phasen-Buttons. Der Graph bleibt gleich, die
- Amplitude verändert sich aber je nach Manipulation.</p>
- </div>
- </div>
- <div id="ProblemeLoesungen">
- <h2 id="#ProblemeLoesungen">3. Probleme und Lösungen</h2>
- <p>Im Laufe der Entwicklung traten bestimmte Probleme auf, die bewältigt werden mussten. Dazu zählen:</p>
- <ul>
- <li>Steuerung der Polyphonie</li>
- <li>Steuerung der Töne während ihrer Laufzeit</li>
- <li>Anwenden der Hüllkurve trotz Buffer- und Interaktionshindernis („Wann hört der User auf?“)</li>
- </ul>
- <p>Im Folgenden möchten wir darauf eingehen, wie wir diese Probleme angegangen sind.</p>
- <h3>Steuerung der Polyphonie</h3>
- <p>Wenn der Anwender mehrere Tasten, zum Beispiel C und E gedrückt hält, sollen mehrere Töne abgespielt
- werden. Wir haben uns entschieden, dieses Problem durch mehrere parallele Play-Threads zu lösen, die von
- einem PlayManager verwaltet werden.</p>
- <p><img src="./pictures/steuerungPolyphonie.jpg" alt="Steuerung Polyphonie"/></p>
- <p>Damit nicht unendlich viele Play-Threads referenziert werden, wird bei jedem Initialisieren einer neuen
- Play-Instanz via add() die Methode checkForEndedPlays() aufgerufen, die nach vollendeten Sounds
- in den Listen sucht und diese dereferenziert. Wir haben in Erwägung gezogen, einen Thread zu instanziieren,
- der in regelmäßigen Abständen solche Prüfungen vornimmt - aus Gründen der Thread-to-Thread-Kommunikations-
- und allgemeinen Performance-Bedenken haben wir uns jedoch gegen diese Methodik entschieden.</p>
- <h3>Anwenden der Hüllkurve</h3>
- <p>Ein großes Problem war das Anwenden der Hüllkurve auf die einzelnen Buffer. Zwei Ursachen dieses Problems:</p>
- <ul>
- <li>Zeitpunkt des Loslassens einer Taste seitens des Users ist variabel</li>
- <li>Audio wird in in der Länge variierende Audiobuffer aufgeteilt</li>
- </ul>
- <p>Was also getan werden muss, ist, jede Play-Instanz mit jeder Buffer-Berechnung einem Status zuzuordnen,
- der berechnet werden muss. Wir haben uns für sechs <strong>Status</strong> entschieden:</p>
- </div>
- <div id="CodeAufbau">
- <h2 id="#CodeAufbau">4. Code-Aufbau</h2>
- <p><img src="./pictures/codeAufbau.jpg" alt="Applikation Code - Aufbau"/></p>
- </div>
- <div id="ErweiterungVerbesserungsideen">
- <h2 id="#ErweiterungVerbesserungsideen">5. Erweiterungs-/Verbesserungsideen</h2>
- <ul>
- <li><strong>Erweiterung: Loop Maschine</strong></li>
- <li><strong>Verbesserung: Amplitudensteuerung</strong></li>
- </ul>
- <p>Das Grundprinzip einer LoopMachine scheint
- auf den ersten Blick nicht schwer zu implementieren:
- der Anwender drückt auf eine Taste und die
- Aufnahme beginnt (jeder Tastendruck wird dessen
- zeitlichem Ursprung in einem Loop-Objekt gespeichert).
- Drückt er erneut, wird die Aufnahme beendet.
- Anschließend spielt ein LoopMachine>-Objekt
- den Loop stetig wiederholend ab. Play müsste dafür
- so erweitert werden, dass eine Play-Instanz allein
- abläuft und sich allein beendet. Das könnte man realisieren,
- indem man die Dauer des Tones übergibt
- (aus dem Loop-Objekt), diese Dauer in eine Zahl
- von Samples umrechnet und dann während der Signalverarbeitung
- abruft, ob diese Anzahl an Samples
- bereits verarbeitet wurde.</p>
- <p>Ein Manko unserer Anwendung ist die nicht-steuerbare
- Gesamtamplitude durch die Übertragung
- der Amplituden-Zusammenrechnung an das Android-
- System (durch die einzelnen Play-Threads, die
- simultan laufen). Es wäre denkbar, die Amplitude
- in irgendeiner Art zu steuern, und wir haben dies
- auch mit einer Art Compressor versucht, der in allen
- gleichzeitig ablaufenden Buffern in allen Play-
- Threads die maximale Amplitude heraussucht und
- die Buffer entsprechend in der Lautstärke anpasst.
- Allerdings hat das nicht den gewünschten Erfolg erzielt,
- verhielt sich sehr fehlerhaft und musste stark
- nachgebessert werden, was wir zeitlich nicht mehr
- geschafft hätten.</p>
- </div>
- </div>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement