2009-07-23 8 views
1

Ich arbeite an einer App, die Noten aus einer 12-Ton-Skala von spielt, die mehrere Oktaven umfasst. Dies wird im Grunde ein behelfsmäßiger Wavetable-Synthesizer sein.iPhone Music App: Wiedergabe von einem Cache von Notizen

Mal, dass mit der Anzahl der Instrumente zu verwenden.

Die Notizen werden als .wav-Dateien gespeichert und in den RAM zwischengespeichert, um einen Overhead beim Abrufen der Festplatte zu vermeiden. Allerdings gibt es einen großen Zeit-Raum-Kompromiss in Bezug auf den physikalischen Speicher, da .wav-Dateien ziemlich groß sein können.

Hat jemand eine Idee, wie man diese WAV-Dateien mehr zwischenspeichern kann mehr platzsparend? Komprimierung ist eine gute Option, aber zu viel kann die Qualität beeinträchtigen. Modulieren oder verzerren Frequenzen im laufenden Betrieb wird definitiv zu Laggy. Korrigieren Sie mich, wenn ich falsch liege, aber das Spielen von 200 BPM mit dieser Implementierung wird nicht funktionieren.

Wenn Sie Erfahrung mit Musik-Apps haben, teilen Sie uns Ihren Rat mit.

Antwort

1

Keine Erfahrung mit Musik-Apps, per se, aber ich habe Audio, einschließlich der Aufnahme verwendet.

Auf dem iPhone laden Sie aufgrund der Größenbeschränkungen und der Geschwindigkeit der Festplatte normalerweise nicht das gesamte Audio in den Arbeitsspeicher. Mit der AudioQueue-API schreiben Sie eine Callback-Funktion, die einen Puffer von der Festplatte auffüllt (normalerweise mit AudioFile-Methoden). Sie können Puffergrößen und Pufferanzahlen entsprechend auswählen, damit die Audiowiedergabe Ihrer Anwendung reibungslos funktioniert.

Sie sollten wahrscheinlich auch die Komprimierungsmöglichkeiten untersuchen; So etwas wie verlustfreie AAC sollte Ihnen eine Reduzierung der Dateigröße um 50% ohne Qualitätseinbußen ermöglichen, auf Kosten eines deutlich erhöhten Verarbeitungsaufwands.

Wirklich es klingt wie Sie versuchen, hier zu früh zu optimieren. Schreiben Sie etwas experimentellen Code, um zu sehen, ob Sie 200BPM aus dem standardmäßigen Dateilade-Stil der Audiowiedergabe-Routine herausholen können. Es könnte sein, dass das Laden von Dateien mit WAVs aufgrund der Dekodierungszeit tatsächlich schneller ist als das Komprimieren und Verwenden von RAM.

1

Sie sollten die .wav-Dateien mit der IMA4-Komprimierung in caf-Dateien (Core Audio Format) komprimieren. Das iPhone kann mehrere dieser Dateien zur gleichen Zeit spielen (MP3/AAC kann nicht, weil Sie die Hardware-Decoder benötigen) ..

Sie können mit dem folgenden Terminal-Befehl auf Mac OS X WAV zu CAF konvertieren:

$ afconvert -f caff -c 1 -d ima4 loop1.wav 

Wenn Sie diese mit AVAudioPlayer (AVFoundation) spielen, müssen Sie sich keine Gedanken über das Caching machen, da AVAudioPlayer dies bereits tut. Für komplexere Audiofunktionen müssen Sie jedoch in die Audiodienste (Audio Queue) schauen ..

+0

Das hat wirklich gut funktioniert! CAFs lassen sich schneller laden und spielen. – ayman