I finally decided to have a go and try updating the envelopes per sample and not per buffer, and what a difference it makes! Before, the transitions were quite rough. Now they are so smooth that sometimes I still can't believe what I hear is my very own synth and not a sample :-P
And consequently I got a pretty decent bass drum. Not the usual weak, empty bass-less drums I am always annoyed to hear in 4k and 64k intros, but something that is easily distinguishable as a proper bass drum. And it's still missing filters and EQ's and all that; imagine when I implement them! It's going to be super.
So here's the sample, featuring some sort of hi hat+snare, the aforementioned bass drum (using a triangular wave as a base), a little short bass and some kind of FX that I created accidentally while playing with the envelopes.
I can't wait to begin work on importing data from Renoise's Song.xml and playing with the synth parameters, real time. They really make for some cool sounds -- I wonder where will this lead me or how will the song end up sounding like :-D
But first, there's still a bunch of pending tasks. Hopefully tomorrow I'll implement at least the filter and its envelope.
I am going to try and understand how the band-limited thing works, but right now my brain simply refuses to collaborate with me. So I'll throw a question out here and see if someone can answer it meanwhile: is it possible to apply "some kind of function" to a generated buffer, so that the output isn't that poppy-clicky?
I was naively thinking of interpolating the values of the buffer, but I don't know if that's a good idea... And the tutorials I have seen about bandwidth limited signals only focus on generating bandwidth limited wave tables, which isn't what I am doing right now.