Preface |
|
x | |
Acknowledgments |
|
xiii | |
|
Chapter 1 Modular Synthesis: Theory |
|
|
1 | (15) |
|
1.1 Why Modular Synthesis? |
|
|
1 | (1) |
|
1.2 An Historical Perspective |
|
|
2 | (6) |
|
1.2.1 The Early Electronic and Electroacoustic Music Studios |
|
|
2 | (2) |
|
1.2.2 The Birth and Evolution of Modular Synthesizers |
|
|
4 | (2) |
|
1.2.3 The Advent of a Standard |
|
|
6 | (1) |
|
|
7 | (1) |
|
1.3 Modular Synthesis Basics |
|
|
8 | (8) |
|
|
8 | (2) |
|
1.3.2 Timbre Modification and Spectral Processing |
|
|
10 | (2) |
|
1.3.3 Envelope, Dynamics, Articulation |
|
|
12 | (1) |
|
1.3.4 "Fire at Will," or in Short: Sequencers |
|
|
13 | (2) |
|
|
15 | (1) |
|
Chapter 2 Elements of Signal Processing for Synthesis |
|
|
16 | (58) |
|
2.1 Continuous-Time Signals |
|
|
16 | (2) |
|
2.2 Discrete-Time Signals |
|
|
18 | (4) |
|
2.3 Discrete-Time Systems |
|
|
22 | (5) |
|
|
27 | (11) |
|
2.4.1 Discrete Fourier Series |
|
|
29 | (3) |
|
2.4.2 Discrete Fourier Transform |
|
|
32 | (3) |
|
2.4.3 Properties of the Discrete Fourier Transform |
|
|
35 | (1) |
|
2.4.4 Again on LTI Systems: The Frequency Response |
|
|
36 | (1) |
|
2.4.5 Computational Complexity and the Fast Fourier Transform |
|
|
36 | (1) |
|
2.4.6 Short-Time Fourier Transform |
|
|
37 | (1) |
|
2.5 Once Again on LTI Systems: Filters |
|
|
38 | (2) |
|
2.6 Special LTI Systems: Discrete-Time Differentiator and Integrator |
|
|
40 | (2) |
|
2.7 Analog to Digital and Back |
|
|
42 | (4) |
|
2.8 Spectral Content of Typical Oscillator Waveforms |
|
|
46 | (3) |
|
2.9 Understanding Aliasing |
|
|
49 | (3) |
|
2.10 Filters: The Practical Side |
|
|
52 | (2) |
|
2.11 Nonlinear Processing |
|
|
54 | (9) |
|
|
54 | (4) |
|
2.11.2 Amplitude and Ring Modulation |
|
|
58 | (2) |
|
2.11.3 Frequency Modulation |
|
|
60 | (3) |
|
|
63 | (6) |
|
2.13 Numerical Issues and Hints on Coding |
|
|
69 | (2) |
|
|
71 | (3) |
|
Chapter 3 VCV Rack Basics |
|
|
74 | (17) |
|
3.1 Overview of the System |
|
|
75 | (1) |
|
|
76 | (1) |
|
|
77 | (1) |
|
|
78 | (2) |
|
3.4.1 AUDIO-8 and AUDIO-16 |
|
|
78 | (1) |
|
|
78 | (1) |
|
|
79 | (1) |
|
|
80 | (1) |
|
|
80 | (1) |
|
3.4.6 CV-MIDI, CV-CC, CV-GATE |
|
|
80 | (1) |
|
|
80 | (3) |
|
|
83 | (8) |
|
3.6.1 Audio and MIDI Routing |
|
|
83 | (1) |
|
3.6.2 East Coast Synthesis in One Minute |
|
|
84 | (1) |
|
|
85 | (3) |
|
|
88 | (1) |
|
3.6.5 Using Polyphonic Cables |
|
|
88 | (3) |
|
Chapter 4 Developing with VCV Rack |
|
|
91 | (19) |
|
4.1 Comparison with Other Platforms |
|
|
92 | (4) |
|
|
92 | (2) |
|
|
94 | (1) |
|
|
95 | (1) |
|
|
95 | (1) |
|
4.1.5 Simplicity and Object-Oriented Programming |
|
|
95 | (1) |
|
4.2 Plugins: Files and Directories |
|
|
96 | (1) |
|
4.3 Plugins: Software Components |
|
|
97 | (2) |
|
4.4 Setting Up Your System for Coding |
|
|
99 | (3) |
|
|
99 | (1) |
|
|
100 | (1) |
|
|
100 | (1) |
|
4.4.4 Building VCV Rack from Sources |
|
|
100 | (2) |
|
4.5 Building Your First "Hello World" Module |
|
|
102 | (4) |
|
|
102 | (1) |
|
4.5.2 Structure of the Source Files |
|
|
102 | (4) |
|
4.6 Adopting an IDE for Development: Eclipse |
|
|
106 | (4) |
|
4.6.1 Importing a "Makefile Project" |
|
|
107 | (1) |
|
4.6.2 Building the Project Inside Eclipse |
|
|
108 | (2) |
|
Chapter 5 The Graphical User Interface: A Quick Introduction |
|
|
110 | (9) |
|
5.1 Generating SVG Files with Inkscape |
|
|
110 | (3) |
|
5.1.1 Creating the Panel and the Background |
|
|
111 | (1) |
|
5.1.2 Creating the Panel and the Background |
|
|
112 | (1) |
|
5.2 Base Widget Objects for Knobs, Ports and Switches |
|
|
113 | (6) |
|
5.2.1 Automatically Placing Components |
|
|
115 | (4) |
|
Chapter 6 Let's Start Programming: The Easy Ones |
|
|
119 | (29) |
|
6.1 Creating a New Plugin from Scratch, Using the Helper Script |
|
|
119 | (1) |
|
|
120 | (5) |
|
|
125 | (4) |
|
6.4 Knobs: Displaying, Mapping, and Computing Their Values |
|
|
129 | (2) |
|
|
131 | (6) |
|
|
137 | (3) |
|
6.7 Binary Frequency Divider |
|
|
140 | (3) |
|
|
143 | (4) |
|
6.9 To Recap: Exercise Patches |
|
|
147 | (1) |
|
6.9.1 Creating a Bernoulli Distribution and Bernoulli Gate |
|
|
147 | (1) |
|
|
147 | (1) |
|
Chapter 7 Getting Serious: DSP "Classroom" Modules |
|
|
148 | (27) |
|
7.1 Handling Polyphony Properly |
|
|
148 | (2) |
|
7.2 Linear Envelope Generator |
|
|
150 | (3) |
|
7.3 Exponential Envelope Generator |
|
|
153 | (5) |
|
7.3.1 A Virtual Analog RC Filter |
|
|
154 | (1) |
|
7.3.2 Implementation of the Exponential Envelope Generator |
|
|
155 | (3) |
|
|
158 | (7) |
|
7.4.1 Modelling a Diode Envelope Follower |
|
|
159 | (4) |
|
7.4.2 Implementation of the Envelope Follower |
|
|
163 | (2) |
|
7.5 Multimode State-Variable Filter |
|
|
165 | (6) |
|
7.5.1 A Discrete-Time Model of the Multimode State-Variable Filter |
|
|
165 | (3) |
|
7.5.2 Implementation of the State-Variable Filter |
|
|
168 | (3) |
|
|
171 | (4) |
|
7.6.1 To Recap: Exercise with Patches |
|
|
173 | (1) |
|
7.6.1.1 Simple Snare Sound Generation |
|
|
174 | (1) |
|
|
174 | (1) |
|
7.6.1.3 Creating a Step Filter |
|
|
174 | (1) |
|
7.6.1.4 The Chemist's Lab, Aka Polyphonic Noise Filters |
|
|
174 | (1) |
|
Chapter 8 Crunching Numbers: Advanced DSP Modules |
|
|
175 | (42) |
|
|
175 | (9) |
|
8.1.1 Modal Synthesis Principles |
|
|
176 | (1) |
|
8.1.2 A State-Variable Filter Bank |
|
|
177 | (1) |
|
|
177 | (3) |
|
8.1.4 Adding Context Menu Options |
|
|
180 | (3) |
|
|
183 | (1) |
|
8.2 Virtual Analog Oscillator with Limited Aliasing |
|
|
184 | (22) |
|
8.2.1 Trivial Oscillators |
|
|
184 | (2) |
|
8.2.2 Oversampling: The Easy Solution |
|
|
186 | (2) |
|
8.2.3 Implementing a Trivial Oscillator with Oversampling |
|
|
188 | (4) |
|
8.2.4 Differentiated Parabolic Waveform and Its Extensions |
|
|
192 | (4) |
|
8.2.5 Differentiated Parabolic Waveform Implementation |
|
|
196 | (7) |
|
8.2.6 Computational Cost and Aliasing |
|
|
203 | (1) |
|
8.2.7 Polyphonic Oscillator Module |
|
|
204 | (2) |
|
|
206 | (8) |
|
8.3.1 Trivial Foldback Algorithm |
|
|
208 | (1) |
|
8.3.2 Antiderivative Anti-Aliasing Method |
|
|
208 | (2) |
|
8.3.3 Wavefolder Module Implementation |
|
|
210 | (4) |
|
8.4 To Recap: Exercise with Patches |
|
|
214 | (3) |
|
8.4.1 A Modal Synthesis Patch |
|
|
214 | (1) |
|
|
214 | (1) |
|
8.4.3 West Coast Mono Voice |
|
|
215 | (1) |
|
|
215 | (2) |
|
Chapter 9 The Graphical User Interface: Creating Custom Widgets |
|
|
217 | (16) |
|
9.1 The Rendering Library: NanoVG |
|
|
217 | (1) |
|
9.2 Custom Widgets Creation |
|
|
218 | (7) |
|
9.2.1 Custom Knobs and Buttons |
|
|
219 | (3) |
|
|
222 | (3) |
|
9.3 An Interactive Widget |
|
|
225 | (8) |
|
Chapter 10 Additional Topics |
|
|
233 | (28) |
|
|
233 | (8) |
|
10.1.1 Running a Debug Session |
|
|
234 | (2) |
|
10.1.2 Debugging a Segmentation Fault |
|
|
236 | (1) |
|
|
237 | (1) |
|
10.1.4 Debugging with the Eclipse IDE |
|
|
237 | (2) |
|
10.1.5 Other Debugging Methods |
|
|
239 | (2) |
|
|
241 | (6) |
|
10.2.1 Table Lookup for Transcendental Functions |
|
|
242 | (3) |
|
10.2.2 Sine Approximation by Table Lookup |
|
|
245 | (1) |
|
10.2.3 Quadratic Approximation of Sine |
|
|
245 | (1) |
|
10.2.4 The Chamberlin Resonator as a Sine Oscillator |
|
|
246 | (1) |
|
10.2.5 Reducing the GUI Processing Burden |
|
|
247 | (1) |
|
10.3 Developing Expander Modules |
|
|
247 | (3) |
|
10.4 Adding Factory Presets |
|
|
250 | (1) |
|
10.5 Storing and Recalling Module Information through JSON |
|
|
251 | (5) |
|
10.5.1 Storing and Recalling JSON Data for AModalGUI |
|
|
253 | (3) |
|
10.6 Versioning the Code and Managing a Git Repository |
|
|
256 | (2) |
|
10.7 Getting into the Third-Party Plugin List |
|
|
258 | (1) |
|
10.8 Making a Revenue out of Coding |
|
|
259 | (2) |
|
|
259 | (1) |
|
|
259 | (1) |
|
|
260 | (1) |
|
Chapter 11 After Reading This Book |
|
|
261 | (5) |
|
11.1 Forking the ABC Collection |
|
|
261 | (1) |
|
11.2 Learn More about Virtual Analog Algorithms |
|
|
262 | (1) |
|
11.3 Experiment with Novel Digital Algorithms |
|
|
262 | (1) |
|
11.4 Build a Hybrid Hardware/Software Modular Rack |
|
|
263 | (3) |
Bibliography |
|
266 | (4) |
Index |
|
270 | |