Post on 01-Jul-2015
description
transcript
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⌘
1Dienstag, 4. Oktober 11
Core Audio und MIDI auf iOSBoris Bügling / @NeoNacho
2Dienstag, 4. Oktober 11
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
3Dienstag, 4. Oktober 11
Ü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
4Dienstag, 4. Oktober 11
Grundlagen
5Dienstag, 4. Oktober 11
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
6Dienstag, 4. Oktober 11
Digitale Audio Verarbeitung
• Sample: Messwert einer Waveform
• Frame: Menge an Samples für jeden Kanal
• Packet: kleinste zusammenhängende Datenmenge des Formats
7Dienstag, 4. Oktober 11
Digitale Audio Verarbeitung
• Interleaved: ein Buffer für beide Kanäle
• Non-Interleaved: ein Buffer pro Kanal
8Dienstag, 4. Oktober 11
Audio in iOS
• HTML 5 <audio> Tag
• Media Player Framework
• AVFoundation
• OpenAL
• Audio Queues
• Audio Units
9Dienstag, 4. Oktober 11
• “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
10Dienstag, 4. Oktober 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”
11Dienstag, 4. Oktober 11
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)
12Dienstag, 4. Oktober 11
Audio Units
• aber auch: niedrigster Level, der Entwicklern auf iOS zur Verfügung steht
13Dienstag, 4. Oktober 11
Audio Units
14Dienstag, 4. Oktober 11
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
15Dienstag, 4. Oktober 11
AudioUnit
• AudioComponentDescription - Manufacturer, Type, SubType
• AudioStreamBasicDescription (ASBD) regelt das Format
• Konfiguration via AudioUnitSetProperty
• Dadurch ist die API Doku relativ nutzlos
16Dienstag, 4. Oktober 11
Verfügbare Audio Units in iOS 4
• RemoteIO, GenericOutput
• VoiceProcessingIO
• MultiChannelMixer
• 3DMixer
• AUiPodEQ
• Format Conversion
17Dienstag, 4. Oktober 11
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
18Dienstag, 4. Oktober 11
AUGraph
• Drei Phasen: Open, Init, Running
• Änderungen der Sample-Rate nur mittels Neuaufbau und -start
• Bei Änderungen Neustart, sonst kommt es zu Crashes
19Dienstag, 4. Oktober 11
OSStatus callback (void* inRefCon,! ! ! AudioUnitRenderActionFlags* ioActionFlags,! ! ! const AudioTimeStamp* inTimeStamp,! ! ! UInt32 inBusNumber,! ! ! UInt32 inNumberFrames,! ! ! AudioBufferList* ioData);
AURenderCallback
• Hier findet die interessante Arbeit statt!
20Dienstag, 4. Oktober 11
Erstes Beispiel
21Dienstag, 4. Oktober 11
Samples abspielen
• ExtAudioFileOpenUrl() - unterstützt WAV, AAC, MP3, etc.
• AudioUnits: MultiChannelMixer und RemoteIO
• Ein Render Callback liefert die Samples
22Dienstag, 4. Oktober 11
Demo
23Dienstag, 4. Oktober 11
Tipps
24Dienstag, 4. Oktober 11
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;
25Dienstag, 4. Oktober 11
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
26Dienstag, 4. Oktober 11
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
27Dienstag, 4. Oktober 11
Level-Meter
• AVAudioPlayer hat peekPowerForChannel:
• Wir nutzen einen Render Notifier!
• Demo
28Dienstag, 4. Oktober 11
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));
29Dienstag, 4. Oktober 11
“Kochbuch”
30Dienstag, 4. Oktober 11
Ton-Erzeugung
• Elementare Signale
• Erzeugung eines einfachen Sinus-Signals
• Demo
31Dienstag, 4. Oktober 11
Effekt-Filter
• Wir können keine eigenen Audio-Units erzeugen :(
• Lösung: ausgeschalteter iPodEQ mit Render Callback
• Demo
32Dienstag, 4. Oktober 11
Recording in eine Datei
• AudioUnitRenderNotify() auf dem Mixer
• ExtAudioFileWriteAsync()
• Format beachten!
• AAC Konvertierung läuft in Hardware
• Demo
33Dienstag, 4. Oktober 11
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
34Dienstag, 4. Oktober 11
Neuerungen in iOS 5
35Dienstag, 4. Oktober 11
Neue Audio Units
• Effekte: Filter, Reverb, etc.
• Generatoren: AudioFilePlayer, ScheduledSlicePlayer
• Instrumente: AUSampler
36Dienstag, 4. Oktober 11
AUSampler
• Neu in iOS 5 und Mac OS X Lion
• Vereinfacht unser Beispiel deutlich
• Native Unterstützung für SoundFonts
37Dienstag, 4. Oktober 11
Music Sequencing API
• Lesen und Schreiben von MIDI Files
• Takt
• MusicTracks
38Dienstag, 4. Oktober 11
Der Synthesizer
39Dienstag, 4. Oktober 11
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
40Dienstag, 4. Oktober 11
Und alle: der Synthesizer
• Demo
41Dienstag, 4. Oktober 11
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
42Dienstag, 4. Oktober 11
Fragen?
43Dienstag, 4. Oktober 11
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
44Dienstag, 4. Oktober 11
Macoun’11⌘
45Dienstag, 4. Oktober 11