Every synthesizer starts with an oscillator. This post covers TaroSynth's first step: implementing Sine, Saw and Square waves with JUCE's DSP module, wired to MIDI pitch.

The big lesson: never allocate memory or take locks inside the audio callback. Every lookup table and buffer is pre-allocated in prepareToPlay — processBlock does math only.

Next up: envelopes — the ADSR that gives a sound its shape.