Any advice on making "passthrough" returns?

Hi !
My open source dub preamp project is making great progress !
I am still having a huge blast so far with Elk Audio OS and Sushi !!!

I’m running into a small roadblock though.
The sushi.testing.return plugins do not seem to forward the signals before them.

Let’s run through a minimal repro example config.

There are two “source” tracks, and one “FX” track :

  • **Main track**, which gets input from engine_bus 0 (hifiberry stereo input), and outputs to track_bus 0 (hifiberry stereo out). Here, I typically get the signal from my DJ mixer and apply processing to it.
    • gain plugin
    • sushi.testing.send plugin, named “main_verb_send
    • my multiband compressor VST3 (moses)
  • **Sampler track**, which has no inputs, and outputs to track_bus 0.
    • my sample player VST3
    • sushi.testing.send plugin, named “sampler_verb_send
  • **Reverb track** no inputs, outputs to track_bus 0
    • sushi.testing.return plugin, named “main_verb_return
    • sushi.testing.return plugin, named “sampler_verb_return
    • MVerb vst2 (the actual reverb plugin)
The actual json config for this example (spoiler)
{
    "host_config": {
        "samplerate": 48000
    },
    "tracks": [
        {
            "name": "main",
            "channels": 2,
            "inputs": [
                {
                    "engine_bus": 0,
                    "track_bus": 0
                }
            ],
            "outputs": [
                {
                    "engine_bus": 0,
                    "track_bus": 0
                }
            ],
            "plugins": [
                {
                    "uid": "sushi.testing.send",
                    "name": "main_verb_send",
                    "type": "internal"
                },
                {
                    "path": "Moses.vst3",
                    "uid": "Moses",
                    "name": "Moses",
                    "type": "vst3x"
                }
            ]
        },
        {
            "name": "sampler",
            "channels": 2,
            "inputs": [],
            "outputs": [
                {
                    "engine_bus": 0,
                    "track_bus": 0
                }
            ],
            "plugins": [
                {
                    "path": "SampleTower.vst3",
                    "uid": "SampleTower",
                    "name": "SampleTower",
                    "type": "vst3x"
                },
                {
                    "uid": "sushi.testing.send",
                    "name": "sampler_verb_send",
                    "type": "internal"
                },
            ]
        },
        {
            "name": "reverb",
            "channels": 2,
            "inputs": [],
            "outputs": [
                {
                    "engine_bus": 0,
                    "track_bus": 0
                }
            ],
            "plugins": [
                {
                    "uid": "sushi.testing.return",
                    "name": "main_verb_return",
                    "type": "internal"
                },
// ========= my issue: this sampler_verb_return blocks the audio coming from main_verb_return :'( =========
                {
                    "uid": "sushi.testing.return",
                    "name": "sampler_verb_return",
                    "type": "internal"
                },
                {
                    "path": "MVerb-vst.so",
                    "uid": "MVerb",
                    "name": "reverb_processor",
                    "type": "vst2x"
                }
            ]
        }
    ],
    "initial_state": [
        {
            "processor": "main_verb_send",
            "properties": {
                "destination_name": "main_verb_return"
            }
        },
        {
            "processor": "sampler_verb_send",
            "properties": {
                "destination_name": "sampler_verb_return"
            }
        }
    ],
    "midi": {}
}

The issue I’m facing is that on the reverb track, the main_sampler_return plugin “blocks” the signal coming from the main_reverb_return plugin.

I guess it is normal, as return plugins act as “audio sources” and not “audio effects” that passes the signal through it, but it would have been hugely easier for my goal to be able to put multiple returns on the same track and hear them all at the same time.

Is there a quick-win workaround to achieve this ?
In ableton, for example, I would have been able to put the two returns in an “Instrument rack”.
Maybe I’m missing some tool in sushi ? or a passthrough setting on the return plugin ?

I also thought about moving the return plugins in my reverb track to two new separate tracks, and route the audio of those new tracks to the reverb track, so that they both get mixed to the reverb track.
Even though it should work on the paper, that would be a great complication to the setup, and in real life I need 4 FX tracks, not just a reverb track.

If it’s the only way, I’ll do it anyway. Lemme know ! :slight_smile:

As a side-note, when ELK Audio OS supports raspberry pi 5, I want to dive into driver programming to bring back support of PCM3168A and make a 6in 8out audio interface, like the ELK Blackboard, that would be so awesome !

Many thanks for your help and your wonderful work.

Leo

I think using new return tracks and routing buses is the only way.

Did I understand the buses feature correctly ?

