Designing Audio Effect Plugins in C++: For AAX, AU, and VST3 with DSP Theory, 2nd Edition (Paperback) book cover

Designing Audio Effect Plugins in C++

For AAX, AU, and VST3 with DSP Theory, 2nd Edition

By Will C. Pirkle

Routledge

656 pages

Purchasing Options:$ = USD
Paperback: 9781138591936
pub: 2019-05-09
SAVE ~$13.39
$66.95
$53.56
x
Hardback: 9781138591899
pub: 2019-05-08
SAVE ~$40.00
$200.00
$160.00
x
eBook (VitalSource) : 9780429490248
pub: 2019-05-02
from $33.48


FREE Standard Shipping!

Description

Designing Audio Effect Plugins in C++ presents everything you need to know about digital signal processing in an accessible way. Not just another theory-heavy digital signal processing book, nor another dull build-a-generic-database programming book, this book includes fully worked, downloadable code for dozens of professional audio effect plugins and practically presented algorithms.

Sections include the basics of audio signal processing, the anatomy of a plugin, AAX, AU and VST3 programming guides; implementation details; and actual projects and code. More than 50 fully coded C++ audio signal-processing objects are included. Start with an intuitive and practical introduction to the digital signal processing (DSP) theory behind audio plug-ins, and quickly move on to plugin implementation, gain knowledge of algorithms on classical, virtual analog, and wave digital filters, delay, reverb, modulated effects, dynamics processing, pitch shifting, nonlinear processing, sample rate conversion and more. You will then be ready to design and implement your own unique plugins on any platform and within almost any host program.

This new edition is fully updated and improved and presents a plugin core that allows readers to move freely between application programming interfaces and platforms. Readers are expected to have some knowledge of C++ and high school math.

Table of Contents

Table of Contents

Dedication

List of Figures

List of Tables

Preface

1 Introduction

1.1 Using This Book

1.2 Fundamentals of Audio Signal Processing

1.2.1 Acquisition of Audio Samples

1.3 Reconstruction of the Analog Signal

1.4 Numerical Representation of Audio Data

1.5 Analytical DSP Test Signals

1.5.1 DC and Step (0 Hz)

1.5.2 Nyquist

1.5.3 ½ Nyquist

1.5.4 ¼ Nyquist

1.5.5 Impulse

1.6 Signal Processing Algorithms

1.6.1 Bookkeeping

1.6.2 The One-Sample Delay

1.6.3 Multiplication With a Scalar Value

1.6.4 Addition and Subtraction

1.6.5 Some Algorithm Examples and Difference Equations

1.7 1st Order Feed Forward and Feed Back Algorithms

1.8 Bibliography

2 Anatomy of an Audio Plugin

2.1 Plugin Packaging: Dynamic-Link Libraries (DLLs)

2.2 The Plugin Description: Simple Strings

2.2.1 The Plugin Description: Features and Options

2.3 Initialization: Defining the Plugin Parameter Interface

2.3.1 Initialization: Defining Channel I/O Support

2.3.2 Initialization: Sample Rate Dependency

2.4 Processing: Preparing for Audio Streaming

2.4.1 Processing: Audio Signal Processing (DSP)

2.5 Mixing Parameter Changes with Audio Processing

2.5.1 Plugin Variables and Plugin Parameters

2.5.2 Parameter Smoothing

2.5.3 Pre and Post-Processing Updates

2.5.4 VST3 Sample Accurate Updates

2.5.5 Multithreaded Software

2.6 Monolithic Plugin Objects

2.7: Bibliography

3 VST3 Programming Guide

3.1 Setting up the VST3 SDK

3.1.1 VST3 Sample Projects

3.1.2 VST3 Documentation

3.2 VST3 Architecture and Anatomy

3.2.1 Single vs. Dual Component Architectures

3.2.2 VST3 Base Classes

3.2.3 MacOS Bundle ID

3.2.4 VST3 Programming Notes

3.2.5 VST3 and the GUID

3.2.6 VST3 Plugin Class Factory

3.3 Description: Plugin Description Strings

3.4 Description: Plugin Options/Features

3.4.1 Side Chain Input

3.4.2 Latency

3.4.3 Tail Time

3.4.4 Custom GUI

