Two Samplers One Filter
-
What's the best practice in a situation where I have two (or more) samplers (each in Synthesizer Group) and one main filter, with the option to disable the filter for selected samplers?
Right now, the only solution I see is using separate filters on each Synthesizer Group, all linked to the same parameters so it appears as a single filter to the end user. This works functionally, but I'm not sure if it's the most efficient approach.
Is this a good solution, or is there a cleaner or more standard way to handle this?
-
Pit them inside a Container
and add Whatever effect you want to the container Fx @DanSound -
@ILIAM said in Two Samplers One Filter:
Pit them inside a Container
and add Whatever effect you want to the container FxThanks for the reply. But how exactly would you handle switching the routing per sampler? For example, if one sampler should go through the filter and another one shouldn't, what's the best way to set that up inside the Container?
-
@DanSound You can do this with Send Effects and a Send Container.
- Sampler 1 has Send Effect 1, sending to Send Container 1
- Sampler 2 has Send Effect 2, sending to Send Container 1
- Send Container 1 has Filter 1
Then use a script for each Sampler to simultaneously toggle:
- Routing the Sampler to the master, and
- The Send Effect bypass
This will send the audio from the sampler to either [1] the Master output, or [2] the Send Container > Filter > Master output.
HiseSnippet 1707.3oc6Z0sTaaDEdEFk.Ns4+1lbmFldgokgAIHjjgoCNXvIdJDbhoIsSuHcszZaMQZWUoUT7jIyj9pzWjxE8An216ZeCReBZOqjr8Ji.LN7aq8EdXOZO69se6YOmuE4p9LSRP.yGojeq1dDjxGoVqMk2pTKrMEUYUjx0TKa6vI9OmExsoMQqz1CGDPrPJJ4drnSJSNNJ5y6WdErClZR5YBgdAy1jrtsqMum0pE+ZaGmxXKxV1tR8dghULYzRLGVH.nbpyg7vluF2j7TrnaiohdBNnER4KTMsVvbAyEqufNF23950WjT+A52Wm7.y6Y8PSSr48papO+7XjxkVyxly7qwwbR.RY7UXVsq0h8Sz3I3E1A10cHhF5nZvLGatLywRrDEVQkZY6XUsCSEfPJWtZOdKWLuca0Mrsr6ZuG+c8nGn0yCYBTYrzvKWJ3oKCu4jfWFPRQBRiGCoanVyz21i26IB7bE0JTX6rAF1mjgRbeQi8G4TKwfdP4y5heMorOznqGEVbt4lQC9Z5kxmG1qB3Z9t5ZekVTPyrMI7jvjMvbe6cJL0KwaSZv7c0dLgR7wvRUeJv2NtZbjb0nmqADpUp4csFMHl7BSUCdfVbC8zc23P5dznm2l5XSIZMBolbaFUiQiC+2h0roCQWPM9LmBlLWOFEHoYz1F6DRlN+axqAeranUH1f1aDTyrlNDregoWZoXHOa.g2g0Kz.6DPldIs2F4JAZj3D1xBlHJIBBElaFftyvt9L5Sm0vx8CiG02tT9NakvRtTGHWXpTKoolV3cxBqD1woNbnqP1qaACcHTjwAQQS1G+XzG+XLH7iw9vOF6K+X7AvOFCB+XHwOR7xSYbxlzBQq77vpn+G0nQlOKYvbH9Y9XQRS+CxwBzP25DeYdWzQHwP5rMp6e1F4jglwbjTGYzJTa9ldD59khDkPrPlowRPEzUdTdoqljWZkPNmQQ1V8JxjDsgh.tbYDzQdPLxXP9lJqh4XQ1xD3AP1i3ysErgxpjsgZUw4NmTcURvq4LuH7mDX.D3.uB1o6DWjUrc2FuqYQzPLdF623sqSQzdy7C0bXVgNhblxEhDkqSd.DujJ6uHCOMvl2Vtb9wV0oAEh2PspM2rU1XbrLvnH75D.iI0z+X03JC8.33pk+1SlB3xS+cim9qnJJAFUxJZx+D0Lpld.5w98AUOl2.qGaSSN.gs7wz.OV.Dl2KZ4WqQbs2BhqCzkmu97vP9Yc8Hk0UI7PJQeulR0KAUTFnBo9MQwNFMjMVESk5z2sKzN0Hsg8NxMWihgMrZDXkasYfIPLBdV9XQ0PnRzKss3sjF2+Txrgr4mf8sf8PyTKbN1mWsENH8xrm4T.TI2AogUeH0vdoSJMriOXGANX3cAHoVJI2S1Ai0rc8bHqQ2l3.kVhv3MgZIMvgN7NVSencCFk40hQsSEh7bBnBtYSRpHuLWPOhyAAI8rb6hOm.hpBjNH+4EWGTrg8AdhLjbg9Q95GYtecG0X3pIxzn8grucpFlcfElxMPElN1w6YPQpTayWNd9mPUbGJXFES8UUku+Upp2oqMUXW.ufRcGPCLntNcUApUEpEYG4c+ZtLFuk3++fbHQtS6v2aDu9N6iaScWYPI+SCcqAUoMIIzpPcuxXBcywsmSztC6F03efOIOTWzVI4g5cd3fmBFpfdw4n7moBU0MzhNOqc1ef9Tdi7HHszX+jV9t125TUZojPwyJokWefjVVbjzxQRKOakVZLRZ4Hok+2WZowHokijVNRZ44pMxIhYlqEEGK9+qCzBwWN1tqQ8i1aQ98Kmkzx2ub1RKgZY8Is7jQky3iT4LpZ44gpkIBDuoZUlS6X4dwu6nHPLYxKR5fNygPk8I+XHgZ1g49geq9uT7Yxa6oE3cmhOKD6zGSuhsGyA6+g9dZNjBpiOfgJepZ2Ek1YuJ9qGiTU00KuYxAO3uz5ha8CGX8uGs6e8y+8xh7eUn8e8UwM4SdQlccecRSXhjsrEw0ismKP1QNT5rp2t35LlW7MXsRckUwkJyPpELraw1.G.gdkbXx2h.gpzjx7IwucbY6kBC3L2NKfnewO03DunWZqx2qt3ByBeZ7khueXI3q4273o8wXz4XCXz4sh196tOKBDNmm5MFwoNSctuXgHM2EG8i2UMICZDKewA2WU8Y+O4dKmFygK1zm8Jy3euKhTJSDYAV2zneFjSptgnsVF+JYbAQluxzL8PsGGMFVGmeXcbgg0w6MrNt3v538GVGevg6n3N.OJDpvEeNAg1n5Zw01T5VXUIG5ewp9040Here's the script:
const rm1 = Synth.getRoutingMatrix("Waveform Generator1"); const rm2 = Synth.getRoutingMatrix("Waveform Generator2"); const send1 = Synth.getEffect("Send Effect1"); const send2 = Synth.getEffect("Send Effect2"); inline function onFilterToggle1Control(component, value) { if (value) { rm1.clear(); send1.setBypassed(false); } else { rm1.addConnection(0,0); rm1.addConnection(1,1); send1.setBypassed(true); } }; Content.getComponent("FilterToggle1").setControlCallback(onFilterToggle1Control); inline function onFilterToggle2Control(component, value) { if (value) { rm2.clear(); send2.setBypassed(false); } else { rm2.addConnection(0,0); rm2.addConnection(1,1); send2.setBypassed(true); } }; Content.getComponent("FilterToggle2").setControlCallback(onFilterToggle2Control);Don't know if this is the best way, but it works. Although I can imagine getting in quite a mess if you needed multiple routable effects.
I couldn't figure out how to do it with routing matrix since the filter effect seems to be hard-coded to the 1/2 outputs.
-
@dannytaurus Thank you, this looks interesting and with proper routing it should do the job. I guess the Send Container was added recently, because I don't remember it being there a few years ago. One question though: is there a reason you hard-panned the Waveform Generators left and right? At first I thought it was an issue related to the routing

-
@DanSound The panning is just to make it obvious which sound is going through the filter.

-
@dannytaurus Ahh, got it
It seems the downside of this method is that you canβt use envelopes with the filter. -
@DanSound Yeah, I assume it's because the Send Container doesn't get the note triggers, so anything triggered by a note, like a voice start constant or triggered envelope, isn't available.
If you need envelope on the filter, then ScriptNode is likely the way to go.
-
@dannytaurus Yeah, or separate filters on each Sampler π« Anyway, thanks for your help!
-
@DanSound I'd try filter on each sampler first. Do some CPU tests. The code to sync all filters/envelopes/etc. from one set of controls is easy enough. And it will give you much more flexibility.
-
@dannytaurus Yep, I've seen a few HISE-based instruments with independent filters on each sampler, and the CPU load seems fine.
-
@DanSound best practice is to use separate filters in each sampler's FX chain - and have one set of controls that manage all the filters....
-
@Lindon Thanks for confirming! That's exactly what I'm going to implement. Now I'm confident there isn't a better way.