1. Beispieldateinen auf dem                                      Schreibtisch anordnen.                                   ...
Core Audio und MIDI auf iOS                                  Boris Bügling / @NeoNachoDienstag, 4. Oktober 11             ...
Motivation                          •   Unterwegs musizieren ist toll                          •   Apple sieht das genau s...
Überblick                          •   Grundlagen, Einführung in Audio Units und Tipps                          •   Abspie...
GrundlagenDienstag, 4. Oktober 11                5
Digitale Audio Verarbeitung                          •   Digitales Signal: Messung zu diskreten Zeitpunkten               ...
Digitale Audio Verarbeitung                          •   Sample: Messwert einer Waveform                          •   Fram...
Digitale Audio Verarbeitung                          •   Interleaved: ein Buffer für beide Kanäle                         ...
Audio in iOS                          •   HTML 5 <audio> Tag                          •   Media Player Framework          ...
•   “Easy” and “CoreAudio” can’t be used in the same sentence.                              CoreAudio is very powerful, ve...
AVAudioSession                          •   Kategorisiert Apps und regelt den Hardware Zugriff                          • ...
Audio Units                          •   Echtzeit, Mixing, Audio-Synthese, Streaming                          •   Größter ...
Audio Units                          •   aber auch: niedrigster Level, der Entwicklern auf iOS zur                        ...
Audio UnitsDienstag, 4. Oktober 11                 14
AudioUnit                          •   Audio-Processing Plug-Ins                          •   iOS: Keine eigenen Units (im...
AudioUnit                          •   AudioComponentDescription - Manufacturer, Type, SubType                          • ...
Verfügbare Audio Units in iOS 4                          •   RemoteIO, GenericOutput                          •   VoicePro...
AUGraph                          •   Organisiert die Verbindungen zwischen den Units (AUNode)                          •  ...
AUGraph                          •   Drei Phasen: Open, Init, Running                          •   Änderungen der Sample-R...
AURenderCallback                                  OSStatus   callback (void* inRefCon,                                  ! ...
Erstes BeispielDienstag, 4. Oktober 11                     21
Samples abspielen                          •   ExtAudioFileOpenUrl() - unterstützt WAV, AAC, MP3, etc.                    ...
DemoDienstag, 4. Oktober 11          23
TippsDienstag, 4. Oktober 11           24
Vom AudioTimeStamp zu                                     Nanosekunden                          •   AudioTimeStamp ist in ...
Behandlung von OSStatus                          •   Jede Funktion gibt einen OSStatus zurück                          •  ...
Connections vs.                                        AURenderCallback                          •   Pull-Prinzip aus _ein...
Level-Meter                          • AVAudioPlayer hat peekPowerForChannel:                          • Wir nutzen einen ...
Tipps                          •   Kein malloc() oder NSLog() im Render Callback (~85 Aufrufe pro                         ...
“Kochbuch”Dienstag, 4. Oktober 11                30
Ton-Erzeugung                          • Elementare Signale                          • Erzeugung eines einfachen Sinus-Sig...
Effekt-Filter                          • Wir können keine eigenen Audio-Units erzeugen :(                          • Lösun...
Recording in eine Datei                          • AudioUnitRenderNotify() auf dem Mixer                          • ExtAud...
Exkurs: SoundFonts                          • Samples und Einstellungen für Instrumente in MIDI-Software                  ...
Neuerungen in iOS 5Dienstag, 4. Oktober 11                         35
Neue Audio Units                          •   Effekte: Filter, Reverb, etc.                          •   Generatoren: Audi...
AUSampler                          •   Neu in iOS 5 und Mac OS X Lion                          •   Vereinfacht unser Beisp...
Music Sequencing API                          •   Lesen und Schreiben von MIDI Files                          •   Takt    ...
Der SynthesizerDienstag, 4. Oktober 11                     39
Core MIDI                          •   Verfügbar seit iOS 4.2                          •   MIDI zu USB zu Camera Connectio...
Und alle: der Synthesizer                          • DemoDienstag, 4. Oktober 11                                   41
Exkurs: NNAudio                          • Objective-C Wrapper um einen Teil der Audio Units                          • Ab...
Fragen?Dienstag, 4. Oktober 11             43
Literatur                          •   Folien und Beispielcode: http://vu0.org/audio                          •   Audio Un...
⌘                          Macoun’11Dienstag, 4. Oktober 11               45
Nächste SlideShare
Wird geladen in …5
×

Core Audio und MIDI auf iOS

1.823 Aufrufe

Veröffentlicht am

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.

Veröffentlicht in: Technologie
1 Kommentar
0 Gefällt mir
Statistik
Notizen
  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
1.823
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
6
Aktionen
Geteilt
0
Downloads
6
Kommentare
1
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

Core Audio und MIDI auf iOS

  1. 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’11Dienstag, 4. Oktober 11 1
  2. 2. Core Audio und MIDI auf iOS Boris Bügling / @NeoNachoDienstag, 4. Oktober 11 2
  3. 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 AudioDienstag, 4. Oktober 11 3
  4. 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 SynthesizerDienstag, 4. Oktober 11 4
  5. 5. GrundlagenDienstag, 4. Oktober 11 5
  6. 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 FrequenzbereichDienstag, 4. Oktober 11 6
  7. 7. Digitale Audio Verarbeitung • Sample: Messwert einer Waveform • Frame: Menge an Samples für jeden Kanal • Packet: kleinste zusammenhängende Datenmenge des FormatsDienstag, 4. Oktober 11 7
  8. 8. Digitale Audio Verarbeitung • Interleaved: ein Buffer für beide Kanäle • Non-Interleaved: ein Buffer pro KanalDienstag, 4. Oktober 11 8
  9. 9. Audio in iOS • HTML 5 <audio> Tag • Media Player Framework • AVFoundation • OpenAL • Audio Queues • Audio UnitsDienstag, 4. Oktober 11 9
  10. 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-ListeDienstag, 4. Oktober 11 10
  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”Dienstag, 4. Oktober 11 11
  12. 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. 13. Audio Units • aber auch: niedrigster Level, der Entwicklern auf iOS zur Verfügung stehtDienstag, 4. Oktober 11 13
  14. 14. Audio UnitsDienstag, 4. Oktober 11 14
  15. 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 DatenflussDienstag, 4. Oktober 11 15
  16. 16. AudioUnit • AudioComponentDescription - Manufacturer, Type, SubType • AudioStreamBasicDescription (ASBD) regelt das Format • Konfiguration via AudioUnitSetProperty • Dadurch ist die API Doku relativ nutzlosDienstag, 4. Oktober 11 16
  17. 17. Verfügbare Audio Units in iOS 4 • RemoteIO, GenericOutput • VoiceProcessingIO • MultiChannelMixer • 3DMixer • AUiPodEQ • Format ConversionDienstag, 4. Oktober 11 17
  18. 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öglichDienstag, 4. Oktober 11 18
  19. 19. AUGraph • Drei Phasen: Open, Init, Running • Änderungen der Sample-Rate nur mittels Neuaufbau und -start • Bei Änderungen Neustart, sonst kommt es zu CrashesDienstag, 4. Oktober 11 19
  20. 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. 21. Erstes BeispielDienstag, 4. Oktober 11 21
  22. 22. Samples abspielen • ExtAudioFileOpenUrl() - unterstützt WAV, AAC, MP3, etc. • AudioUnits: MultiChannelMixer und RemoteIO • Ein Render Callback liefert die SamplesDienstag, 4. Oktober 11 22
  23. 23. DemoDienstag, 4. Oktober 11 23
  24. 24. TippsDienstag, 4. Oktober 11 24
  25. 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. 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 CodeDienstag, 4. Oktober 11 26
  27. 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 DebuggenDienstag, 4. Oktober 11 27
  28. 28. Level-Meter • AVAudioPlayer hat peekPowerForChannel: • Wir nutzen einen Render Notifier! • DemoDienstag, 4. Oktober 11 28
  29. 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 16777216LDienstag, 4. Oktober 11 29
  30. 30. “Kochbuch”Dienstag, 4. Oktober 11 30
  31. 31. Ton-Erzeugung • Elementare Signale • Erzeugung eines einfachen Sinus-Signals • DemoDienstag, 4. Oktober 11 31
  32. 32. Effekt-Filter • Wir können keine eigenen Audio-Units erzeugen :( • Lösung: ausgeschalteter iPodEQ mit Render Callback • DemoDienstag, 4. Oktober 11 32
  33. 33. Recording in eine Datei • AudioUnitRenderNotify() auf dem Mixer • ExtAudioFileWriteAsync() • Format beachten! • AAC Konvertierung läuft in Hardware • DemoDienstag, 4. Oktober 11 33
  34. 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 • DemoDienstag, 4. Oktober 11 34
  35. 35. Neuerungen in iOS 5Dienstag, 4. Oktober 11 35
  36. 36. Neue Audio Units • Effekte: Filter, Reverb, etc. • Generatoren: AudioFilePlayer, ScheduledSlicePlayer • Instrumente: AUSamplerDienstag, 4. Oktober 11 36
  37. 37. AUSampler • Neu in iOS 5 und Mac OS X Lion • Vereinfacht unser Beispiel deutlich • Native Unterstützung für SoundFontsDienstag, 4. Oktober 11 37
  38. 38. Music Sequencing API • Lesen und Schreiben von MIDI Files • Takt • MusicTracksDienstag, 4. Oktober 11 38
  39. 39. Der SynthesizerDienstag, 4. Oktober 11 39
  40. 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 • DemoDienstag, 4. Oktober 11 40
  41. 41. Und alle: der Synthesizer • DemoDienstag, 4. Oktober 11 41
  42. 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-SamplesDienstag, 4. Oktober 11 42
  43. 43. Fragen?Dienstag, 4. Oktober 11 43
  44. 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 2011Dienstag, 4. Oktober 11 44
  45. 45. ⌘ Macoun’11Dienstag, 4. Oktober 11 45

×