More Awesome Music DSP*
A curated list of my favourite music DSP and audio programming resources, focusing on the C++ programming language.
I like implementations that allow you to be creative quickly. The less code for the end user (e.g plug-in developer) the better!
Whilst there is some crossover here (for instance JUCE includes DSP functionality, FAUST makes plug-ins), hopefully the grouping makes some kind of sense...
Caveat: I am more of an "Audio Programmer" than I am a "DSP Engineer". Nevertheless I hope these resources are useful for people with a passion for audio/music technology from different backgrounds.
This was originally meant to be an "Awesome list", but apparently you are not meant to write in the first person. I much prefer my way of doing it so this is now a "more awesome" list.
- JUCE - JUCE is an undeniably awesome C++ application framework with audio roots. It boasts a vast amount of functionality for the development of music software, including support for almost all plug-in formats and platforms. JUCE is used widely in the music technology industry and it has excellent documentation, code standards, features and support. The JUCE team at Roli organise the Audio Developer's Conference (ADC) which is the most awesome conference around if you like audio programming. What's more all the videos from the three ADCs so far are available on youtube.
- WDL - WDL is Cockos' library of reusable C++ code, that is used to power the DAW Reaper, amongst other things. Whilst not traditionally a framework, there is so much good stuff in here, it is highly recommended - although there is next to no documentation, so it's not for the faint hearted. For more info about the various parts of WDL (which can be used independently), check the Cockos site
- WDL-OL/iPlug - Not to blow my own physically modelled trumpet, so to speak, but iPlug (originally created by Cockos) is an awesome plug-in framework. I have been maintaining a fork of it since ~2011, which is probably the most widely used and maintained of all of the forks out there. iPlug's syntax is super simple, for example, creating a parameter or a control in the UI is only a single line of C++ code.
- VSTGUI - VSTGUI is Steinberg's cross-platform UI toolkit for audio plug-ins. It is released under a BSD licence, and although it's not my weapon of choice, it's an impressive piece of work and many plug-in developers use it for their products.
- AudioKit - Well, i'm going to break the rules and include AudioKit here which uses the Swift programming language, because if you want to make apps for Apple's devices this is a great option, although if you want to do low level stuff, you will still have to delve into C/C++. It's a DSP and UI toolkit for audio things, so going in this category.
- Gamma - Gamma is a very awesome C++ DSP framework by Lance Putnam - a developer whose name I've known since the synthedit days. The beauty of Gamma is the conciseness of the implementation of certain techniques. The STFT is a bit of a pain to code yourself, involving overlapping FFT windows etc - how about this for a concise end user implementation.
- HIIR - HIIR is a seriously cool oversampling library by Laurent de Soras. Oversampling is something we often need in audio DSP, and this library handles it elegantly - providing a variety of classes for low latency IIR half band filtering (including SIMD optimizations). Originally this had a LGPL licence but now it's available under the WTFPL - my favourite licence.
- HOALibrary - As someone who works a lot with spatial audio, it's fantastic that the CICM have released this flexible DSP library for high order ambisonics (HOA) - a spatial audio platform that is becoming more and more relevant thanks to VR (GPL Licence).
This is a small selection of books that have been helpful to me. There are many others that look absolutely great but I have not used them in anger (yet).
- Will Pirkle - Will Pirkle has written two books that will be invaluable the aspiring audio plug-in developer - "Designing Audio Effect Plug-Ins in C++" and "Designing Software Synthesizer Plug-Ins in C++". For more info see here
- Dodge and Jerse - Computer Music: Synthesis, Composition and Performance, 2nd Edition - This is my absolute favourite book to recommend to students studying computer music/audio synthesis. I find the book does not date like some other computer music texts. The MUSIC-N style block diagrams are charming and the techniques are discussed very well.
- Udo Zölzer (Ed) - DAFX: Digital Audio Effects - This is a great book on audio DSP, written by a variety of domain experts, and it includes Matlab code examples.
- JOS - Julius Smith's site and his four books are an amazing resource. Matlab and FAUST code examples included!
- DAFX Conference Archive - All the papers from the DAFX conference are available online. Another great resource.
- EarLevel Engineering - Nigel Redmond's DSP blog contains some very nicely written explanations of a variety of topics.
- Michael Tyson blog - In depth article about Four common mistakes in audio development
- Ross Bencina's blog/site - Another Australian who writes a lot of interesting software and articles about lock free programming
Slightly veering off topic, these are the software tools that I find useful in my audio programming. Xcode 9 and Visual Studio 2017 are the free IDEs that I use, and both are very powerful these days.
- Mathworks Matlab - Matlab is a great piece of software, even if open source alternatives such as Octave and Python + ... are equally capable. The audio systems toolbox allows you to build VST plug-ins directly from Matlab. Although it's buried deep in the application, you'll find that Matlab audio systems toolbox uses both WDL-OL and JUCE to provide its plug-in functionality. Matlab also has great functionality for plotting curves and loads of other things.
- Cycling '74 Max - Max is a great environment to use for prototyping audio plug-ins. There are just so many options for integrating different technologies, I highly recommend it - even if nowadays most of the max patches I make only include a few objects!
- Desmos - This is an awesome online graphing calculator. Check out some interactive Casio CZ waveforms that I made saw square reso1
- Coliru - This is an online interactive C++ compiler, which can be a very nice and quick way to test out a particular feature of the language, without having to build a binary.
- Compiler Explorer - Compiler explorer is a great tool for checking the assembly code that different compilers will produce.
- FAUST Editor - This is an online FAUST IDE and compiler, that lets you test FAUST code with webaudio. You can then tell it to output a zip file with a binary for your preferred platform. This saves you all the trouble of installing FAUST and its dependencies on your local machine.
Open source projects to work with or look at for "inspiration"
I got into programming in C/C++ by making objects for Max and Synthedit. Learning how to use the SDKs for one of those or for one of the following open source packages is a nice way to start in my opinion, since you don't need to think about too many things. What's more - these great projects all show you how you can go about certain tasks... the code is there for you to look at. It might take you a while to find it, and sometimes the code might be hard to understand, but they all have oscillators, filters etc. There are many third party objects as well, that are also open source. Don't just copy stuff - you won't learn and you also probably violate the license, which is bad karma!
- puredata - I don't think pd needs an introduction! Also check out libpd, which you can use as an embeddable DSP runtime in your C++ audio plug-in etc.
- supercollider - Likewise, but make sure you look at the scsynth part for DSP stuff.
- csound - CSound has seen a renaisannce of late and can be used as an embedable DSP library
- vcvrack - Wow... i was seriously impressed when VCVRack was released earlier this year. Whilst the other items in this list have been around a while and have somewhat arcane code-bases, this is pretty new and the API is very clean and simple. I think making a VCVRack module it is a great way to get into audio programming.
- mutable instruments - Olivier's Gillet's work is very inspiring. Although written for microcontrollers, there is so much to learn from here. And it's ported to VCVRack so you can try it on the desktop.
Most of the audio programming that I do has to do with plug-ins, but I found a couple of hardware platforms that I really like developing for (mainly because writing code for these devices is not so different to making a plug-in).
- the owl pedal/module - This is a programmable stomp box and eurorack module that I've been working with since the kick starter campaign to launch it. It's a really nice little unit, which you can program in C++, FAUST, Pd or with Max gen~. I find the limited interface with 4 controls makes me think quite carefully about what's important about my DSP algorithm. You can find some patches I made for it (using a mixture of c++ and FAUST) in the user library, and the original code here.
- bela - Bela is a wonderful little SoC + Audio Interface which is pretty revolutionary, allowing super low latency audio and sensor I/O all clocked together, in a tiny package. I wrote the FAUST support class for bela. You can also program it with C++ or libpd, and even supercollider.
Here are a few links to the various corners of the internet and real-world where you might like to hang out if you like this kind of geeky stuff...
- musicdsp mailing list - The music DSP mailing list is pretty quiet these days, but it still worth signing up, despite the web 0-1 front page. Every now and again a music DSP legend posts something interesting.
- KvR Audio DSP and Plug-in Development Forum - This is probably the most active forum for audio DSP that is not aligned with a particular plug-in framework. There are some very smart people, some mavericks and some plain weirdos who hang out here.
- JUCE Forums - This is a collection of forums centred around the variety of things that JUCE does. Since there is such a huge amount of people using JUCE to make audio software, there is a lot of good info here.
- Cockos Forums - Another collection of forums centred around Cockos' tools including one for WDL/iPlug and one for Reaper JS.
- The audio developer conference (ADC) - Whilst the other places mentioned here are all virtual, this is a real conference where you can go and meet real people face-to-face who do audio programming - highly recommended! Having been to a lot of more academic conferences, I can say this one is well worth the cost of entry!
- TheAudioProgrammer Discord server - A friendly and supportive community to discuss and find help about audio programming. From beginners to experts, everybody is welcome regardless of their skill level. Also check TheAudioProgrammer Youtube channel.
Oli Larkin 2018