I’ve been absolutely loving oooooo. It’s my perfect looper and is taking away my Octatrack gas, but I really want to be able to send my loops to separate hardware FX busses live, in real time.
Is there any way to get individual outs from the raspi? I expect there is some serious script modification to do, but is there more fundamental work needed at the firmware level (which is very likely beyond me). I’m assuming this isn’t as simple as an off-the-shelf audio interface.
yes, substantial changes would be required to the audio system internals. i would call this “software” and not “firmware” in this context - which is to say, it is absolutely possible to modify the audio system code to work with multiple output channels, rebuild and run it “in the field,” but it’s not particularly simple and not something we are likely to ever add upstream.
I assume the idea would be to use an external interface. This is totally doable. The issue is that softcut assumes throughout that it is mixing all voices to a stereo output.
So it would require a hack to give softcut JACK client more outputs and to mix the voices differently. That’s also not really difficult but does require changes in multiple places and some proficiency in C++.
@zebra, out of curiosity, I was pouring over the code to figure out this change. I understand it would be several places, but am I on the right track that the goal would be to stem changes from this line, and instead create multiple mix's and have each softcut voice go to its own mix? and then each mix can have its own JACK pipe? my understanding is that if SoftctuClient is broken into six JACK pipes, it could be diverted to multiple USB interfaces.
but of course- you have lots of things on your plate and you are overly generous with your time already, so feel free to ignore my curiosity. I definitely don’t intend to nerd snipe with this question.
yes, that’s about right. that line is where the mono voice busses are panned and mixed to the existing stereo output. i would make this just copy each one to the corresponidng JACK output bus. there is no need for additional mix busses (in fact we could probably eliminate the existing stereo mix bus and save a copy step - i think at some point i was doing some additional processing to the summed voices, or planning to.)
SoftcutClient inherits from Client, which handles JACK stuff. one thing ab out this class is that it assumes inputs and outputs come in sets of 2, which i guess is fine.
Client is a templated class. SoftcutClient inherits from Client<2, 2> but you would want it to become a Client<2, 6>.
Client defines Sink and Source types (stereo is implied), norns/Client.h at main · monome/norns · GitHub
and maintains arrays with an appropriate number of sinks and sources based on the IO counts in the template parameters. these sink/source members are updated each callback to always point at the JACK IO buffers.
so in the derived class, the block-processing function just uses the sink/source members: