The way I did it is by trying to solve more and more advanced problems with simpler tools/features, then looking at more advanced features and seeing where they could be applied to make the problem solving simpler. Rinse and repeat.
An easy example that I can remember is making arrays that dynamically expand. I started with the barebones malloc and worked out how to use std::vector (and other list types) in its place.
Understanding that concept is, what I believe, to be the foundation of learning programming.
I’m no pro whatsoever, but using this method really helps me pick up and learn new languages.
I care about MIDIs! I’ll check this out asap.
Pretty cool, I’m interested to see how far you can take it!
If you can match BASSMIDI in terms of features then you got yourself a serious synth on hands. (If you can match Sound Canvas or Yamaha MU synths, even better!)
Just keep in mind that most (and by that I mean like 99%) of soundfonts aren’t exactly made to proper specifications. A lot of them miss certain parameters (such as filter cutoff frequency, LFO frequencies, etc) and even misuse them (reverb and chorus pre-set on layers being cranked up).
The only soundfonts I recommend you develop this with (as your target) are the ones made by E-MU themselves. CT4MGM.SF2 especially. They basically cloned the Roland SC-55 as closely as they could on their sound chips at the time and most sounds match the behaviors correctly.