Meanwhile, the Q Audio DSP Library is inching its way towards a 1.0 release. For those who don’t know yet what it is, here’s the description lifted from the GitHub project page:
Q is a cross-platform C++ library for Audio Digital Signal Processing. Aptly named after the “Q factor”, a dimensionless parameter that describes the quality of a resonant circuit, the Q DSP Library is designed to be simple and elegant, as the simplicity of its name suggests, and efficient enough to run on small microcontrollers.
Q leverages the power of modern C++ and efficient use of functional programming techniques, especially function composition using fine-grained and reusable function objects (both stateless and stateful), to simplify complex DSP programming tasks without sacrificing readability.
Q is the host of some experimental Music related DSP facilities such as Virtual Pickups (Virtual pickup placement simulator) and Bitstream Autocorrelation (An extremely fast and efficient pitch detection scheme) the author has accumulated over the years as part of research and development, and will continue to evolve to accommodate more facilities necessary for the fulfillment of various Music related projects.
Cycfi is not just about guitars. It’s about music tech in general. I keep forgetting that I love keyboards and synths too. In the DSP realm (my favorite rabbit hole), this is the world of envelopes and oscillators, of blits, bleps, and polybleps, of FFT and Cepstrums.
So, while working on the docs (still a work in progress). I had a chance to clean up and polish one of the examples included in the project: The Hello, Universe demo for Q which features a fully functional, bandwidth limited subtractive analog synthesizer with ADSR envelope that controls an amplifier and a resonant filter and control the note-on and note-off using MIDI.
The example is complete and self-contained in one .cpp file, kept as simple as possible to highlight the ease-of-use. The full example can be found here: example/square_synth.cpp.
For fun, the Hello, Universe documentation includes this short video clip: