Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

Core Audio und MIDI auf iOS Boris Bügling / @NeoNacho 2 Dienstag, 4. Oktober 11

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Ü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

Slide 5

Slide 5 text

Grundlagen 5 Dienstag, 4. Oktober 11

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Digitale Audio Verarbeitung • Interleaved: ein Buffer für beide Kanäle • Non-Interleaved: ein Buffer pro Kanal 8 Dienstag, 4. Oktober 11

Slide 9

Slide 9 text

Audio in iOS • HTML 5 Tag • Media Player Framework • AVFoundation • OpenAL • Audio Queues • Audio Units 9 Dienstag, 4. Oktober 11

Slide 10

Slide 10 text

• “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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Audio Units • aber auch: niedrigster Level, der Entwicklern auf iOS zur Verfügung steht 13 Dienstag, 4. Oktober 11

Slide 14

Slide 14 text

Audio Units 14 Dienstag, 4. Oktober 11

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

Verfügbare Audio Units in iOS 4 • RemoteIO, GenericOutput • VoiceProcessingIO • MultiChannelMixer • 3DMixer • AUiPodEQ • Format Conversion 17 Dienstag, 4. Oktober 11

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Erstes Beispiel 21 Dienstag, 4. Oktober 11

Slide 22

Slide 22 text

Samples abspielen • ExtAudioFileOpenUrl() - unterstützt WAV, AAC, MP3, etc. • AudioUnits: MultiChannelMixer und RemoteIO • Ein Render Callback liefert die Samples 22 Dienstag, 4. Oktober 11

Slide 23

Slide 23 text

Demo 23 Dienstag, 4. Oktober 11

Slide 24

Slide 24 text

Tipps 24 Dienstag, 4. Oktober 11

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Level-Meter • AVAudioPlayer hat peekPowerForChannel: • Wir nutzen einen Render Notifier! • Demo 28 Dienstag, 4. Oktober 11

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

“Kochbuch” 30 Dienstag, 4. Oktober 11

Slide 31

Slide 31 text

Ton-Erzeugung • Elementare Signale • Erzeugung eines einfachen Sinus-Signals • Demo 31 Dienstag, 4. Oktober 11

Slide 32

Slide 32 text

Effekt-Filter • Wir können keine eigenen Audio-Units erzeugen :( • Lösung: ausgeschalteter iPodEQ mit Render Callback • Demo 32 Dienstag, 4. Oktober 11

Slide 33

Slide 33 text

Recording in eine Datei • AudioUnitRenderNotify() auf dem Mixer • ExtAudioFileWriteAsync() • Format beachten! • AAC Konvertierung läuft in Hardware • Demo 33 Dienstag, 4. Oktober 11

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

Neuerungen in iOS 5 35 Dienstag, 4. Oktober 11

Slide 36

Slide 36 text

Neue Audio Units • Effekte: Filter, Reverb, etc. • Generatoren: AudioFilePlayer, ScheduledSlicePlayer • Instrumente: AUSampler 36 Dienstag, 4. Oktober 11

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

Music Sequencing API • Lesen und Schreiben von MIDI Files • Takt • MusicTracks 38 Dienstag, 4. Oktober 11

Slide 39

Slide 39 text

Der Synthesizer 39 Dienstag, 4. Oktober 11

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

Und alle: der Synthesizer • Demo 41 Dienstag, 4. Oktober 11

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

Fragen? 43 Dienstag, 4. Oktober 11

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

Macoun’11 ⌘ 45 Dienstag, 4. Oktober 11