I think you aren’t quite following me - I said 0-1 and NOT 0/1, so yes this is a soft mask, but it is a mask, not a magnitude (which is what you calculate in the vocoder and also in your patch) - you require a normalisation step after the magnitude which you talk about and I’ve included in my code, but you haven’t in either the vocoder or the patch you posted - the outer product which doesn’t do that step. BTW - you can also save a step in your patch by using .jit.buffer~ to read the buffers directly into matrices.
I’ve just actually checked the source (as I’ve just been working conceptually) and basically what I am doing is the work of RatioMask, except that I generate the output magnitudes by summing activations * bases for all components, which I assume is equivalent to the way they are generated internally, but that’s bit more complex.
I understand what you are saying about the cross product, but I’m simply doing it manually - it’s not complicated enough to need a library function, and unless they’ve optimised that in some way (which is unknown) it won’t be faster algorithmically than manual loops.