3.4.5 Factory Presets and State Save/Load

3.4.6 VST3 Support for 64-bit Audio

3.5 Initialization: Defining Plugin Parameters

3.5.1 Thread Safe Parameter Access

3.5.2 Initialization: Defining Plugin Channel I/O Support

3.5.3 Initialization: Channel Counts and Sample Rate Information

3.6 The Buffer Process Cycle

3.6.1 Processing: Updating Plugin Parameters from GUI Controls

3.6.2 Processing: Resetting the Algorithm and Preparing for Streaming

3.6.3 Processing: Accessing the Audio Buffers

3.6.4 Processing: Writing Output Parameters

3.6.5 Processing: VST3 Soft Bypass

3.7 Destruction/Termination

3.8 Retrieving VST3 Host Information

3.9 Validating your Plugin

3.10 Using ASPiK to Create VST3 Plugins

3.11 Bibliography

 

4 Audio Unit Programming Guide

4.1 Setting up the AU SDK

4.1.1 AU Sample Projects

4.1.2 AU Documentation

4.2 AU Architecture and Anatomy

4.2.1 AU Base Classes

4.2.2 MacOS Bundle ID

4.2.3 AU Programming Notes

4.3 Description: Plugin Description Strings

4.4 Description: Plugin Options/Features

4.4.1 Side Chain Input

4.4.2 Latency

4.4.3 Tail Time

4.4.4 Custom GUI

4.4.5 Factory Presets and State Save/Load

4.5 Initialization: Defining Plugin Parameters

4.5.1 Thread Safe Parameter Access

4.5.2 Initialization: Defining Plugin Channel I/O Support

4.5.3 Initialization: Channel Counts and Sample Rate Information

4.6 The Buffer Process Cycle

4.6.1 Processing: Updating Plugin Parameters from GUI Controls

4.6.2 Processing: Resetting the Algorithm and Preparing for Streaming

4.6.3 Processing: Accessing the Audio Buffers

4.6.4 Processing: Writing Output Parameters

4.7 The AU/GUI Connection

4.7.1 Cocoa’s Flat Namespace

4.7.2 The AU Event Listener System

4.8 Destruction/Termination

4.9 Retrieving AU Host Information

4.10 Validating your Plugin

4.11 Using ASPiK to Create AU Plugins

4.12 Bibliography

5 AAX Native Programming Guide

5.1 Setting up the AAX SDK

5.1.1 AAX Sample Projects

5.1.2 AAX Documentation

5.2 AAX Architecture and Anatomy

5.2.1 AAX Model-Algorithm Synchronization

5.2.2 AAX Base Classes

5.2.3 MacOS Bundle ID

5.2.4 AAX Programming Notes

5.2.5 AAX Class Factory

5.2.6 AAX Effect Categories

5.2.7 AAX Algorithms: Channel Processing Functions

5.2.8 AAX Algorithm Data

5.2.9 Algorithm Data Contents

5.3 Description: Plugin Description Strings

5.3.1 Description: Defining AAX Algorithms

5.4 Description: Plugin Options/Features

5.4.1 Side Chain Input

5.4.2 Latency

5.4.3 Tail Time

5.4.4 Custom GUI

5.4.5 Factory Presets and State Save/Load

5.4.6 AAX Notification System

5.4.7 AAX Custom Data

5.4.8 AAX EQ and Dynamics Curves

5.4.9 AAX Gain Reduction Meter

5.5 Initialization: Defining Plugin Parameters

5.5.1 Thread Safe Parameter Access

5.5.2 Initialization: Defining Plugin Channel I/O Support

5.5.3 Initialization: Channel Counts and Sample Rate Information

5.6 The Buffer Process Cycle

5.6.1 Processing: Updating Plugin Parameters from GUI Controls

5.6.2 Processing: Resetting the Algorithm and Preparing for Streaming

5.6.3 Processing: Accessing the Audio Buffers

5.6.4 Processing: Writing Output Parameters

5.6.5 Processing: AAX Soft Bypass

5.7 Destruction/Termination

5.8 Retrieving AAX Host Information

5.9 Validating your Plugin

5.10 Using ASPiK to Create AAX Plugins

5.11 Bibliography

6 ASPiK Programming Guide

