Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Core Audio und MIDI auf iOS

Core Audio und MIDI auf iOS

Für viele ist der Einstieg in komplexere Audio-Verarbeitung auf den iOS Geräten steinig: Prozedurales C und Pointer-Arithmetik sind wir nicht (mehr) gewöhnt. Ziel dieses Vortrags ist es daher Grundkonzepte und Tipps anhand eines einfachen Synthesizers mit MIDI-Eingabe zu erarbeiten.

Boris Bügling

October 02, 2011
Tweet

More Decks by Boris Bügling

Other Decks in Technology

Transcript

  1. 1. Beispieldateinen auf dem Schreibtisch anordnen. 2. Alle Programme die

    man für Demos benötigt starten. Bpsw: Xcode, IB, Terminal. 3. Screenrecorder starten. 4. Präsentation starten und auf Zeichen oder Signal warten. Macoun’11 ⌘ 1 Dienstag, 4. Oktober 11
  2. Motivation • Unterwegs musizieren ist toll • Apple sieht das

    genau so: • iOS 2.0 - Core Audio • iOS 4.2 - Core MIDI • iOS 5.0 - Neue APIs in Core Audio 3 Dienstag, 4. Oktober 11
  3. Überblick • Grundlagen, Einführung in Audio Units und Tipps •

    Abspielen von Samples • “Kochbuch” und Einlesen von MIDI Input • Neuerungen in iOS 5 • Endergebnis: ein einfacher Synthesizer 4 Dienstag, 4. Oktober 11
  4. Digitale Audio Verarbeitung • Digitales Signal: Messung zu diskreten Zeitpunkten

    • PCM (Pulse Code Modulation) • Sample == Amplitude des Signals zu einem bestimmten Zeitpunkt • Sample-Rate doppelt so groß wie Frequenzbereich 6 Dienstag, 4. Oktober 11
  5. Digitale Audio Verarbeitung • Sample: Messwert einer Waveform • Frame:

    Menge an Samples für jeden Kanal • Packet: kleinste zusammenhängende Datenmenge des Formats 7 Dienstag, 4. Oktober 11
  6. Digitale Audio Verarbeitung • Interleaved: ein Buffer für beide Kanäle

    • Non-Interleaved: ein Buffer pro Kanal 8 Dienstag, 4. Oktober 11
  7. Audio in iOS • HTML 5 <audio> Tag • Media

    Player Framework • AVFoundation • OpenAL • Audio Queues • Audio Units 9 Dienstag, 4. Oktober 11
  8. • “Easy” and “CoreAudio” can’t be used in the same

    sentence. CoreAudio is very powerful, very complex and under-documented. -- Jens Alfke auf der coreaudio-api Mailling-Liste 10 Dienstag, 4. Oktober 11
  9. AVAudioSession • Kategorisiert Apps und regelt den Hardware Zugriff •

    Verhalten bzgl. Background Audio • Verarbeitung von Unterbrechungen • Reaktion auf Änderungen im Routing • Für den Vortrag: Kategorie “Playback” 11 Dienstag, 4. Oktober 11
  10. Audio Units • Echtzeit, Mixing, Audio-Synthese, Streaming • Größter Sprung

    in iOS 5 • Reines C • Callback-lastig, Property-basiert • Error codes (FourCC oder negative Integers) 12 Dienstag, 4. Oktober 11
  11. Audio Units • aber auch: niedrigster Level, der Entwicklern auf

    iOS zur Verfügung steht 13 Dienstag, 4. Oktober 11
  12. AudioUnit • Audio-Processing Plug-Ins • iOS: Keine eigenen Units (im

    Gegensatz zum Mac) • Mehrere Ein- und Ausgabe-Busse sind möglich • Verbindungen regeln den Datenfluss 15 Dienstag, 4. Oktober 11
  13. AudioUnit • AudioComponentDescription - Manufacturer, Type, SubType • AudioStreamBasicDescription (ASBD)

    regelt das Format • Konfiguration via AudioUnitSetProperty • Dadurch ist die API Doku relativ nutzlos 16 Dienstag, 4. Oktober 11
  14. Verfügbare Audio Units in iOS 4 • RemoteIO, GenericOutput •

    VoiceProcessingIO • MultiChannelMixer • 3DMixer • AUiPodEQ • Format Conversion 17 Dienstag, 4. Oktober 11
  15. AUGraph • Organisiert die Verbindungen zwischen den Units (AUNode) •

    Hat genau einen Output Knoten • Arbeitet nach dem Pull-Prinzip • Mittels GenericOutput und Render Callbacks sind Subgraphen möglich 18 Dienstag, 4. Oktober 11
  16. AUGraph • Drei Phasen: Open, Init, Running • Änderungen der

    Sample-Rate nur mittels Neuaufbau und -start • Bei Änderungen Neustart, sonst kommt es zu Crashes 19 Dienstag, 4. Oktober 11
  17. OSStatus callback (void* inRefCon, ! ! ! AudioUnitRenderActionFlags* ioActionFlags, !

    ! ! const AudioTimeStamp* inTimeStamp, ! ! ! UInt32 inBusNumber, ! ! ! UInt32 inNumberFrames, ! ! ! AudioBufferList* ioData); AURenderCallback • Hier findet die interessante Arbeit statt! 20 Dienstag, 4. Oktober 11
  18. Samples abspielen • ExtAudioFileOpenUrl() - unterstützt WAV, AAC, MP3, etc.

    • AudioUnits: MultiChannelMixer und RemoteIO • Ein Render Callback liefert die Samples 22 Dienstag, 4. Oktober 11
  19. Vom AudioTimeStamp zu Nanosekunden • AudioTimeStamp ist in “Host Time”

    • Umrechung: mach_timebase_info_data_t tinfo; mach_timebase_info(&tinfo); double hTime2nsFactor = (double)tinfo.numer / tinfo.denom; double nanoseconds = inTimeStamp->mHostTime * hTime2nsFactor; 25 Dienstag, 4. Oktober 11
  20. Behandlung von OSStatus • Jede Funktion gibt einen OSStatus zurück

    • Dieser muss jedes Mal gecheckt werden! • Kann FourCC oder Integer Fehlercode sein • Makro oder Helper-Funktion einsetzen • Übersichtlicherer Code 26 Dienstag, 4. Oktober 11
  21. Connections vs. AURenderCallback • Pull-Prinzip aus _einer_ Quelle • Daher

    entweder Connections _oder_ Callbacks • Sonst Error -50 oder Callbacks werden nicht aufgerufen • CAShow() hilft beim Debuggen 27 Dienstag, 4. Oktober 11
  22. Tipps • Kein malloc() oder NSLog() im Render Callback (~85

    Aufrufe pro Sekunde!) • Aber: Zugriff auf Objective-C Objekte via Properties meist OK • Bei der Arbeit mit ASBD: • Umrechnung von Float nach 32bit Signed Int: Multiplikation mit 16777216L memset(&asbd, 0, sizeof(asbd)); 29 Dienstag, 4. Oktober 11
  23. Effekt-Filter • Wir können keine eigenen Audio-Units erzeugen :( •

    Lösung: ausgeschalteter iPodEQ mit Render Callback • Demo 32 Dienstag, 4. Oktober 11
  24. Recording in eine Datei • AudioUnitRenderNotify() auf dem Mixer •

    ExtAudioFileWriteAsync() • Format beachten! • AAC Konvertierung läuft in Hardware • Demo 33 Dienstag, 4. Oktober 11
  25. Exkurs: SoundFonts • Samples und Einstellungen für Instrumente in MIDI-Software

    • Freie SoundFonts im Netz, aber kein nativer Support auf iOS • Die freie Fluidsynth Library steht unter LGPL • Daher: SoundFonts auf dem Mac zu CAF-Dateien verarbeiten • Demo 34 Dienstag, 4. Oktober 11
  26. Neue Audio Units • Effekte: Filter, Reverb, etc. • Generatoren:

    AudioFilePlayer, ScheduledSlicePlayer • Instrumente: AUSampler 36 Dienstag, 4. Oktober 11
  27. AUSampler • Neu in iOS 5 und Mac OS X

    Lion • Vereinfacht unser Beispiel deutlich • Native Unterstützung für SoundFonts 37 Dienstag, 4. Oktober 11
  28. Music Sequencing API • Lesen und Schreiben von MIDI Files

    • Takt • MusicTracks 38 Dienstag, 4. Oktober 11
  29. Core MIDI • Verfügbar seit iOS 4.2 • MIDI zu

    USB zu Camera Connection Kit zu iPad • C-basiert, wir können unser Wissen von den Audio Units mitnehmen • Demo 40 Dienstag, 4. Oktober 11
  30. Exkurs: NNAudio • Objective-C Wrapper um einen Teil der Audio

    Units • Abstrahiert ewig gleiche Setup Blöcke • Bündelt AudioUnit und AUNode in einer Klasse • Work-In-Progress • Demo • Auf GitHub: https://github.com/neonichu/Core-Audio-Samples 42 Dienstag, 4. Oktober 11
  31. Literatur • Folien und Beispielcode: http://vu0.org/audio • Audio Unit Hosting

    Guide von Apple • Core Audio von Chris Adamson und Kevin Avila (Anfang 2012) • Fundamentals of Digital Audio, WWDC 2010 • Audio Development for iPhone OS, WWDC 2010 • Music in iOS and Lion, WWDC 2011 44 Dienstag, 4. Oktober 11