Sunday, 5 January 2014

Sub-bass mode is back, bigger than before

The 'dewarble' change of a few days back broke my hacky subbass mode, and it never sounded any good anyway ... but now it's back, with a difference, and fatter than before.

So with the new, improved implementation, if subBass mode is enabled the compound oscillator swaps out the noise generator for a sub-oscillator. This is always 2 octaves below OSCA (I probably should make this configurable to one or two but I can't be bothered, and you still have individual feet control on OSCA and OSCB). The wave is a somewhat rounded square (about 1/3 of the way between a square and a sin - again, I do have a hook to make this user-selectable that I should exploit), and is level controlled by LEVELC, so it is a straight swap out for noise. You just select either noise or sub-bass when you configure a synth. No Phase Distortion on the subbass oscillator, that definitely will not be introduced, but with PD on for both OSCA and OSCB you get not only fat bass but good movement between all three oscillators. I will (or should ... ) introduce a microtuning facility for the sub-oscillator to allow even more movement, it isn't in any way phase-locked to OSCA.

And, even if I say so myself, it actually sounds pretty bloody great, to be honest. But I do fear for performance when I eventually stick it on a Pi - it's doing a lot more than it used to, the poor thing, and it ca only just squeeze 16 voices out of one core of the iPad 2.

Anyway - video -

p.s. I just discovered that my feet were all wrong. Way, way wrong. I was doubly applying the feet correction factor. So anything longer than 8 got too low, and 4 feet got way too high. 32 was 2 octaves below 16, and 4 octaves below 8. I have to say, thought it all sounded a bit extreme and lacking in control, but I still had to run the debugger over it to be sure ... my octave ears must be rubbish. 

All fixed now though. And another thing got fixed as well. In monophonic mode, when note stealing / oscillator stealing is happening (specifically when an envelope release is in process and a noteOn happens), in order to deglitch there is a controlled but by necessity pretty hard ramp of the EG amplitude down to zero, which resulted in an audible 'thing'. Not sure how to describe it, like a very low-pass filtered click, or thunk, or something. But now that's gone too, after some trickery and a minor increase in latency on these oscillator-stealing noteOn events. In fact, thinking about it, there are really clever ways to solve this problem without inducing the minor latency that my current solution has imposed, which would actually be the 'analog' solution. So, in the name of pseudo analog purity, this merits more work. But later* 

UPDATE - that 'thunk' - twas stupidity, introduced in an attempt to deglitch hardsync. Funny how pre-emptive strikes on perceived sources of clicks result in even worse clicks ... But now it's fully, totally gone. And now legato mode is now in, which opens up the world of MiniMoog-like solos for those cocky enough to try it, and for those whose controller keyboard will support it. Actually, the implementation will work on anything, pretty much - if you set up the synth to be monophonic and you enable legato, then if you hit a key before releasing the previously played key, you will get legato. 

*And final update on this post - in the name of pseudo analog purity the 'correct' solution to the 'ramp the EG down to zero' is now in place and sounds fabulous and clean, all latency around oscillator stealing is eliminated. And it's fewer CPU cycles to boot. It's hard to make it click now unless you go ring mod and hardsync crazy, when the waves can potentially get a bit out of control, and even then there is nothing I have yet heard that is objectionable. 

1 comment:

  1. I ought to explain some of this - all of the 'hard ramp the EG down to zero' and other crappy stuff resulted from the setting of oscillator phases to zero on a note on. Once the oscillators were allowed to free run, with everythign else managed correctly there are no discontinuities that can be introduced into the waveform. So it's inherently declicked, at which point I could just back out all the other declicking tactics that had crept in, and there were a surprisingly high number of them, including a nasty gotcha around hardsyncing, they have now finally all gone. And as a result the code is now much simpler, and the sound is much more analog, which is great.