6.1 Plugin Kernel Portability and Native Plugin Shells

6.2 Organizing the SDKs: AAX, AU and VST

6.2.1 Your C++ Compiler

6.2.2 Setting up the AAX SDK

6.2.3 Setting up the AU SDK

6.2.4 Setting up the VST SDK

6.2.5 Creating the Universal SDK Folder Hierarchy

6.2.6 Adding the VSTGUI4 Library

6.2.7 CMake

6.3 Creating a Plugin Project with ASPiKreator: IIRFilters

6.3.1 ASPiK Project Folders

6.3.2 Running CMake

6.4 Adding Effect Objects to the PluginCore

6.4.1 The PluginCore Constructor

6.4.2 IIRFilters: GUI Parameter Lists

6.4.3 Parameter Smoothing

6.4.4 Handling the String-List Parameters

6.4.5 IIRFilters: Declaring Plugin Variables

6.4.6 Parameter Object Enumerations for Attributes

6.4.6.1 Continuous Floating Point Parameters & Discrete Integer Parameters

6.4.6.2 String-List Parameters

6.4.7 IIRFilters Object Declarations & Reset

6.4.8 IIRFilters: GUI Parameter Updates

6.4.9 IIRFilters: Processing Audio Data

6.4.10 Buffer Pre-Processing

6.4.11 Buffer Post-Processing

6.4.12 Buffer versus Frame Processing

6.4.13 processAudioFrame: Information About the Frame

6.4.14 processAudioFrame: Input and Output Samples

6.5 Defining Factory Presets

6.6 Basic Plugin GUI Design with ASPiK’s PluginGUI

6.7 GUI Design with VSTGUI4

6.7.1 Modifier Keys

6.7.2 Zooming (Scaling the GUI)

6.7.3 Reserved control-tags

6.7.4 VSTGUI4 Objects

6.7.5 Creating a GUI with VSTGUI

6.7.6 Important GUI Designer Terms

6.8 VSTGUI C++ Objects

6.8.1 Basic GUI Design

6.8.2 The GUI Designer Workspace

6.8.3 Changing Your GUI Canvas Size

6.8.4 Setting up the Control Tags

6.8.5 Importing the Graphics Files

6.8.6 Assembling the GUI

6.8.7 Setting the Background

6.8.8 Adding the GUI Elements

6.8.9 Saving and Re-building

6.8.10 Scaling the GUI

6.8.11 More ASPiK Features

6.9 Bibliography

7 Using RackAFX to Create ASPiK Projects 1

7.1 Installing RackAFX 2

7.2 Getting Started with RackAFX 2

7.3 Setting up Your Project Preferences & Audio Hardware 4

7.4 Installing VSTGUI4 4

7.5 Creating a Project and Adding GUI Controls 4

7.5.1 Numerical Continuous Controls 7

7.5.2 String-List Controls 8

7.5.3 Meters 10

7.6 Anatomy of your RackAFX project 11

7.7 Testing Audio Algorithms with RackAFX 13

7.8 RackAFX Impulse Convolver and FIR Design Tools 14

7.9 Designing Your Custom GUI 16

7.10 Exporting Your ASPiK Project 17

7.11 Bibliography

8 C++ Conventions & How to Use This Book

8.1 Three Types of C++ Objects

8.1.1 Effect Objects Become Framework Object Members

8.1.2 All Effect Objects and Most DSP Objects Implement Common Interfaces

8.1.3 DSP and Effect Objects use Custom Data Structures for Parameter Get/Set Operations

8.1.4 Effect Objects Accept Native Data from GUIs

8.1.5 Effect Objects Process Audio Samples

8.1.6 Effect Objects Optionally Process Frames

8.2 Book Projects

8.2.1 ASPiK Users

8.2.2 JUCE and other non-ASPiK Users

8.2.3 A Sample Plugin Project: GUI Control Definition

 

9 How DSP Filters Work (Without Complex Math)

9.1 Frequency and Phase Response Plots

9.2 Frequency and Phase Adjustments from Filtering

9.3 1st Order Feed-Forward Filter

9.4 1st Order Feed-Back Filter

9.5 Final Observations

9.6 Homework

9.7 Bibliography

 

10 Basic DSP Theory

10.1 The Complex Sinusoid