In this new example config (not tested yet, will try tomorrow), I moved the return plugins to their own tracks, and used engine and track buses to route audio from the new return tracks to the actual reverb track.

main_reverb_return_track outputs its track_bus 0 to engine_bus 1,
sampler_reverb_return_track outputs its track_bus 0 to engine_bus 2,
then,
the reverb track inputs engine_bus 1 to its track_bus 0 AND engine_bus 2 also to track_bus 0, so that they both get mixed in the same bus.

Is sushi able to mix several engine buses into the same track buses like that ?

{
    "host_config": {
        "samplerate": 48000
    },
    "tracks": [
        {
            "name": "main",
            "channels": 2,
            "inputs": [
                {
                    "engine_bus": 0,
                    "track_bus": 0
                }
            ],
            "outputs": [
                {
                    "engine_bus": 0,
                    "track_bus": 0
                }
            ],
            "plugins": [
                {
                    "uid": "sushi.testing.send",
                    "name": "main_verb_send",
                    "type": "internal"
                },
                {
                    "path": "Moses.vst3",
                    "uid": "Moses",
                    "name": "Moses",
                    "type": "vst3x"
                }
            ]
        },
        {
            "name": "sampler",
            "channels": 2,
            "inputs": [],
            "outputs": [
                {
                    "engine_bus": 0,
                    "track_bus": 0
                }
            ],
            "plugins": [
                {
                    "path": "SampleTower.vst3",
                    "uid": "SampleTower",
                    "name": "SampleTower",
                    "type": "vst3x"
                },
                {
                    "uid": "sushi.testing.send",
                    "name": "sampler_verb_send",
                    "type": "internal"
                }
            ]
        },
        {
            "name": "main_reverb_return_track",
            "channels": 2,
            "plugins": [
                {
                    "uid": "sushi.testing.return",
                    "name": "main_verb_return",
                    "type": "internal"
                },
                {
                    "uid": "sushi.testing.gain",
                    "name": "main_return_gain",
                    "type": "internal"
                }
            ],
            "outputs": [
                {
                    "engine_bus": 1,
                    "track_bus": 0
                }
            ]
        },
        {
            "name": "sampler_reverb_return_track",
            "channels": 2,
            "plugins": [
                {
                    "uid": "sushi.testing.return",
                    "name": "sampler_verb_return",
                    "type": "internal"
                },
                {
                    "uid": "sushi.testing.gain",
                    "name": "sampler_return_gain",
                    "type": "internal"
                }
            ],
            "outputs": [
                {
                    "engine_bus": 2,
                    "track_bus": 0
                }
            ]
        },
        {
            "name": "reverb",
            "channels": 2,
            "inputs": [
                {
                    "engine_bus": 1,
                    "track_bus": 0
                },
                {
                    "engine_bus": 2,
                    "track_bus": 0
                }
            ],
            "outputs": [
                {
                    "engine_bus": 0,
                    "track_bus": 0
                }
            ],
            "plugins": [
                {
                    "path": "MVerb-vst.so",
                    "uid": "MVerb",
                    "name": "reverb_processor",
                    "type": "vst2x"
                },
                {
                    "uid": "sushi.testing.gain",
                    "name": "reverb_gain",
                    "type": "internal"
                }
            ]
        }
    ],
    "initial_state": [
        {
            "processor": "main_verb_send",
            "properties": {
                "destination_name": "main_verb_return"
            }
        },
        {
            "processor": "sampler_verb_send",
            "properties": {
                "destination_name": "sampler_verb_return"
            }
        }
    ],
    "midi": {}
}

Or do I need to go multibus ? I don’t know if MVerb supports more than 2 channels.

Please let me know if I didn’t get it right.

Cheers,

Hi Leozor and glad to hear you like our stuff. Feel free to post some demos of it when it gets to that point, we’d love to see it.

It was a design decision made to make the return plugins not passthrough. If you’d want them to be though, that should be relatively easy to back.

Though I do belive your first example can be simplified by just removing one of the return plugins.
Several send plugins can send to the same return plugin (though not the other way around). Maybe the docs weren’t clear enough on that.

1 Like

Ahhhh awesome !!!
Thanks a lot @Gustav !

Indeed I missed that sends → returns flows were many-to-one capable.
That simplifies my setup a lot !

Actually the Return docs clearly state that :

Receives audio from 1 or several Send plugins

So that’s just my bad, I missed that when I was working on my config.

Thanks a whole lot !

I just received my midi controller PCB and will definitely post on this forum when the project is in a working state.
I still need to write my glue app, code the teensy as a midi controller and build the enclosure but I’m making great progress !

Thanks again !

1 Like