// Let it ring for 2 seconds sleep(2); pluck.noteOff(0.1); // Release with 0.1s decay sleep(1); dac.stopStream(); return 0; }
STK is the blueprint, the toolbox, and the teacher, all rolled into one elegant C++ library. It is, and will remain, a classic.
int main() { Plucked pluck(440.0); // A4 note pluck.noteOn(0.7); // 70% amplitude
Compilation: g++ -o pluck pluck.cpp -lstk -lrt -lpthread -lasound (Linux) The Synthesis ToolKit is not the fastest, the prettiest, or the most modern audio library. But it is arguably the most honest . In an era of black-box AI synthesis and monolithic DAWs, STK offers a return to first principles. It is the "K&R C" of sound synthesis—a concise, powerful, and deeply educational artifact.
RtAudio dac; RtAudio::StreamParameters params; params.deviceId = dac.getDefaultOutputDevice(); params.nChannels = 2;
For the aspiring audio programmer, spending a week with STK is a rite of passage. You will learn why delays become echoes, why filters become vowels, and why a single line of feedback can transform noise into a clarinet. For the professional, STK remains a trusted reference implementation—when you forget how a formant filter works, you check the FormSwitching.cpp file.
#include "Plucked.h" #include "RtAudio.h" #include <iostream> // Audio callback function int tick(void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData) { Plucked *pluck = (Plucked *)userData; double *out = (double *)outputBuffer; for (unsigned int i = 0; i < nBufferFrames; i++) { *out++ = pluck->tick(); // Left channel *out++ = pluck->tick(); // Right channel } return 0; }
dac.openStream(¶ms, NULL, RTAUDIO_FLOAT64, 44100, 256, &tick, (void *)&pluck); dac.startStream();