10.2 Complex Math Review

10.3 Time Delay as a Math Operator

10.4 The Sampled Sinusoid

10.5 1st Order Feed-Forward Filter Revisited

10.5.1 Negative Frequencies

10.6 Evaluating the Transfer Function H(ω)

10.6.1 DC (0Hz)

10.6.2 Nyquist (π)

10.6.3 ½ Nyquist (π/2)

10.6.4 ¼ Nyquist (π/4)

10.7 Evaluating ejω

10.8 The z-Substitution

10.9 The z-Transform

10.10 The z Transform of Signals

10.11 The z Transform of Difference Equations

10.12 The z Transform of an Impulse Response

10.13 The "Zeros" of the Transfer Function

10.14 Estimating the Frequency Response: Zeros

10.15 Filter Gain Control

10.16 1st Order Feedback Filter Revisited

10.17 The Poles of the Transfer Function

10.17.1 DC (0 Hz)

10.17.2 Nyquist (π)

10.17.3 ½ Nyquist (π/2)

10.17.4 ¼ Nyquist (π/4)

10.18 2nd Order Feed-Forward Filter

10.18.1 DC (0Hz)

10.18.2 Nyquist (π)

10.18.3 ½ Nyquist (π/2)

10.18.4 ¼ Nyquist (π/4)

10.18.5 z Transform of Impulse Response

10.19 2nd Order Feedback Filter

10.19.1 DC (0Hz)

10.20 1st Order Pole/Zero Filter: the Shelving Filter

10.20.1 DC (0Hz)

10.21 The Bi-Quadratic Filter

10.21.1 The aN and bM Coefficient Naming Conventions

10.22 Other Biquadratic Structures

10.23 C++ DSP Object: Biquad

10.23.1 Biquad: Enumerations and Data Structure

10.23.2 Biquad: Members

10.23.3 Biquad: Programming Notes

10.24 Homework

10.25 Bibliography

11 Audio Filter Designs: IIR Filters

11.1 Direct z-Plane Design

11.1.1 Simple Resonator

11.1.2 Smith-Angell Resonator

11.2 Analog Filter to Digital Filter Conversion

11.3 Audio Bi-quad Filter Designs

11.3.1 The Audio Bi-quad Filter Structure

11.3.2 Classical Filters

11.4 Poles and Zeros at Infinity

11.4.1 1st Order All-Pole Filter

11.4.2 2nd Order All-Pole Filter: The MMA LPF

11.4.3 Vicanek’s Analog Matched Magnitude 2nd Order LPF

11.4.4 Vicanek’s Analog Matched Magnitude 2nd Order BPF

11.5 The Impulse Invariant Transform Method

11.5.1 Impulse Invariant 1st Order LPF

11.5.2 Impulse Invariant 2nd Order LPF

11.6 C++ Effect Object: AudioFilter

11.6.1 AudioFilter: Enumerations and Data Structure

11.6.2 AudioFilter: Members

11.6.3 AudioFilter: Programming Notes

11.7 Chapter Plugin: IIRFilters

11.7.1 IIRFilters GUI Parameters

11.7.2 IIRFilters Object Declarations and Reset

11.7.3 IIRFilters GUI Parameter Update

11.7.4 IIRFilters Process Audio

11.8 Homework

11.9 Bibliography

 

12 Audio Filter Designs: Wave Digital and Virtual Analog

12.1 Wave Digital Filters

12.1.1 Scattering Parameters and WDFs

12.1.2 Simulating WDF Components

12.1.3 Simulating WDF Component Interconnections

12.2 WDF Adaptors

12.2.1 Series Adaptors

12.2.2 Parallel Adaptors

12.2.3 More Component Combinations

12.2.4 Signal Flow Through a WDF Circuit

12.2.5 Ladder Filter WDF Library Conventions

12.2.6 Filter Source/Termination Impedance Matching

12.2.7 Bilinear Transform Frequency Warping

12.3 Designing Digital Ladder Filters with the WDF Library

12.3.1 WDF Ladder Filter Design: 3rd Order Butterworth LPF

12.3.2 WDF Ladder Filter Design: 3rd Order Bessel BSF

12.3.3 WDF Ladder Filter Design: 6th Order Constant-K BPF

12.3.4 WDF Ladder Filter Design: Ideal 2nd Order RLC Filters

12.4 Zavalishin’s Virtual Analog Filters

12.4.1 1st Order VA Filters

12.4.2 2nd Order State Variable VA Filter

12.5 C++ DSP Object: ZVAFilter

12.5.1 ZVAFilter: Enumerations and Data Structure

12.5.2 ZVAFilter: Members

12.5.3 ZAFilter: Programming Notes

12.6 C++ DSP Objects: WDF Ladder Filter Library

12.6.1 WDFIdealRLCxxx: Enumerations and Data Structure

12.6.2 WDFIdealRLCxxx: Members

12.6.3 WDFIdealRLCxxx: Programming Notes

12.7 Chapter Plugin: RLCFilters

12.7.1 RLCFilters GUI Parameters

12.7.2 RLCFilters Object Declarations and Reset

12.7.3 RLCFilters GUI Parameter Update

12.7.4 RLCFilters Process Audio

12.8 Homework

12.9 Bibliography

 

13 Modulators: LFOs and Envelope Detectors

13.1 LFO Algorithms

13.1.1 The IAudioSignalGenerator Interface

13.1.2 C++ DSP Object: LFO

13.1.3 LFO: Enumerations and Data Structure

13.1.4 LFO: Members

13.1.5 LFO: Programming Notes

13.2 Envelope Detection

13.2.1 C++ DSP Object: AudioDetector

13.2.2 AudioDetector: Enumerations and Data Structure

13.2.3 AudioDetector: Members

13.2.4 AudioDetector: Programming Notes

13.3 Modulating Plugin Parameters

13.3.1 Modulation Range, Polarity and Depth

13.3.2 Modulation with the Envelope Detector

13.4 C++ Effect Object: EnvelopeFollower

13.4.1 EnvelopeFollower: Enumerations and Data Structure

13.4.2 EnvelopeFollower: Members

13.4.3 EnvelopeFollower: Programming Notes

13.5 Chapter Plugin 1: ModFilter

13.5.1 ModFilter GUI Parameters

13.5.2 ModFilter Object Declarations and Reset

13.5.3 ModFilter GUI Parameter Update

13.5.4 ModFilter Process Audio

13.6 The Phaser Effect

13.6.1 C++ Effect Object: PhaseShifter

13.6.2 PhaseShifter: Enumerations and Data Structure

13.6.3 PhaseShifter: Members

13.6.4 PhaseShifter: Programming Notes

13.7 Chapter Plugin 2: Phaser

13.7.1 Phaser GUI Parameters

13.7.2 Phaser Object Declarations and Reset

13.7.3 Phaser GUI Parameter Update

13.7.4 Phaser Process Audio

13.8 Homework

13.9 Bibliography

14 Delay Effects and Circular Buffers

14.1 The Basic Digital Delay

14.2 Digital Delay with Wet/Dry Mix

14.3 An Efficient Circular Buffer Object

14.3.1 C++ DSP Object: CircularBuffer with Fractional Delay

14.3.2 CircularBuffer: Enumerations and Data Structure

14.3.3 CircularBuffer: Members

14.3.4 CircularBuffer: Programming Notes

14.4 Basic Delay Algorithms

14.4.1 Stereo Delay with Feedback

14.4.2 Stereo Ping-Pong Delay

14.5 C++ Effect Object: AudioDelay

14.5.1 AudioDelay: Enumerations and Data Structure

14.5.2 AudioDelay: Members

14.5.3 AudioDelay: Programming Notes

14.6 Chapter Plugin: StereoDelay

14.6.1 StereoDelay GUI Parameters

14.6.2 StereoDelay Object Declarations and Reset

14.6.3 StereoDelay GUI Parameter Update

14.6.4 StereoDelay Process Audio

14.6.5 Synchronizing the Delay time to BPM

14.7 More Delay Algorithms

14.7.1 Analog Modeling Delay

14.7.2 Multi-Tap Delay

14.7.3 LCR Delay

14.7.4 TC Electronics TC-2290 Dynamic Delay

14.8 Homework

14.9 Bibliography

 

15 Modulated Delay Effects

15.1 The Flanger/Vibrato Effect

15.1.1 Stereo Flanger

15.2 The Chorus Effect

15.2.1 Stereo Chorus

15.3 C++ Effect Object: ModulatedDelay

15.3.1 ModulatedDelay: Enumerations and Data Structure

15.3.2 ModulatedDelay: Members

15.3.3 ModulatedDelay: Programming Notes

15.4 Chapter Plugin: ModDelay

15.4.1 ModDelay GUI Parameters

15.4.2 ModDelay Object Declarations and Reset

15.4.3 ModDelay GUI Parameter Update

15.4.4 ModDelay Process Audio

15.5 More Modulated Delay Algorithms

15.5.1 Korg Stereo Cross-Feedback Flanger/Chorus

15.5.2 Sony DPS-M7 Multi-Flanger

15.5.3 Bass Chorus

15.5.4 Dimension-style Chorus (Roland Dimension D®)

15.5.5 Sony DPS-M7 Deca Chorus

15.6 Homework

15.7 Bibliography

 

16 Audio Filter Designs: FIR Filters

16.1 The Impulse Response Revisited: Convolution

16.2 FIR Filter Structures

16.3 Generating Impulse Responses

16.3.1 Impulse Responses of Acoustic Environments

16.3.2 Impulse Responses of Speakers and Cabinets

16.3.3 Impulse Responses by Frequency Sampling

16.3.4 Sampling Arbitrary Frequency Responses

16.3.5 Sampling Analog Filter Frequency Responses

16.3.6 Sampling Ideal Filter Frequency Responses

16.4 The Optimal/Parks-McClellan Method

16.5 Other FIR Design Methods

16.6 C++ DSP Function: freqSample

16.7 C++ DSP Function: calculateAnalogMagArray

16.7.1 calculateAnalogMagArray: Enumerations and Data Structure

16.7.2 calculateAnalogMagArray: Calculations

16.8 C++ DSP Object: LinearBuffer

16.8.1 LinearBuffer: Enumerations and Data Structure

16.8.2 LinearBuffer: Members

16.8.3 LinearBuffer: Programming Notes

16.9 C++ DSP Object: ImpluseConvolver

16.9.1 ImpluseConvolver: Enumerations and Data Structure

16.9.2 ImpluseConvolver: Members

16.9.3 ImpluseConvolver: Programming Notes

16.10 C++ Effect Object: AnalogFIRFilter

16.10.1 AnalogFIRFilter: Enumerations and Data Structure

16.10.2 AnalogFIRFilter: Members

16.10.3 AnalogFIRFilter: Programming Notes

16.11 Chapter Plugin: AnalogFIR

16.11.1 AnalogFIR GUI Parameters

16.11.2 AnalogFIR Object Declarations and Reset

16.11.3 AnalogFIR GUI Parameter Update

16.11.4 AnalogFIR Process Audio

16.12 Homework

16.13 Bibliography

 

17 Reverb Effects

17.1 Anatomy of a Room Impulse Response

17.1.1 RT60

17.2 Echoes and Modes

17.3 The Comb Filter Reverberator

17.4 The Delaying All-Pass Reverberator

17.4.1 Alternate & Nested Delaying APF Structures

17.5 Schroeder’s Reverberator

17.6 The LPF-Comb Reverberator

17.7 The Absorbent-APF Reverberator

17.8 The Modulated Delay APF

17.9 Moorer’s Reverberator

17.10 Dattorro’s Plate Reverb

17.11 The Spin Semiconductor® Reverb Tank

17.12 Generalized Feedback Delay Network Reverbs

17.12.1 Searching for FDN Coefficients

17.13 C++ DSP Objects: Reverb Objects

17.13.1 C++ DSP Object: SimpleDelay

17.13.2 SimpleDelay: Custom Data Structure

17.13.3 SimpleDelay: Members

17.13.4 SimpleDelay: Programming Notes

17.13.5 C++ DSP Object: SimpleLPF

17.13.6 SimpleLPF: Custom Data Structure

17.13.7 SimpleLPF: Members

17.13.8 SimpleLPF: Programming Notes

17.13.9 C++ DSP Object: CombFilter

17.13.10 CombFilter: Custom Data Structure

17.13.11 CombFilter: Members

17.13.12 CombFilter: Programming Notes

17.13.13 C++ DSP Object: DelayAPF

