Advertisement
Zidinjo

Homepage

Apr 1st, 2016
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 5 10.88 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.   <title>"Signalverabeitung &amp; Mustererkennung"</title>
  5.   <meta charset="utf-8">
  6. </head>
  7.   <body>
  8.     <header>
  9.       <h1>Signalverarbeitung und Mustererkennung 2015/2016</h1>
  10.       <h2>Synthesizer-App</h2>
  11.     </header>
  12.  
  13.     <div id="Gruppenaufzaehlung">
  14.       <h2>Gruppe 2</h2>
  15.       <ul>
  16.         <li>Soeren Klante         570158</li>
  17.         <li>Marvin Meier          570133</li>
  18.         <li>Niklas Springhorn     570158</li>
  19.         <li>Christopher Starck    570158</li>
  20.         <li>Anuwat Pinithommanat  570158</li>
  21.         <li>Donovan Wunderlich    570158</li>
  22.       </ul>
  23.     </div>
  24.  
  25.     <div id="Inhaltsverzeichnis">
  26.       <h2>Inhaltsverzeichnis</h2>
  27.       <ol>
  28.         <li><a href="#Aufgabenstellung"><strong>Aufgabenstellung &amp; Idee......................................2</strong></a></li>
  29.         <li><a href="#AnwendungGestaltung"><strong>Die Anwendung und ihre Gestaltung...................9</strong></a></li>
  30.         <li><a href="#ProblemeLoesungen"><strong>Probleme &amp; Lösungen..........................................4</strong></a></li>
  31.         <li><a href="#CodeAufbau"><strong>Code-Dokumentation..........................................5</strong></a></li>
  32.         <li><a href="#ErweiterungVerbesserungsideen"><strong>Code-Dokumentation...........................................6</strong></a></li>
  33.       </ol>
  34.     </div>
  35.  
  36.     <div id="Content">
  37.       <div id="Aufgabenstellung">
  38.         <h2 id="#Aufgabenstellung">1. Aufgabenstellung &amp; Idee</h2>
  39.       <br/>
  40.         <h3>Aufgabe</h3>
  41.         <p>
  42.           Die Aufgabe ist es, einen <strong>Synthesizer</strong> zu programmieren, der als <strong>mobile Applikation</strong> auf dem Betriebssystem
  43.           Android verfügbar sein soll. Dabei gilt es, für den Großteil der Geräte Kompatibilität zu erschaffen: es soll
  44.           mit dem <strong>API-Level 15</strong> programmiert werden.
  45.         </p>
  46.         <h3>Idee</h3>
  47.         <p>
  48.           Wir wollen einen Synthesizer erstellen, der vom Benutzer mithilfe einer Klaviatur und einem oder mehreren
  49.           Reglern gesteuert werden kann. Unsere ersten Grundideen bzw. -features waren:
  50.         </p>
  51.         <ul>
  52.           <li>Klaviatur</li>
  53.           <li>Unterstützung von Polyphonie</li>
  54.           <li>Flexible Hüllkurven: Attack, Decay, Sustain, Release</li>
  55.           <li>Fortgeschritten: Steuerung von Wellenform-Anteilen (Sinus, Rechteck, Dreieck, Sägezahn)</li>
  56.         </ul>
  57.       </div>
  58.  
  59.       <div id="AnwendungGestaltung">
  60.         <h2 id="#AnwendungGestaltung">2. Die Anwendung und ihre Gestaltung</h2>
  61.       <br/>
  62.         <h3>Gestaltung &amp; Idee</h3>
  63.         <p>
  64.           Die Grundstruktur &amp; Grundidee der Anwendung bezieht sich auf
  65.           ein Tonstudio. Die Basisbestandteile eines Tonstudios bilden ein
  66.           Masterkeyboard sowie Fader und auch Knöpfe, die für verschiedensten
  67.           Einstellungen von Nöten sind. Diese Bestandteile haben wir in
  68.           unsere Anwendung integriert.
  69.           Auf dem Display eines Smartphones hat man nicht viel Platz, deshalb
  70.           mussten wir uns überlegen, wie wir die Masse von Einstellungen für
  71.           unsere Anwendung in ein Display von durchschnittlich 4-5 Zoll unterbringen.
  72.         </p>
  73.         <div id="picTonstudio">
  74.           <img src="./pictures/tonstudio.jpg" height ="200" width="300" alt="Tonstudio"/>
  75.           <p>Abbildung 1: Tonstudio inkl. Fader &amp; Knöpfe</p>
  76.         </div>
  77.  
  78.         <h3>Die Elemente der Anwendung</h3>
  79.         <p>
  80.           Letztendlich haben wir drei verschiedene Fader- und somit Steuereinheiten realisiert. Die Ganzheit der
  81.           Anwendungselemente umfasst:
  82.         </p>
  83.         <ul>
  84.           <li>Keyboard (1 Oktave)</li>
  85.           <li>13 verschiedene Fader</li>
  86.           <li>3 Buttons (Envelope/Mix/Phasenverschiebung)</li>
  87.           <li>2x Graphen</li>
  88.         </ul>
  89.         <p>
  90.           Das Display wird im <strong><em>Landscape-Modus</em></strong> ausgeführt. Das Keyboard befindet sich an der Unterseite des Bildschirms.
  91.           Ein Tastendruck löst - visuell verdeutlicht durch ein Wechseln des Hintergrundbilds - die Tonerzeugung,
  92.           die von den einzelnen Fader-Einstellungen abhängig ist.
  93.         </p>
  94.  
  95.         <ul>
  96.           <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
  97.           Anwendung wird immer mit gedrückter ENV-Taste gestartet. Die ENV-Taste (Envelope)
  98.           blendet bei Betätigung die Fader zur Einstellung der Parameter Attack, Decay, Sustain und
  99.           Release ein. Anhand dieser steuert man die Amplitude des Tones über die Zeit.</p></li>
  100.           <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.
  101.           In diesem Zustand kann man die Signalmischung und damit die Klangfarbe bestimmen.
  102.           Wie sehr soll ein Dreieck- oder ein Rechteck-Signal den Ton beeinflussen? Zudem
  103.           verändert sich der Graph und stellt die aktuelle Frequenz, Amplitude und Phase dar.</p></li>
  104.           <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
  105.           Anwendung wird immer mit gedrückter ENV-Taste gestartet. Die ENV-Taste (Envelope)
  106.           blendet bei Betätigung die Fader zur Einstellung der Parameter Attack, Decay, Sustain und
  107.           Release ein. Anhand dieser steuert man die Amplitude des Tones über die Zeit.</p></li>
  108.         </ul>
  109.  
  110.         <div id="ScreenOne">
  111.           <p><img src="./pictures/screenOne.jpg" width="500" height="300" alt="Applikation first side"/></p>
  112.           <p>Aktivierung des Envelope-Buttons. Der Graph der Hüllkurve erscheint
  113.              mit den Standardwerten der Fader.</p>
  114.         </div>
  115.         <div id="ScreenTwo">
  116.           <p><img src="./pictures/ScreenTwo.jpg" width="500" height="300" alt="Applikation second side" /></p>
  117.           <p>Aktivierung des Mix-Buttons. Ein anderer Graph visualisiert einen
  118.           Ausschnitt des aktuell erzeugten Tonsignals, entsprechende Fader
  119.           ermöglichen die Justierung. Die Fader sind normalisiert: alle
  120.           Faderwerte addiert werden immer auf 1 (100%) geregelt.</p>
  121.         </div>
  122.         <div id="ScreenThree">
  123.           <p><img src="./pictures/screenThree.jpg" width="500" height="300" alt="Applikation third side"/></p>
  124.           <p>Aktivierung des Phasen-Buttons. Der Graph bleibt gleich, die
  125.             Amplitude verändert sich aber je nach Manipulation.</p>
  126.         </div>
  127.       </div>
  128.  
  129.       <div id="ProblemeLoesungen">
  130.         <h2 id="#ProblemeLoesungen">3. Probleme und Lösungen</h2>
  131.         <p>Im Laufe der Entwicklung traten bestimmte Probleme auf, die bewältigt werden mussten. Dazu zählen:</p>
  132.         <ul>
  133.           <li>Steuerung der Polyphonie</li>
  134.           <li>Steuerung der Töne während ihrer Laufzeit</li>
  135.           <li>Anwenden der Hüllkurve trotz Buffer- und Interaktionshindernis („Wann hört der User auf?“)</li>
  136.         </ul>
  137.         <p>Im Folgenden möchten wir darauf eingehen, wie wir diese Probleme angegangen sind.</p>
  138.         <h3>Steuerung der Polyphonie</h3>
  139.         <p>Wenn der Anwender mehrere Tasten, zum Beispiel C und E gedrückt hält, sollen mehrere Töne abgespielt
  140.         werden. Wir haben uns entschieden, dieses Problem durch mehrere parallele Play-Threads zu lösen, die von
  141.         einem PlayManager verwaltet werden.</p>
  142.         <p><img src="./pictures/steuerungPolyphonie.jpg" alt="Steuerung Polyphonie"/></p>
  143.         <p>Damit nicht unendlich viele Play-Threads referenziert werden, wird bei jedem Initialisieren einer neuen
  144.         Play-Instanz via add() die Methode checkForEndedPlays() aufgerufen, die nach vollendeten Sounds
  145.         in den Listen sucht und diese dereferenziert. Wir haben in Erwägung gezogen, einen Thread zu instanziieren,
  146.         der in regelmäßigen Abständen solche Prüfungen vornimmt - aus Gründen der Thread-to-Thread-Kommunikations-
  147.         und allgemeinen Performance-Bedenken haben wir uns jedoch gegen diese Methodik entschieden.</p>
  148.  
  149.         <h3>Anwenden der Hüllkurve</h3>
  150.         <p>Ein großes Problem war das Anwenden der Hüllkurve auf die einzelnen Buffer. Zwei Ursachen dieses Problems:</p>
  151.         <ul>
  152.           <li>Zeitpunkt des Loslassens einer Taste seitens des Users ist variabel</li>
  153.           <li>Audio wird in in der Länge variierende Audiobuffer aufgeteilt</li>
  154.         </ul>
  155.         <p>Was also getan werden muss, ist, jede Play-Instanz mit jeder Buffer-Berechnung einem Status zuzuordnen,
  156.         der berechnet werden muss. Wir haben uns für sechs <strong>Status</strong> entschieden:</p>
  157.       </div>
  158.  
  159.       <div id="CodeAufbau">
  160.         <h2 id="#CodeAufbau">4. Code-Aufbau</h2>
  161.         <p><img src="./pictures/codeAufbau.jpg" alt="Applikation Code - Aufbau"/></p>
  162.       </div>
  163.  
  164.       <div id="ErweiterungVerbesserungsideen">
  165.         <h2 id="#ErweiterungVerbesserungsideen">5. Erweiterungs-/Verbesserungsideen</h2>
  166.         <ul>
  167.           <li><strong>Erweiterung: Loop Maschine</strong></li>
  168.           <li><strong>Verbesserung: Amplitudensteuerung</strong></li>
  169.         </ul>
  170.         <p>Das Grundprinzip einer LoopMachine scheint
  171.         auf den ersten Blick nicht schwer zu implementieren:
  172.         der Anwender drückt auf eine Taste und die
  173.         Aufnahme beginnt (jeder Tastendruck wird dessen
  174.         zeitlichem Ursprung in einem Loop-Objekt gespeichert).
  175.         Drückt er erneut, wird die Aufnahme beendet.
  176.         Anschließend spielt ein LoopMachine>-Objekt
  177.         den Loop stetig wiederholend ab. Play müsste dafür
  178.         so erweitert werden, dass eine Play-Instanz allein
  179.         abläuft und sich allein beendet. Das könnte man realisieren,
  180.         indem man die Dauer des Tones übergibt
  181.         (aus dem Loop-Objekt), diese Dauer in eine Zahl
  182.         von Samples umrechnet und dann während der Signalverarbeitung
  183.         abruft, ob diese Anzahl an Samples
  184.         bereits verarbeitet wurde.</p>
  185.  
  186.         <p>Ein Manko unserer Anwendung ist die nicht-steuerbare
  187.         Gesamtamplitude durch die Übertragung
  188.         der Amplituden-Zusammenrechnung an das Android-
  189.         System (durch die einzelnen Play-Threads, die
  190.         simultan laufen). Es wäre denkbar, die Amplitude
  191.         in irgendeiner Art zu steuern, und wir haben dies
  192.         auch mit einer Art Compressor versucht, der in allen
  193.         gleichzeitig ablaufenden Buffern in allen Play-
  194.         Threads die maximale Amplitude heraussucht und
  195.         die Buffer entsprechend in der Lautstärke anpasst.
  196.         Allerdings hat das nicht den gewünschten Erfolg erzielt,
  197.         verhielt sich sehr fehlerhaft und musste stark
  198.         nachgebessert werden, was wir zeitlich nicht mehr
  199.         geschafft hätten.</p>
  200.       </div>
  201.     </div>
  202.   </body>
  203. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement