Mental Movement
Ah, the billion days spent re-reviewing pitch and volume axis modulation have finally paid off! It has occurred to me that the -24dB / 440Hz pivot point is a "one size fits all" that really doesn't. Well, it works fine for the pitch side, but -24dB is just too far down on the volume side for the modulation to not get lost in the accompanying volume reduction. This morning I tried pivoting the volume axis instead at 0dB and, wow, it allowed me to simplify a bunch of basic stuff:
Above shows the processing graphically. The linear axis numbers are on the left (32 bits = 192dB of dynamic range).
Bottom: For the pitch axis, it's the same old -7/8 (440Hz), saturation (+/-1/2), *4, saturation, and mod multiplication, which gives us an input range of 48dB mapping to an output range of 96dB as +/-48dB, with an overall gain of 2.
Top: For the volume axis, the linear volume number has 1 subtracted from it, which positions the entire thing below zero, then saturation (0,-1/2), *2, saturation, and mod multiplication, which gives us an input range of 48dB mapping to an output range of 48dB as +/-24dB, with an overall gain of 1.
The pitch output is divided by 2, added to the volume output, *2, and saturated, which gives the equivalent gain of 2 to both axes. (Not necessary, but seems to work fine.)
So I can now make harmonic content / filter cutoff / oscillator crossfade / etc. happen much more abruptly near maximum volume. And I was able to get rid of negative offset ranges to these nominal knobs. While I was in there I reduced all xmix ranges to [0:31], which makes them less "spinny" in use. When volume modulation is positive the nominal knob now sets the maximum, and when volume modulation is negative the nominal sets the minimum - really pretty convenient, and a lot less back and forth. I was hung up on the modulation knob moving things in the positive / negative direction directly, which is perhaps a bit more intuitive, but didn't really apply even to the old scheme when your hand was below the pivot point.
I've got rough PV_MOD working on the oscillator harmonic multipliers, but need to refine it. I can feel the end of the D-Lev SW effort nearing ("I'm coming, Elizabeth!"). It uses 93% of main memory, and maybe 80% or so of real-time, so it fits like a glove in the Hive processor. I'm quite pleased with it all. This is a GIANT project (made giant-er because Hive), though once the myriad of basics have been nailed down, a v2 spinoff might actually be more of a baby / child step.