
(Bild: Foto: chanelcoco872 via flickr.com)
Geht es Euch genauso wie mir? Als Hobby-Musiker will ich mit meinen Android-Geräten auch selbst Musik machen und habe dazu einige Apps ausprobiert, aber irgendwie sind fast alle enttäuschend und um Klassen schlechter als entsprechende iPhone- und iPad-Apps. Als Android-Entwickler habe ich mich also hingesetzt und versucht, eine (Kirchenorgel-)App zu schreiben, die besser ist. Was folgt, sind die Erfahrungen, die ich dabei gemacht habe – aus Entwicklersicht. Wer also wissen will, womit sich ein Android-Entwickler für eine 3 Euro-App herumschlägt oder verstehen will warum eigentlich höhere Preise für Apps gerechtfertigt wären oder auch nur, warum Musik-Apps auf iPhone und iPad besser sind, der lese weiter.
Der Klang
Wer schonmal verschiedene Klavier-Apps ausprobiert hat, weiß bestimmt, wie schlecht die meisten klingen. In Android ist ein Sonivox Midi-Tongenerator enthalten. Er wird zum Beispiel vom MediaPlayer benutzt, um Midi-Dateien abzuspielen. Es sollte also ein Leichtes sein, eine Musik-App zu schreiben, oder? Erstes Problem: Android enthält keine offizielle Schnittstelle, um dynamische Midi-Daten abzuspielen. Man kann Android nur fertige Midi-Dateien übergeben. Eigentlich taugt das also nicht, um damit Musik zu machen. Manche Apps benutzen aber unsaubere Umwege und Hacks und gehen trotzdem diesen Weg. Damit kommt man zum zweiten Problem: es klingt auf vielen Geräten nicht gut. Wer es sich anhören will, kann xPiano und Musical Lite ausprobieren. Soweit ich es ohne Analyse der Apps sagen kann, verwenden sie diesen Weg. Das ist wohl auch der Grund, warum sie gleich klingen.
Viele Apps verwenden auch einen „SoundPool“ oder „AudioTrack“ im „static mode“. Im Prinzip bedeutet das, dass jeder Klang fest hinterlegt wird und die App dann nur das Abspielen auslöst. Manche Apps beenden den Klang dann aber nicht mehr wenn man die Taste loslässt (z.B. „My Piano“) und es ist praktisch unmöglich, einen „Loslassklang“ zum richtigen Zeitpunkt abzuspielen. Schließlich hören Klavierseiten beim Loslassen der Tasten nicht sofort auf zu schwingen, sondern werden in kurzer Zeit abgedämpft. Wenn man etwas genauer hinhört, kann man das hören.
Wie geht’s besser? Die einfachste Möglichkeit, die ich gefunden habe, ist FluidSynth. Etwas vereinfacht gesagt, ist das eine Soundblaster-Soundkarte in Software. Damit lassen sich SoundFont-Klangdateien nutzen und von diesen SoundFont-Dateien gibt es eine ganze Menge im Netz für die unterschiedlichsten Klänge - durchaus auch einige mit ordentlichem Klang. Allerdings ist es nicht ganz trivial FluidSynth auf Android zum Laufen zu bringen – nichts für Programmieranfänger. Dazu kommt, dass Android den Speicherplatz begrenzt, der einer App zur Verfügung steht. Das konkrete Limit hängt vom Gerät ab, liegt aber derzeit in der Regel zwischen 16 und 48MB. Manche der besten SoundFont-Dateien sind so groß, dass dieser Platz nicht ausreicht um die Datei zu laden. Immerhin, wenn man diese Größenbeschränkung einhält, geht’s.
Natürlich bleibt auch noch die Möglichkeit selbst Audiosamples zu verwalten, zu mischen etc. Auch das führt richtig gemacht zu einem sehr guten Klang. Ist aber ebenfalls „nicht ganz trivial“.
Fazit zum Klang: Musik-Apps müssen unter Android nicht schlecht klingen, es ist „nur“ eine Frage des Aufwands. Umso ärgerlicher ist der Klang vieler Apps.
Die Klaviatur
Reden wir nicht um den heißen Brei herum: Klaviaturen auf dem Bildschirm sind ein miserabler Kompromiss: zu klein, ohne gutes haptisches Feedback, auf den meisten Geräten ohne Anschlagsdynamik und damit ohne die Möglichkeit Töne lauter oder leiser zu spielen. Und mehrere Tasten gleichzeitig zu drücken funktioniert auch nur „fast immer“.
Multitouch
Starten wir mit letzterem: Damit man mehrere Tasten gleichzeitig drücken kann, muss das Gerät „Multitouch“ beherrschen. Die meisten einigermaßen aktuellen Geräte können das – mehr oder weniger. Die Herausforderung fängt bei der Hardware an. Viele Handys erkennen z.B. nur maximal 2 Finger, manche Tablets schaffen 5, manche 10. Sind die Finger zu nahe beieinander, werden sie oft nur als einer erkannt. Manche Geräte erkennen technisch bedingt die x- und y-Koordinaten der Finger unabhängig voneinander, was dazu führt, dass die Koordinaten manchmal falsch zugeordnet werden. Sehr schön zeigt das das Video http://www.youtube.com/watch?v=Ds5qZ_3XRzI . Und schließlich leitet Android die Berührungen auch nicht an das jeweilige Oberflächenelement - sprich die gedrückte Klaviertaste - weiter, sondern immer an das vom ersten Finger berührte. In neueren Versionen kann man das als Entwickler anders vorgeben, aber aus Gründen der Rückwärtskompatibiltät muss man trotzdem damit klar kommen die Berührungen selbst den Tasten zuordnen. Das alles hört sich recht harmlos an, oder? In der Praxis ist es aber na ja, sagen wir „anspruchsvoll“, unter anderem aufgrund der Art und Weise wie Android die Berührungsereignisse modelliert und weiterleitet.
Fazit zu Multitouch: Multitouch kann man ganz gut in den Griff bekommen. Das ist aber ebenfalls nichts für Programmieranfänger.
Midi-Schnittstelle
Hat man Multitouch im Griff, bleiben immer noch die anderen Tastaturprobleme: für unterwegs mag eine Bildschirmklaviatur noch ok sein, um damit „richtig“ zu spielen ist sie es definitiv nicht. Kurzum, früher oder später will man ein Keyboard anschließen. Für diesen Zweck gibt es einen Standard: Midi. Über Midi kann ein Gerät einem anderen mitteilen, dass und welchen Ton es spielen soll. Dabei werden keine Klänge übertragen, sondern Kommandos, einen bestimmten Ton ein- oder auszuschalten. Soweit, so gut. Wo liegt diesmal das Problem? Na ja, Android-Geräte haben keine Midi-Buchse.
Manche Apps umgehen das, indem sie die Midi-Signale über Funk, also z.B. über Wlan oder Bluetooth empfangen. Dazu muss man das Keyboard aber erstmal mit einem Computer verbinden, der das Signal dann über Wlan weiterleitet. Eigentlich kann dann aber auch gleich dieser Computer die Klangerzeugung übernehmen. Ironischerweise würde damit sogar das Setup etwas mobiler. Dazu kommt, dass so eine Funkübertragung meist zu lange dauert. Die Zeit, die vom Drücken der Taste am Keyboard bis zum Empfang des Midi-Signals vergeht (d.h. die Latenz über die Funkschnittstelle), ist auf diesem Weg zu hoch. Beim Musikmachen gibt es eine Art Feedback-Schleife, d.h. man reagiert auch auf das, was man hört. Wenn dabei die Latenz zu hoch ist, führt das unweigerlich zu schlechtem Timing und Fehlern.
Wer sich mit Midi etwas auskennt, kommt vielleicht auch auf die Idee, dass Midi-Signale ja oft über USB übertragen werden und Android-Geräte haben doch einen USB-Anschluss, oder? Keine schlechte Idee. Allerdings haben die meisten Geräte nur einen USB-Device-Anschluss. Um ein USB/Midi-Interface anschließen zu können, braucht man aber USB-Host. Eine Ausnahme sind manche Tablets; z.B. hat das Acer A500 auch einen USB-Host-Anschluss eingebaut. Für manche andere Tablets gibt es passende Docking-Stations oder wie beim Transformer anschließbare Tastaturen mit USB-Host. Und siehe da, damit kann es funktionieren – wenn diese Geräte mindestens Android 3.1 verwenden. Mit Android 3.1 ist es möglich geworden, aus einer App heraus auf USB-Geräte zuzugreifen. Damit lassen sich auch USB/Midi-Interfaces ansprechen, obwohl Android selbst keinen passenden Treiber für solche Geräte hat.
Fazit zu Keyboards: Auf Geräten mit Android 3.1 und USB-Host-Unterstützung kann man Apps entwickeln, an die man ein Keyboard (oder ein anderes Midi-Device) anschließen kann. Alle anderen Android-Geräte müssen erstmal außen vor bleiben.
Audio-Latenz
Damit haben wir alles beisammen, um vom Anschlag einer Taste am Keyboard bis zur Erzeugung der Klangdaten zu kommen. Wer jetzt aber denkt, ich hätte kein weiteres Problem mehr in der Hinterhand, hat den Artikel wohl nicht bis hierher gelesen. Das Problem: Die Audio-Latenz ist auf praktisch allen Android-Geräten zu hoch. Konkret: vom Zeitpunkt an dem die App die Klangdaten an Android übergibt bis zum Zeitpunkt, an dem man einen Ton hört vergehen typischerweise mindestens 120 Millisekunden, auf vielen Geräten auch bis zu 200 Millisekunden. Für einen MediaPlayer ist das kein Problem, fürs Musizieren schon. Das Problem ist mindestens seit Ende Juli 2009 bekannt (siehe http://code.google.com/p/android/issues/detail?id=3434), für Google gibt es aber offenbar wichtigeres als Musik-Apps. Jedenfalls hat Google es nicht gelöst, obwohl das prinzipiell möglich scheint: Ein gewisser Arun Raghavan hat entsprechende Versuche mit einem Galaxy Nexus und Android 4.0 gemacht und konnte die Latenz von 176 Millisekunden auf ca. 20 Millisekunden reduzieren (siehe http://arunraghavan.net/2012/01/pulseaudio-vs-audioflinger-fight/). Wer von Euch in diesem Punkt anderer Meinung ist als Google, darf sich hiermit aufgefordert fühlen auf http://code.google.com/p/android/issues/detail?id=3434 für die Lösung dieses Problems zu stimmen.
Fazit zur Audio-Latenz: Wirklich gelöst werden kann das Problem der Audio-Latenz nur von Google und den Herstellern der Android-Geräte. Damit ist das wohl der größte Show Stopper für Musik-Apps auf Android und der wesentliche Grund, warum Apple in diesem Bereich die Oberhand hat.
Summa Summarum
Es ist eine ordentliche Herausforderung eine gute Musik-App für Android zu schreiben. Es lassen sich aber alle Probleme lösen. Alle? Wirklich alle? Wie war das mit der Audio-Latenz?
Auch das Problem lässt sich mit genügend Aufwand Massenmarkt-tauglich lösen: Man könnte eine Art „Android-Soundkarte“ entwickeln, die an den USB-Device-Anschluss angesteckt wird und die Klangdaten an einem Audio-Ausgang ausgibt. Wenn man dazu auch noch Midi-Anschlüsse einbaut, würde sich auch die Einschränkung bzgl. Android 3.1 und USB-Host erledigen. Ich selbst habe ein gewisses Verständnis von Hardware und könnte so ein Gerät wohl für den Privatgebrauch bauen (tatsächlich habe ich sogar eine recht konkrete Vorstellung davon wie ich das tun werde), nicht aber für den „Massenmarkt“.
Hm, ich werde für mich wohl alle Probleme lösen, aber für Euch tut es mir Leid: Ihr müsst mit dem Latenz-Problem leben. Oder hat jemand die Fähigkeiten und die Lust so eine „Android-Soundkarte“ mit mir zu entwickeln?

T.M.
Also da ich offen für beide Systeme (Android/Apple) bin und sie beide nutze, besteht für mich dieses Problem nicht... Ich kann nur jedem empfehlen offener zu sein!