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

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




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



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



Dienstag, 4. Oktober 11                                                         4
Grundlagen



Dienstag, 4. Oktober 11                5
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



Dienstag, 4. Oktober 11                                                             6
Digitale Audio Verarbeitung


                          •   Sample: Messwert einer Waveform

                          •   Frame: Menge an Samples für jeden Kanal

                          •   Packet: kleinste zusammenhängende Datenmenge des Formats




Dienstag, 4. Oktober 11                                                                  7
Digitale Audio Verarbeitung


                          •   Interleaved: ein Buffer für beide Kanäle

                          •   Non-Interleaved: ein Buffer pro Kanal




Dienstag, 4. Oktober 11                                                  8
Audio in iOS

                          •   HTML 5 <audio> Tag

                          •   Media Player Framework

                          •   AVFoundation

                          •   OpenAL

                          •   Audio Queues

                          •   Audio Units


Dienstag, 4. Oktober 11                                     9
•   “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




Dienstag, 4. Oktober 11                                                                           10
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”



Dienstag, 4. Oktober 11                                                            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)



Dienstag, 4. Oktober 11                                                     12
Audio Units



                          •   aber auch: niedrigster Level, der Entwicklern auf iOS zur
                              Verfügung steht




Dienstag, 4. Oktober 11                                                                   13
Audio Units




Dienstag, 4. Oktober 11                 14
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



Dienstag, 4. Oktober 11                                                         15
AudioUnit


                          •   AudioComponentDescription - Manufacturer, Type, SubType

                          •   AudioStreamBasicDescription (ASBD) regelt das Format

                          •   Konfiguration via AudioUnitSetProperty

                          •   Dadurch ist die API Doku relativ nutzlos



Dienstag, 4. Oktober 11                                                                 16
Verfügbare Audio Units in iOS 4
                          •   RemoteIO, GenericOutput

                          •   VoiceProcessingIO

                          •   MultiChannelMixer

                          •   3DMixer

                          •   AUiPodEQ

                          •   Format Conversion



Dienstag, 4. Oktober 11                                     17
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



Dienstag, 4. Oktober 11                                                                    18
AUGraph


                          •   Drei Phasen: Open, Init, Running

                          •   Änderungen der Sample-Rate nur mittels Neuaufbau und -start

                          •   Bei Änderungen Neustart, sonst kommt es zu Crashes




Dienstag, 4. Oktober 11                                                                     19
AURenderCallback
                                  OSStatus   callback (void* inRefCon,
                                  ! ! !      AudioUnitRenderActionFlags* ioActionFlags,
                                  ! ! !      const AudioTimeStamp* inTimeStamp,
                                  ! ! !      UInt32 inBusNumber,
                                  ! ! !      UInt32 inNumberFrames,
                                  ! ! !      AudioBufferList* ioData);




                          •   Hier findet die interessante Arbeit statt!




Dienstag, 4. Oktober 11                                                                   20
Erstes Beispiel



Dienstag, 4. Oktober 11                     21
Samples abspielen


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

                          •   AudioUnits: MultiChannelMixer und RemoteIO

                          •   Ein Render Callback liefert die Samples




Dienstag, 4. Oktober 11                                                                 22
Demo




Dienstag, 4. Oktober 11          23
Tipps



Dienstag, 4. Oktober 11           24
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;




Dienstag, 4. Oktober 11                                                                      25
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



Dienstag, 4. Oktober 11                                                  26
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



Dienstag, 4. Oktober 11                                                                27
Level-Meter


                          • AVAudioPlayer hat peekPowerForChannel:
                          • Wir nutzen einen Render Notifier!
                          • Demo


Dienstag, 4. Oktober 11                                              28
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:   memset(&asbd, 0, sizeof(asbd));


                          •   Umrechnung von Float nach 32bit Signed Int: Multiplikation mit
                              16777216L


Dienstag, 4. Oktober 11                                                                        29
“Kochbuch”



Dienstag, 4. Oktober 11                30
Ton-Erzeugung


                          • Elementare Signale
                          • Erzeugung eines einfachen Sinus-Signals
                          • Demo


Dienstag, 4. Oktober 11                                               31
Effekt-Filter


                          • Wir können keine eigenen Audio-Units erzeugen :(
                          • Lösung: ausgeschalteter iPodEQ mit Render Callback
                          • Demo


Dienstag, 4. Oktober 11                                                          32
Recording in eine Datei

                          • AudioUnitRenderNotify() auf dem Mixer
                          • ExtAudioFileWriteAsync()
                          • Format beachten!
                          • AAC Konvertierung läuft in Hardware
                          • Demo

Dienstag, 4. Oktober 11                                             33
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

Dienstag, 4. Oktober 11                                                                   34
Neuerungen in iOS 5



Dienstag, 4. Oktober 11                         35
Neue Audio Units


                          •   Effekte: Filter, Reverb, etc.

                          •   Generatoren: AudioFilePlayer, ScheduledSlicePlayer

                          •   Instrumente: AUSampler




Dienstag, 4. Oktober 11                                                            36
AUSampler


                          •   Neu in iOS 5 und Mac OS X Lion

                          •   Vereinfacht unser Beispiel deutlich

                          •   Native Unterstützung für SoundFonts




Dienstag, 4. Oktober 11                                             37
Music Sequencing API


                          •   Lesen und Schreiben von MIDI Files

                          •   Takt

                          •   MusicTracks




Dienstag, 4. Oktober 11                                            38
Der Synthesizer



Dienstag, 4. Oktober 11                     39
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

Dienstag, 4. Oktober 11                                                                40
Und alle: der Synthesizer



                          • Demo



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



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



Dienstag, 4. Oktober 11                                                                    44
⌘
                          Macoun’11

Dienstag, 4. Oktober 11               45

Core Audio und MIDI auf iOS

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