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.

9d2ea021919ff81e02d48530aae191bd?s=128

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. Core Audio und MIDI auf iOS Boris Bügling / @NeoNacho

    2 Dienstag, 4. Oktober 11
  3. 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
  4. Ü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
  5. Grundlagen 5 Dienstag, 4. Oktober 11

  6. 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
  7. 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
  8. Digitale Audio Verarbeitung • Interleaved: ein Buffer für beide Kanäle

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

    Player Framework • AVFoundation • OpenAL • Audio Queues • Audio Units 9 Dienstag, 4. Oktober 11
  10. • “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
  11. 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
  12. 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
  13. Audio Units • aber auch: niedrigster Level, der Entwicklern auf

    iOS zur Verfügung steht 13 Dienstag, 4. Oktober 11
  14. Audio Units 14 Dienstag, 4. Oktober 11

  15. 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
  16. 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
  17. Verfügbare Audio Units in iOS 4 • RemoteIO, GenericOutput •

    VoiceProcessingIO • MultiChannelMixer • 3DMixer • AUiPodEQ • Format Conversion 17 Dienstag, 4. Oktober 11
  18. 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
  19. 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
  20. 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
  21. Erstes Beispiel 21 Dienstag, 4. Oktober 11

  22. Samples abspielen • ExtAudioFileOpenUrl() - unterstützt WAV, AAC, MP3, etc.

    • AudioUnits: MultiChannelMixer und RemoteIO • Ein Render Callback liefert die Samples 22 Dienstag, 4. Oktober 11
  23. Demo 23 Dienstag, 4. Oktober 11

  24. Tipps 24 Dienstag, 4. Oktober 11

  25. 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
  26. 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
  27. 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
  28. Level-Meter • AVAudioPlayer hat peekPowerForChannel: • Wir nutzen einen Render

    Notifier! • Demo 28 Dienstag, 4. Oktober 11
  29. 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
  30. “Kochbuch” 30 Dienstag, 4. Oktober 11

  31. Ton-Erzeugung • Elementare Signale • Erzeugung eines einfachen Sinus-Signals •

    Demo 31 Dienstag, 4. Oktober 11
  32. Effekt-Filter • Wir können keine eigenen Audio-Units erzeugen :( •

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

    ExtAudioFileWriteAsync() • Format beachten! • AAC Konvertierung läuft in Hardware • Demo 33 Dienstag, 4. Oktober 11
  34. 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
  35. Neuerungen in iOS 5 35 Dienstag, 4. Oktober 11

  36. Neue Audio Units • Effekte: Filter, Reverb, etc. • Generatoren:

    AudioFilePlayer, ScheduledSlicePlayer • Instrumente: AUSampler 36 Dienstag, 4. Oktober 11
  37. 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
  38. Music Sequencing API • Lesen und Schreiben von MIDI Files

    • Takt • MusicTracks 38 Dienstag, 4. Oktober 11
  39. Der Synthesizer 39 Dienstag, 4. Oktober 11

  40. 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
  41. Und alle: der Synthesizer • Demo 41 Dienstag, 4. Oktober

    11
  42. 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
  43. Fragen? 43 Dienstag, 4. Oktober 11

  44. 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
  45. Macoun’11 ⌘ 45 Dienstag, 4. Oktober 11