2009-06-16 31 views
10

Ich möchte eine App erstellen, die ein physisches Instrument emuliert. Ich habe Audio-Samples, aber ich möchte die Tonhöhe/Frequenz dynamisch erhöhen können, damit ich nicht von zu vielen Dateien laden muss.Audio auf dem iPhone

Jede Idee, welche Audio-API wird dies tun können? Ich rechne entweder mit OpenAL oder Audio Queue Services, bin mir aber nicht sicher, was geeignet ist. Alle Links zu Guides/Beispielcode werden ebenfalls sehr geschätzt.

Vielen Dank im Voraus.

Antwort

19

Ich ging diesen Weg im Jahr 2009 und versuchte Audio Toolkit, Audio Queue Services, openAL und schließlich auf der RemoteIO AudioUnit.

Die Audio Toolbox eignet sich für grundlegende ausgelöste Soundeffekte, konnte jedoch Frequenzen oder Loop-Samples nicht ändern.

Audio Queue Services können Samples loopen, aber die einzige Möglichkeit, die Wiedergabefrequenz eines Samples anzupassen, war das erneute Lesen der Daten aus der Datei - sehr schmerzhaft. Außerdem ist das Framework enorm umständlich - ich würde es nur verwenden, wenn ich versuche, etwas aus dem Internet zu streamen.

OpenAL war ein Glücksfall - war in weniger als einer Stunde in Betrieb, nachdem ich die iPhone-Beispiel-App "CrashLanding" von Apple bekommen hatte, die es nicht mehr gibt. Ich fand, dass OpenAL ideal für Spiele oder sogar ein Musikinstrument geeignet ist - Samples konnten vorab geladen werden, die Frequenzanpassung war einfach, und Looping war kein Problem. Der Deal-Breaker für mich war, dass das Starten und Stoppen eines geloopten Samples fast jedes Mal zu einem unangenehmen "Pop" führen würde. Auch der eingebaute 3D-Audio-Mixer war für meinen Geschmack etwas zu CPU-intensiv.

Wenn Ihr Instrument keine geloopten Samples verwendet, würde ich vorschlagen, zuerst die OpenAL-Route zu versuchen - die Lernkurve ist viel weniger einschüchternd. Versuchen Sie, die Spur zu kommen „SoundEngine.h“, „CrashLanding“ oder „TouchFighter“, oder lesen Sie den folgenden Link:

http://benbritten.com/blog/2008/11/06/openal-sound-on-the-iphone/

Da geloopten Samples wurde für mich eine Voraussetzung, ich schließlich auf Audio Units angesiedelt (die , auf dem iPhone, wird als "RemoteIO" bezeichnet, wenn Sie Eingaben oder Ausgaben machen möchten. Es war extrem schwierig zu implementieren - sehr ähnlich wie bei Audio Queue Services, da der Kern der Implementierung in einem "Puffer-Callback" liegt, der mehrmals pro Sekunde aufgerufen wird, um einen Puffer für ausgehende Audiodaten mit Roh-SInt16-Werten zu füllen.

Letztendlich habe ich mein Instrument wunderbar mit Mehrnoten-Polyphonie, geloopten Samples, ohne Popping und minimaler Latenz arbeiten lassen.

Leider ist RemoteIO nicht gut dokumentiert.Michael Tyson war einer der ersten, im Bereich über RemoteIO ausführlich zu schreiben, und seine Beiträge (und Kommentare) waren sehr nützlich für mich:

http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/

Viel Glück!

Bearbeitet Jahre später: Ich habe den RemoteIO/AudioUnits-Code, auf den ich oben Bezug genommen habe: https://github.com/glenn-barnett/hexaphone/blob/master/Classes/Instrument.m - Entschuldigung für das Chaos, ich hoffe, etwas Zeit zu bekommen, um den Code und Kommentare aufzuräumen.

+0

Danke für den Tipp. Ich probiere OpenAL mit dem oalTouch-Beispielcode aus, aber ich kann die Einstellung nicht finden, um Tonhöhe oder Frequenz im laufenden Betrieb zu ändern. Jeder Tipp in die richtige Richtung wird sehr geschätzt! – Matthew

+0

Vergesst nicht. Ich habe herausgefunden, wie man die Tonhöhe einstellt. Der Beispielcode für oalTouch verwaltet nur eine Sounddatei, also muss ich mir SoundManager unbedingt anschauen. – Matthew

+0

Der SoundEngine-Code funktioniert sehr gut auf iPhone OS 2.21 SDK, aber nicht auf 3.0 des SDK kompilieren. Irgendeine Idee, wenn es eine neue Version gibt? – Matthew

0

Es klingt, ein bisschen, als ob Sie im Wesentlichen die Wavetable-Synthese-Methode zum Abspielen von MIDI-Dateien erstellen. Sie können möglicherweise einen MIDI-Synthesizer für das iPhone finden, den Sie verwenden können, und dann Ihre Audio-Samples verwenden, um einen Wavetable-Satz zu erstellen. Immer wenn Sie Töne spielen möchten, senden Sie einfach das MIDI-Ereignis in den iPhone-MIDI-Synthesizer mit Ihrem geladenen Wavetable-Set.

+0

Um irritierend technisch (ich bin ein Synth Nerd), klingt es eher wie ein einfaches gesampeltes Instrument als Wavetable-Synthese. Ich habe beides gemacht. http://en.wikipedia.org/wiki/Wavetable_synthesis – Nosredna

+0

Ich bin kein Synth Nerd, und ich habe sehr wenig Erfahrung mit Sound-Programmierung; Ich habe die Antwort einfach geschrieben, weil ich dachte, ich hätte eine Ähnlichkeit mit meinem allgemeinen Computerwissen gesehen, und zu der Zeit, als ich meine schrieb, gab es keine Antworten, also dachte ich, ich würde meine zwei Cent reinstecken. Ich bin froh, Leute mit weit mehr Erfahrung in diesem Bereich als ich bessere Antworten posten :) –

+0

Ich habe dich nicht abstimmen oder irgendetwas, nur eifrig darauf hinweisen, wie cool Wavetable-Synthesizer sind. :-) – Nosredna

1

Versuchen Sie, eine Audio Unit zu erstellen. Ich mache etwas ähnliches, ein AU hat gut für mich funktioniert. Zunächst verwendete ich eine Audio-Warteschlange, wie es einfacher war (höhere Ebene?) Und synchron, aber es mangelte an Reaktionsfähigkeit, so dass ich es für der Audio-Einheit ausgegeben.