17.13.14 DelayAPF: Custom Data Structure

17.13.15 DelayAPF: Members

17.13.16 DelayAPFParameters: Programming Notes

17.13.17 C++ DSP Object: NestedDelayAPF

17.13.18 NestedDelayAPF: Custom Data Structure

17.13.19 NestedDelayAPF: Members

17.13.20 NestedDelayAPF: Programming Notes

17.13.21 C++ DSP Object: TwoBandShelvingFilter

17.13.22 TwoBandShelvingFilter: Custom Data Structure

17.13.23 TwoBandShelvingFilter: Members

17.13.24 TwoBandShelvingFilter: Programming Notes

17.14 C++ Effect Object: ReverbTank

17.14.1 ReverbTank: Enumerations and Data Structure

17.14.2 ReverbTank: Members

17.14.3 ReverbTank: Programming Notes

17.15 Chapter Plugin: Reverb

17.15.1 Reverb GUI Parameters

17.15.2 Reverb Object Declarations and Reset

17.15.3 Reverb GUI Parameter Update

17.15.4 Reverb Process Audio

17.16 Homework

17.17 Bibliography

 

18 Dynamics Processing

18.1 Compressor Output Calculation

18.1.1 Hard-Knee Compressor & Limiter

18.1.2 Soft-Knee Compressor & Limiter

18.2 Downward Expander Output Calculation

18.2.1 Hard-Knee Expander & Gate

18.2.2 Soft-Knee Expander

18.3 Final Gain Calculation

18.4 Stereo Linked Dynamics Processor

18.5 Spectral Dynamics Processing

18.6 Parallel Dynamics Processing

18.7 Look-Ahead Processing

18.8 External Keying

18.8.1 ASPiK Users: Side chain Code

18.9 Gain Reduction Metering

18.10 Alternate Side-Chain Configurations

18.11 C++ DSP Object: LRFilterBank

18.11.1 LRFilterBank: Enumerations and Data Structure

18.11.2 LRFilterBank: Members

18.11.3 LRFilterBank: Programming Notes

18.12 C++ Effect Object: DynamicsProcessor

18.12.1 DynamicsProcessor: Enumerations and Data Structure

18.12.2 DynamicsProcessor: Members

18.12.3 DynamicsProcessor: Programming Notes

18.13 Chapter Plugin: Dynamics

18.13.1 Dynamics GUI Parameters

18.13.2 Dynamics Object Declarations and Reset

18.13.3 Dynamics GUI Parameter Update

18.13.4 Dynamics Process Audio & External Keying

18.13.5 Stereo Linking the DynamicsProcessor Objects

18.13.6 ASPiK Users: Enabling the Special Pro-Tools Gain Reduction Meter

18.14 Homework

18.15 Bibliography

 

19 Nonlinear Processing: Distortion, Tube Simulation and HF Exciters

19.1 Frequency Domain Effects of Nonlinear Processing

19.2 Vacuum Tubes

19.3 Solid State Distortion

19.4 Bit Crushers

19.5 High Frequency Exciters

19.6 Virtual Bass

19.7 Ring Modulation

19.8 Nonlinear Processing Functions

19.8.1 Asymmetrical Waveshaping

19.9 C++ DSP Object: BitCrusher

19.9.1 BitCrusher: Enumerations and Data Structure

19.9.2 BitCrusher: Members

19.9.3 BitCrusher: Programming Notes

19.10 C++ DSP Object: DFOscillator

19.10.1 DFOscillator: Enumerations and Data Structure

19.10.2 DFOscillator: Members

19.10.3 DFOscillator: Programming Notes

19.11 C++ DSP Functions: Waveshapers

19.12 C++ DSP Object: TriodeClassA

19.12.1 TriodeClassA: Enumerations and Data Structure

19.12.2 TriodeClassA: Members

19.12.3 TriodeClassA: Programming Notes

19.13 C++ Effect Object: ClassATubePre

19.13.1 ClassATubePre: Enumerations and Data Structure

19.13.2 ClassATubePre: Members

19.13.3 ClassATubePre: Programming Notes

19.14 Chapter Plugin: TubePreamp

19.14.1 TubePreamp GUI Parameters

19.14.2 TubePreamp Object Declarations and Reset

19.14.3 TubePreamp GUI Parameter Update

19.14.4 TubePreamp Process Audio

19.15 Bonus Plugin Projects

19.16 Homework

19.17 Bibliography

 

20 FFT Processing: the Phase Vocoder

20.1 The Fourier Series

20.2 Understanding How the Fourier Kernel Works

20.2.1 Windowing DFT Input Data

20.3 The Complete DFT

20.4 The FFT

20.4.1 Overlap/Add Processing

20.4.2 Window Gain Correction

20.4.3 FFT and IFFT Magnitude and Phase

20.4.4 Using Phase Information

20.4.5 Phase Deviation

20.4.6 Phase Vocoder Coding

20.5 Some Phase Vocoder Effects

20.5.1 Robot and Simple Noise Reduction

20.5.2 Time Stretching/Shrinking

20.5.3 Pitch Shifting

20.5.4 Phase Locking

20.6 Fast Convolution

20.7 Gardner’s Fast Convolution

20.8 Chapter Objects and Plugins

20.9 C++ DSP Object: FastFFT

20.9.1 FastFFT: Enumerations and Data Structure

20.9.2 FastFFT: Members

20.9.3 FastFFT: Programming Notes

20.10 C++ DSP Object: PhaseVocoder

20.10.1 PhaseVocoder: Enumerations and Data Structure

20.10.2 PhaseVocoder: Members

20.10.3 PhaseVocoder: Programming Notes

20.11 C++ DSP Object: FastConvolver

20.11.1 FastConvolver: Members

20.11.2 FastConvolver: Programming Notes

20.12 C++ Effect Object: PSMVocoder

20.12.1 PSMVocoder: Enumerations and Data Structure

20.12.2 PSMVocoder: Members

20.12.3 PSMVocoder: Programming Notes

20.13 Chapter Plugin: PitchShifter

20.13.1 PitchShifter GUI Parameters

20.13.2 PitchShifter GUI Parameter Update

20.13.3 Phaser Process Audio

20.14 3rd Party C++ DSP Object: TwoStageFFTConvolver

20.15 Homework

20.16 Bibliography

 

21 Displaying Custom Waveforms & FFTs

21.1 Custom Views for Plotting Data

21.1.1 ASPiK: The GUI Lifecycle and Messaging

21.1.2 Multithreading: the Lock-Free Ring Buffer

21.1.3 A Waveform Histogram Viewer

21.1.4 An Audio Spectrum Analyzer View

21.2 Download the Project

 

22 Sample Rate Conversion

22.1 Interpolation: Overview

22.1.1 Interpolation: Operations

22.1.2 Interpolation: Polyphase Decomposition

22.2 Decimation: Overview

22.2.1 Decimation: Operations

22.2.2 Decimation: Polyphase Decomposition

22.3 Polyphase Decomposition Math

22.3.1 Type-1 Decomposition

22.3.2 Type-2 Decomposition

22.4 C++ DSP Objects: Interpolator & Decimator

22.4.1 C++ DSP Object: Interpolator

22.4.2 Interpolator: Enumerations and Data Structure

22.4.3 Interpolator: Members

22.4.4 Interpolator: Programming Notes

22.4.5 C++ DSP Object: Decimator

22.4.6 Decimator: Enumerations and Data Structure

22.4.7 Decimator: Members

22.4.8 Decimator: Programming Notes

22.5 Chapter Plugin: TubePreamp Revisited

22.6 Homework

22.7 References

Index

About the Author

Will C. Pirkle is Associate Professor and Program Director of Music Engineering Technology at the University of Miami Frost School of Music. He teaches classes in C++ Audio Programming, Signal Processing, Audio Synthesis, and Mobile App Programming. In addition to 14 years of teaching at the University of Miami, Will has 20 years of experience in the audio industry working and consulting for such names as Korg Research and Development, SiriusXM Radio, Diamond Multimedia, Gibson Musical Instruments, and National Semiconductor Corporation. An avid guitarist and studio owner, Will still seeks projects that combine all his skills.

Subject Categories

BISAC Subject Codes/Headings:
SOC052000
SOCIAL SCIENCE / Media Studies
TEC001000
TECHNOLOGY & ENGINEERING / Acoustics & Sound