Worum es geht

Guitar Tune ist ein Stimmgerät für die sechssaitige Gitarre. Die App läuft auf Android, stimmt in der Standardstimmung E A D G H e und konzentriert sich ganz auf diese eine Aufgabe. Sie zeigt, welche Saite man zupfen soll, wie weit diese Saite danebenliegt und in welche Richtung man den Stimmwirbel drehen muss. Es gibt kein Konto und keinen Zugriff auf das Internet. Gebaut habe ich die App mit Hilfe von KI, nach dem Vorbild meiner Apps Shopping List, My Notes und Birthdays.

Die aktuelle Version gibt es direkt als APK Datei:

https://github.com/netperformance/GuitarTune/releases/download/v1.0.2/GuitarTune-1.0.2.apk

Das Projekt ist Open Source unter der MIT Lizenz und liegt auf GitHub:

github.com/netperformance/GuitarTune

Warum ein eigenes Stimmgerät

Viele Stimmgerät Apps sind mit Funktionen überladen, die man zum Stimmen nicht braucht. Ich wollte eine App, mit der man schnell und ohne Ablenkung stimmt.

Dazu kommt: Wer zum ersten Mal eine Gitarre stimmt, weiß oft nicht, welche Saite die A Saite ist, an welchem Stimmwirbel er drehen muss und in welche Richtung. Ein übliches Stimmgerät zeigt nur einen Notennamen und eine Nadel. Guitar Tune zeigt stattdessen die Kopfplatte einer Gitarre, also das obere Ende mit den Stimmwirbeln. Darauf sind die Saite und der Stimmwirbel markiert, um die es gerade geht, und ein Pfeil zeigt die Drehrichtung.

Die App im Überblick

Die App hat einen einzigen Bildschirm. Welche Saite dran ist, sieht man unten an der Kopfplatte: Saite und Stimmwirbel sind farbig markiert. Oben steht groß, wie die Saite gerade klingt: „Saite zupfen“, „Zu tief“, „Etwas zu tief“, „Stimmt“, „Etwas zu hoch“ oder „Zu hoch“. Ein kurzer Satz sagt, was zu tun ist, etwa „Die Mechanik etwas spannen“.

Drei Bildschirme der App nebeneinander: links wartet die App auf den Ton der tiefen E Saite, in der Mitte ist die Saite zu tief und ein Pfeil auf dem Stimmwirbel zeigt nach oben, rechts stimmt die Saite und ein grüner Ring füllt sich

  • Geführtes Stimmen: Die App beginnt mit der tiefen E Saite. Danach folgen A, D, G, H und die hohe e Saite. Stimmt eine Saite eine Sekunde lang, bekommt sie einen grünen Haken und die App wechselt zur nächsten. Während dieser Sekunde füllt sich ein grüner Ring um den Buchstaben der Saite.
  • Saite selbst wählen: Tippt man auf einen Buchstaben neben der Kopfplatte, springt die App zu dieser Saite. So lässt sich auch eine Saite nachstimmen, die schon einen Haken hat.
  • Eine Farbe, eine Bedeutung: Blau heißt, die App wartet auf einen Ton. Rot heißt, die Saite liegt weit daneben, Orange heißt nah dran, Grün heißt, die Saite stimmt. Gemessen wird die Abweichung in Cent. Ein Cent ist ein Hundertstel eines Halbtons, also ein Hundertstel des Abstands zwischen zwei benachbarten Bünden. Rot steht für mehr als 15 Cent, Orange für 6 bis 15 Cent, Grün für höchstens 5 Cent. Das große Wort, der Zeiger, die Saite, der Stimmwirbel, der Buchstabe und der Punkt ganz unten haben immer dieselbe Farbe. Weil das Wort immer dabeisteht, funktioniert die App auch bei einer Rot Grün Schwäche.
  • Drehrichtung: Ein Pfeil auf dem Stimmwirbel zeigt, wohin man drehen muss: nach oben zum Spannen, nach unten zum Lockern. Der Pfeil gilt für die übliche Bauweise. Hat eine Gitarre andere Mechaniken und man dreht in die falsche Richtung, zeigt der Zeiger das sofort.
  • Balken mit Zeiger: Unter dem Wort steht ein waagerechter Balken. Das grüne Feld in der Mitte ist das Ziel. Darunter stehen die Abweichung in Cent und die gemessene Frequenz in Hertz.
  • Falsche Saite: Liegt der Ton mehr als dreieinhalb Halbtöne daneben, hat man vermutlich die falsche Saite gezupft. Dann fragt die App: „Sehr weit daneben. Ist es die richtige Saite?“
  • Fertig: Sind alle sechs Saiten gestimmt, zeigt die App „Alle Saiten gestimmt“ und schaltet das Mikrofon aus. Mit „Nochmal“ beginnt sie wieder bei der tiefen E Saite.
  • Bildschirm bleibt an: Während des Stimmens geht der Bildschirm nicht aus.
  • Deutsch und Englisch: Ohne eigene Wahl spricht die App die Sprache des Handys. In den Einstellungen lässt sich das ändern.
  • Hell und dunkel: Die App startet dunkel. Hell oder „Automatisch“ lässt sich in den Einstellungen wählen.

Drei Bildschirme der App nebeneinander: links ist die tiefe E Saite gestimmt und die A Saite etwas zu tief, in der Mitte sind alle sechs Saiten gestimmt, rechts die App im hellen Design

Wie die App die Töne erkennt

Ein Stimmgerät ist nur so gut wie seine Tonerkennung. Darauf habe ich deshalb den größten Teil der Arbeit verwendet.

