Core Audio und MIDI auf iOS

45
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

description

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.

Transcript of Core Audio und MIDI auf iOS

Page 1: Core Audio und MIDI auf iOS

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

Page 2: Core Audio und MIDI auf iOS

Core Audio und MIDI auf iOSBoris Bügling / @NeoNacho

2Dienstag, 4. Oktober 11

Page 3: Core Audio und MIDI auf iOS

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

Page 4: Core Audio und MIDI auf iOS

Ü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

Page 5: Core Audio und MIDI auf iOS

Grundlagen

5Dienstag, 4. Oktober 11

Page 6: Core Audio und MIDI auf iOS

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

Page 7: Core Audio und MIDI auf iOS

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

Page 8: Core Audio und MIDI auf iOS

Digitale Audio Verarbeitung

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

• Non-Interleaved: ein Buffer pro Kanal

8Dienstag, 4. Oktober 11

Page 9: Core Audio und MIDI auf iOS

Audio in iOS

• HTML 5 <audio> Tag

• Media Player Framework

• AVFoundation

• OpenAL

• Audio Queues

• Audio Units

9Dienstag, 4. Oktober 11

Page 10: Core Audio und MIDI auf iOS

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

Page 11: Core Audio und MIDI auf iOS

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

Page 12: Core Audio und MIDI auf iOS

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

Page 13: Core Audio und MIDI auf iOS

Audio Units

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

13Dienstag, 4. Oktober 11

Page 14: Core Audio und MIDI auf iOS

Audio Units

14Dienstag, 4. Oktober 11

Page 15: Core Audio und MIDI auf iOS

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

Page 16: Core Audio und MIDI auf iOS

AudioUnit

• AudioComponentDescription - Manufacturer, Type, SubType

• AudioStreamBasicDescription (ASBD) regelt das Format

• Konfiguration via AudioUnitSetProperty

• Dadurch ist die API Doku relativ nutzlos

16Dienstag, 4. Oktober 11

Page 17: Core Audio und MIDI auf iOS

Verfügbare Audio Units in iOS 4

• RemoteIO, GenericOutput

• VoiceProcessingIO

• MultiChannelMixer

• 3DMixer

• AUiPodEQ

• Format Conversion

17Dienstag, 4. Oktober 11

Page 18: Core Audio und MIDI auf iOS

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

Page 19: Core Audio und MIDI auf iOS

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

Page 20: Core Audio und MIDI auf iOS

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

Page 21: Core Audio und MIDI auf iOS

Erstes Beispiel

21Dienstag, 4. Oktober 11

Page 22: Core Audio und MIDI auf iOS

Samples abspielen

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

• AudioUnits: MultiChannelMixer und RemoteIO

• Ein Render Callback liefert die Samples

22Dienstag, 4. Oktober 11

Page 23: Core Audio und MIDI auf iOS

Demo

23Dienstag, 4. Oktober 11

Page 24: Core Audio und MIDI auf iOS

Tipps

24Dienstag, 4. Oktober 11

Page 25: Core Audio und MIDI auf iOS

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

Page 26: Core Audio und MIDI auf iOS

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

Page 27: Core Audio und MIDI auf iOS

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

Page 28: Core Audio und MIDI auf iOS

Level-Meter

• AVAudioPlayer hat peekPowerForChannel:

• Wir nutzen einen Render Notifier!

• Demo

28Dienstag, 4. Oktober 11

Page 29: Core Audio und MIDI auf iOS

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

Page 30: Core Audio und MIDI auf iOS

“Kochbuch”

30Dienstag, 4. Oktober 11

Page 31: Core Audio und MIDI auf iOS

Ton-Erzeugung

• Elementare Signale

• Erzeugung eines einfachen Sinus-Signals

• Demo

31Dienstag, 4. Oktober 11

Page 32: Core Audio und MIDI auf iOS

Effekt-Filter

• Wir können keine eigenen Audio-Units erzeugen :(

• Lösung: ausgeschalteter iPodEQ mit Render Callback

• Demo

32Dienstag, 4. Oktober 11

Page 33: Core Audio und MIDI auf iOS

Recording in eine Datei

• AudioUnitRenderNotify() auf dem Mixer

• ExtAudioFileWriteAsync()

• Format beachten!

• AAC Konvertierung läuft in Hardware

• Demo

33Dienstag, 4. Oktober 11

Page 34: Core Audio und MIDI auf iOS

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

Page 35: Core Audio und MIDI auf iOS

Neuerungen in iOS 5

35Dienstag, 4. Oktober 11

Page 36: Core Audio und MIDI auf iOS

Neue Audio Units

• Effekte: Filter, Reverb, etc.

• Generatoren: AudioFilePlayer, ScheduledSlicePlayer

• Instrumente: AUSampler

36Dienstag, 4. Oktober 11

Page 37: Core Audio und MIDI auf iOS

AUSampler

• Neu in iOS 5 und Mac OS X Lion

• Vereinfacht unser Beispiel deutlich

• Native Unterstützung für SoundFonts

37Dienstag, 4. Oktober 11

Page 38: Core Audio und MIDI auf iOS

Music Sequencing API

• Lesen und Schreiben von MIDI Files

• Takt

• MusicTracks

38Dienstag, 4. Oktober 11

Page 39: Core Audio und MIDI auf iOS

Der Synthesizer

39Dienstag, 4. Oktober 11

Page 40: Core Audio und MIDI auf iOS

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

Page 41: Core Audio und MIDI auf iOS

Und alle: der Synthesizer

• Demo

41Dienstag, 4. Oktober 11

Page 42: Core Audio und MIDI auf iOS

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

Page 43: Core Audio und MIDI auf iOS

Fragen?

43Dienstag, 4. Oktober 11

Page 44: Core Audio und MIDI auf iOS

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

Page 45: Core Audio und MIDI auf iOS

Macoun’11⌘

45Dienstag, 4. Oktober 11