# AudioKit

## Welcome to AudioKit

Your guide to understanding the codebase

[View on GitHub](https://github.com/AudioKit/AudioKit "View on GitHub")

### Learning Path

16 units • 5 levels

#### Orchestration & APIs
- Pipelines, workflows, public interfaces • 4 units

#### AudioEngine Core & Node Architecture
- Architecture · 5

#### AudioEngine Core & Node Protocol
- Architecture · 4

#### Audio File Processing & Timing
- Data Model · 5

#### Basic Audio Playback & Recording
- Workflow · 10

#### Core Logic & Data
- Business rules, schemas, models • 3 units

#### Signal Routing & Mixing
- Architecture · 5

#### MIDI Fundamentals
- Patterns · 28

#### Audio Processing & Effects
- Workflow · 6

#### Interaction & Integration
- UI components, external connectors • 2 units

#### MIDI Integration & Synchronization
- Integration · 8

#### Sequencing & Synthesis
- Workflow · 5

#### Cross-Cutting Concerns
- Auth, logging, config, testing • 2 units

#### Production & Deployment
- Infrastructure · 7

#### Analysis & Rendering
- Workflow · 5

#### Edge Cases & Resilience
- Error handling, fault tolerance • 2 units

#### Additional Data Model Patterns
- Data Model · 10

#### Additional Error Handling Patterns
- Error Handling · 5

### Test Your Knowledge

Test your deep understanding of the codebase

#### Question Tiers
- **Why**  
  8
- **Purpose & Problem**  
  Architecture  
  10
- **Design & Patterns**  
  Code  
  8
- **Implementation**

### Hands-On Assignment

2-3 hours

### Your Challenge

Build a real-time audio visualizer node that analyzes incoming audio and generates frequency spectrum data that can be used to drive visual displays. Your node should tap into the audio engine's processing chain, perform FFT analysis on the audio buffer, and expose the frequency bins through a callback mechanism. The implementation should follow AudioKit's node architecture patterns and work seamlessly with existing audio players and effects.

### Starting Points

```plaintext
Package.swift:1-17
```
Examine the package structure and dependencies to understand how AudioKit is organized and what audio processing capabilities are available

```plaintext
Sources/AudioKit/Nodes/
```
Explore existing node implementations to understand the base node architecture, how nodes connect to the audio engine, and how they process audio buffers

```plaintext
Sources/AudioKit/Nodes/Effects/
```
Study how effect nodes tap into the audio stream without interrupting playback - your visualizer should work similarly

```plaintext
Sources/AudioKit/Nodes/Analysis/
```
This is where you'll create your new FFTVisualizerNode class that performs frequency analysis

```plaintext
Sources/AudioKit/AudioEngine.swift
```
Understand how nodes attach to the engine and how audio buffers flow through the processing chain

### Success Criteria

- Node can be inserted into an audio chain without affecting audio playback quality
- Frequency spectrum data (array of magnitude values) is delivered via callback at regular intervals
- Works with both audio file playback and live microphone input
- FFT size is configurable (support at least 1024, 2048, and 4096 sample windows)
- No audio dropouts or glitches occur during visualization
- Example playground or test app demonstrates the visualizer with a simple bar graph display
- Memory usage remains stable during extended operation (no leaks)

### Hints

- Hint 1: Understanding AudioKit's node architecture conceptual
- Hint 2: FFT processing in audio context implementation
- Hint 3: Real-time callback pattern implementation
- Hint 4: Integration with existing audio chain code location
- Hint 5: Performance considerations implementation

#### Prerequisites:
- Audio buffer processing
- FFT fundamentals
- Swift closures and callbacks
- AVFoundation basics