Viele Stimmgeräte auf dem Handy messen, wie lange eine Schwingung der Saite dauert. Bei einer Stahlsaite führt das zu einem Fehler: Eine Stahlsaite ist steif, deshalb schwingen ihre Obertöne etwas höher, als sie rechnerisch sollten. Direkt nach dem Anschlag klingen viele Obertöne mit, später nur noch wenige. Die Anzeige wandert deshalb, obwohl sich die Saite nicht verändert. In einer Simulation zeigte dieses Verfahren für eine perfekt gestimmte Saite direkt nach dem Anschlag 10 Cent zu viel an, nach 0,8 Sekunden noch 1 Cent. Ein Anfänger lockert dann die Saite, und eine Sekunde später ist sie zu tief.

Guitar Tune geht in fünf Schritten vor:

  1. Suche nur im Bereich der Saite: Die App weiß, welche Saite dran ist. Sie sucht den Ton deshalb nur bis zu 7 Halbtöne darüber oder darunter. So kann sie nicht um eine Oktave danebenliegen.
  2. Obertöne einzeln messen: Die App zerlegt den Klang in seine Frequenzen und misst die ersten 8 Teiltöne einzeln. Aus ihnen rechnet sie mit der Formel für steife Saiten den Grundton zurück. Das klappt auch dann, wenn das Handymikrofon den tiefen Grundton der E Saite kaum aufnimmt.
  3. Steifigkeit lernen: In der ersten halben Sekunde ermittelt die App, wie steif die Saite ist, und hält diesen Wert danach fest. Das macht die Anzeige ruhiger.
  4. Anschlag überspringen: Beim Anschlag wird die Saite kurz stärker gedehnt und klingt dadurch höher. Die ersten 120 Millisekunden nach dem Anschlag wertet die App deshalb nicht aus. Danach fasst sie jeweils die letzten 5 Messungen zusammen.
  5. Lieber nichts anzeigen als raten: Ist der Ton zu leise oder passen die Teiltöne nicht zusammen, verwirft die App die Messung.

Die App misst rund 23 Mal pro Sekunde. Das Mikrofon nimmt mit 48 kHz auf. Rauschunterdrückung und automatische Lautstärke des Handys sind ausgeschaltet, denn beide sind für Sprache gebaut und verändern den Klang einer Saite. In automatischen Tests mit künstlich erzeugten Gitarrentönen liegen 95 von 100 Messungen höchstens 0,7 Cent daneben, auch bei lautem Hintergrund. Als gestimmt gilt eine Saite bei höchstens 5 Cent Abweichung.

Auf meinem Handy habe ich mit der App alle sechs Saiten meiner Gitarre gestimmt.

Eine fremde Bibliothek für die Tonerkennung nutzt die App nicht. Die verbreiteten Bibliotheken messen die Dauer einer Schwingung, etwa mit den Verfahren YIN oder McLeod. Damit haben sie dasselbe Problem mit den zu hohen Obertönen der Stahlsaite. In der Simulation lagen 95 von 100 Messungen mit YIN bis zu 8 Cent daneben, mit McLeod bis zu 6 Cent, mit dem Verfahren von Guitar Tune unter 1 Cent. YIN lag außerdem oft eine ganze Oktave daneben. Guitar Tune rechnet deshalb mit einem eigenen kleinen Modul in Kotlin. Das Verfahren nach McLeod nutzt die App darin nur für den ersten Schritt, die Suche im Bereich der Saite. Wer es genau wissen will: Die Recherche mit Messwerten und Quellen liegt im Projekt unter research/Recherche_Tonerkennung.md.

Berechtigungen und Datenschutz

Guitar Tune braucht genau eine Berechtigung: das Mikrofon. Beim ersten Start erklärt die App, wofür sie das Mikrofon braucht, und fragt erst danach.

Links die Erklärung zum Mikrofon beim ersten Start, rechts die Einstellungen mit Sprache, Darstellung und den Angaben zur App

  • Mikrofon nur im Vordergrund: Das Mikrofon läuft nur, solange die App offen und im Vordergrund ist. Wechselt man in eine andere App, schaltet den Bildschirm aus oder sind alle Saiten gestimmt, hört die App auf zuzuhören.
  • Der Ton wird nicht gespeichert: Die App wertet den Ton im Arbeitsspeicher aus. Sie speichert ihn nicht und verschickt ihn nicht.
  • Kein Internet: Eine Berechtigung fehlt bewusst: der Zugriff auf das Internet. Ohne ihn verhindert Android selbst jede Verbindung nach außen. Was das Mikrofon aufnimmt, kann das Handy über die App also nicht verlassen. Auch Vibration und Speicher bleiben gesperrt.
  • Mikrofonquelle sichtbar: In den Einstellungen steht, welche Mikrofonquelle die App nutzt. Bietet das Handy eine unbearbeitete Quelle an, nimmt die App diese. Sonst nutzt sie die Quelle für Spracherkennung, bei der Android die Rauschunterdrückung von vornherein ausschaltet.
  • Keine Sicherung in Googles Cloud: Die automatische Android Sicherung ist abgeschaltet. Die App speichert ohnehin nur zwei Einstellungen: Sprache und Darstellung.
  • Keine Auswertung: Die App enthält kein Tracking und keine fremden Programmteile, die Nutzungsdaten sammeln.
  • Die Links auf aaron.de und GitHub in den Einstellungen öffnen den Browser des Handys. Die App selbst lädt nichts.

Neben dem Mikrofon steht in der Installationsdatei der App (APK) noch der Eintrag DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION. Das ist keine Freigabe für die App, sondern ein interner Schutz von Android: Er sorgt dafür, dass andere Apps keine Nachrichten an die App schicken können.