This is a great article! I've been interested in music software and hardware for decades and my lockdown hobby has been finally spending the time to really dig into it. It is both very challenging and very rewarding.
If you want to go a little deeper than the article, here's a few more notes:
The way the author generates the sawtooth and square waves is "analytically". That means treating them like a function of time and simply calculating the waveform position each point in time. As you can see, it's really simple. Unfortunately, it also introduces a ton of aliasing and will sound pretty harsh, especially at higher pitches. If you're familiar with nearest-neighbor sampling in image resizing, think about how nasty and chunky the resulting image looks when you scale it down using nearest neighbor. Analytic waveforms do the equivalent thing for audio.
Fixing that problem is surprisingly hard. It's a lot like texture rendering in games where there's a bunch of filtering, tricks, and hacks you can do to make things look smooth without burning a ton of CPU cycles.
The clever trick the author uses to simulate strings is: https://en.wikipedia.org/wiki/Karplus–Strong_string_...
The low-pass filter they show is a simple first-order 6 dB/octave digital low-pass filter. Filtering is fundamental to electronic music. The majority of synthesizers you hear in electronic music use "subtractive synthesis" which means to start with the simple sawtooth and square waves introduced early in the article and use filters to tame their harsh overtones. I find the math behind filter design, especially the moving filters used for synths, really difficult, but also interesting.