dry/wet mix on whole Effect Rack?
-
Hey there, i have a question about getting a Dry/Wet control on my FX section rack.
I managed to get this to work in scriptnode but i have no idea how to do that in the best way inside HISEs rack effects.Help apprechiated, i have the feeling its not that hard to do but i could not find any container for that :)
HiseSnippet HiseSnippet 1100.3oc6X0zaaaCFlxwLyNsaqonXc6lNlBzUXmjl1hdHt9qNiEmnEm9wNUvHQGSDIRUJJ2YTTfhcZ699Kr8SXmyOgg0yCHW2scYGG1Hojsjb87bLRKZ5hNXX9P9J8vm2OzqnEmYiCBXbfQw8F3iAFWD1Y.UzqVODgBZUGX7Qv1n.AlaFAUcfOJH.6.LLV39J.ih4A5q+XypHWD0Fm.A.OjQrwaQ7HhDTqJeIw0sIxAuGwK0pWuRKaFsFykEJ4yBvR.ej8gnCvaiTKKGDXrXCGhfw6HPBbfbMUYNC5zi8LZz5eHIfruKVMnLni7FEACp0i35XMbuF..F4sR14KDsyuBrMwgLBOQAtjdByDKRqAF4lFkJeBnjQJJkOhRKC6XyI9hjYT74BvVToCoKRJ0ooRzZAFGAqwjKfJtgG5PbStbvHCVYiRktto7mqc2tgTaAgQMYzsYB7NzUt1ROeohK8hkLGeptcm3bpGCm45h4SbZk2kOMCWgF5sOlecy9H2P7nEJ29Y0zEmMM0NZWmZgLZKJQriONdbSlqiRqT++08.fXYS9uGzpNRfTNkXL457wbAQQGi539xn5HWTQXcbvgBluLt907exHGlSnKRjMbRk2DOgTOx3CUNJZ.QLHcd03wX4+20iRozi+ic6LR2kgVDgcuIy2bSfuRU6MMeiyX+PXitcw1hDxlG17wSM8L+rEJkPkIlptXJtTXTcShmuK99I0Mi.LUHkmRcS.nN1EkQ.eDwQzKA3qqLgJqsn8kAjVLWDeb4egSqRR4m4XD0Vx7LSL8kgZI+rDg0gDmcH7kfVn2EBH1kEJHzCZiDbx2.LfaG50Q1dgMVRUJE6JePPibpZ+QiKoFqHTGL0QO3ukWwSVVM1HdxxCmLsj7wCeoPsPdebimNRK3xVXjT3olM9pr0BjDpIwU914QLoJR+j0JyQ+32tXEEP4g.+N8Gz.qFCTYs0d0lJf0x1IF0Y8DfBZSt4Pf6b7xGo.1HF33Gjae8Jt032zaO9M8NoJzToYy8ZPQRmRTo1SqxNuscZePjS6BvNHQHWEGqcaWLYbVWVLrJpdjX7Ka9Hr3ddrPpHsjYwwiWr2hEHFG6zqhswLledUXxt3+eooKOLMsSOjOV1xPTa05QlMebV2sNUV+4GUInfsvcEoccJrcIGzKC3WHArj2fzeayVrmkA56dUEotiSmjti7M5AHYSCRoHcdV1vkBU1E6DlsYf6EJXGL1Wio+pqVT+vLQj04j9YLssRvSkjq24iJI8FHF8cwZxqdBpIe7m9qeVlZxlexet0IulLHaM4e96ublZxu7u9se5jWStv6K0jmotpW87tpOuq5y6p98yWW+13Y3gr4rmXGcZTpTyBZD49lpOxwhv1pwlkA5SnRZGrzMJA7HNjmXaqNtgOWpOS1lUmCaVaNrY84vlaNG1rwbXyslCat8TsQcRrplc7hh+k.VMzGUmgQpW6A9GX0Hq6K
-
@Straticah is this for an instrument or fx plugin? You can use send containers (but not from the master container b/c feedback - create another container beneath and route from there) - but this only works for instrument plugins.
Otherwise you can use the routing system to mix in an effect but I don't think you can get 100% wet from it.
-
@DanH this is an FX plugin. So if i would go for a Dry/wet scenario on all fx in the rack combined it wont work well?
-
@Straticah I haven't found a wait to go full wet on an fx plugin (without SN) - happy for someone to chime in with a solution though!
What effects do you need that scriptnode doesn't have?
-
@DanH i guess all of them, eq, shapefx, and saturation ^^ i could come close to these but SN has no native parametric eq or saturation tool does it?
HiseSnippet 1100.3oc6X0zaaaCFlxwLyNsaqonXc6lNlBzUXmjl1hdHt9qNiEmnEm9wNUvHQGSDIRUJJ2YTTfhcZ699Kr8SXmyOgg0yCHW2scYGG1Hojsjb87bLRKZ5hNXX9P9J8vm2OzqnEmYiCBXbfQw8F3iAFWD1Y.UzqVODgBZUGX7Qv1n.AlaFAUcfOJH.6.LLV39J.ih4A5q+XypHWD0Fm.A.OjQrwaQ7HhDTqJeIw0sIxAuGwK0pWuRKaFsFykEJ4yBvR.ej8gnCvaiTKKGDXrXCGhfw6HPBbfbMUYNC5zi8LZz5eHIfruKVMnLni7FEACp0i35XMbuF..F4sR14KDsyuBrMwgLBOQAtjdByDKRqAF4lFkJeBnjQJJkOhRKC6XyI9hjYT74BvVToCoKRJ0ooRzZAFGAqwjKfJtgG5PbStbvHCVYiRktto7mqc2tgTaAgQMYzsYB7NzUt1ROeohK8hkLGeptcm3bpGCm45h4SbZk2kOMCWgF5sOlecy9H2P7nEJ29Y0zEmMM0NZWmZgLZKJQriONdbSlqiRqT++08.fXYS9uGzpNRfTNkXL457wbAQQGi539xn5HWTQXcbvgBluLt907exHGlSnKRjMbRk2DOgTOx3CUNJZ.QLHcd03wX4+20iRozi+ic6LR2kgVDgcuIy2bSfuRU6MMeiyX+PXitcw1hDxlG17wSM8L+rEJkPkIlptXJtTXTcShmuK99I0Mi.LUHkmRcS.nN1EkQ.eDwQzKA3qqLgJqsn8kAjVLWDeb4egSqRR4m4XD0Vx7LSL8kgZI+rDg0gDmcH7kfVn2EBH1kEJHzCZiDbx2.LfaG50Q1dgMVRUJE6JePPibpZ+QiKoFqHTGL0QO3ukWwSVVM1HdxxCmLsj7wCeoPsPdebimNRK3xVXjT3olM9pr0BjDpIwU914QLoJR+j0JyQ+32tXEEP4g.+N8Gz.qFCTYs0d0lJf0x1IF0Y8DfBZSt4Pf6b7xGo.1HF33Gjae8Jt032zaO9M8NoJzToYy8ZPQRmRTo1SqxNuscZePjS6BvNHQHWEGqcaWLYbVWVLrJpdjX7Ka9Hr3ddrPpHsjYwwiWr2hEHFG6zqhswLledUXxt3+eooKOLMsSOjOV1xPTa05QlMebV2sNUV+4GUInfsvcEoccJrcIGzKC3WHArj2fzeayVrmkA56dUEotiSmjti7M5AHYSCRoHcdV1vkBU1E6DlsYf6EJXGL1Wio+pqVT+vLQj04j9YLssRvSkjq24iJI8FHF8cwZxqdBpIe7m9qeVlZxlexet0IulLHaM4e96ublZxu7u9se5jWStv6K0jmotpW87tpOuq5y6p98yWW+13Y3gr4rmXGcZTpTyBZD49lpOxwhv1pwlkA5SnRZGrzMJA7HNjmXaqNtgOWpOS1lUmCaVaNrY84vlaNG1rwbXyslCat8TsQcRrplc7hh+k.VMzGUmgQpW6A9GX0Hq6K
if this can be done in SN i would do it in SN, any ideas? :)
-
@Straticah I think the math operators can do lots of shape / saturation but yes the Hise modules are currently much easier! And no there's no P-eq in there either
-
@Straticah Here is a Saturation example with Mix knob:
- Insert a
snex_shaper
node - Create a File & name it
snex_shaper
- Insert a Parameter (0 - 1 range) & name it
Mix
- Paste the below code to the snex file
The Mix parameter will blend the Distorted & Clean signal together.
template <int NumVoices> struct snex_shaper { SNEX_NODE(snex_shaper); float Mix = 0.0f; float a = 0.0f; float getSample(float input) { //Store the clean input a = input; //Waveshaper Transfer Function input = 9.5 * (1.0 - 1.0/Math.exp(input)); //Apply Mix Knob to blend Distorted & Clean Signal together return input * (1.0 - Mix) + a * Mix; } template <typename T> void process(T& data) { for(auto ch: data) { for(auto& s: data.toChannelData(ch)) { s = getSample(s); } } } template <typename T> void processFrame(T& data) { for(auto& s: data) s = getSample(s); } void reset() { } void prepare(PrepareSpecs ps) { } void setExternalData(const ExternalData& d, int index) { } template <int P> void setParameter(double v) { if (P == 0) Mix = (float)v; } };
- Insert a
-
-
.... and a Saturator based on Faust, if needed, with prefilter and post gain.
import ("stdfaust.lib"); lpF = hslider("[0]lowpass[scale:log]",20000,20,20000,1):si.smoo; hpF = hslider("[1]highpass[scale:log]",20,20,20000,1):si.smoo; drive = hslider("[2]saturation",35,0,50,0.01):ba.db2linear:si.smoo; post = hslider("[5][0]post", -20,-40,0,0.1):ba.db2linear:si.smoo; mix = hslider("[6]mix",0.5,0,1,0.01):si.smoo; trig = button("trig"); sat(x) = ma.tanh(x*drive):*(post); mixer(x,y) = x*mix,y*(1-mix):>_; t_sat_mono=_<:(fi.lowpass(2,lpF):fi.highpass(2,hpF):sat),_:mixer; t_sat_bypass = _<:select2(trig,_,t_sat_mono); process = sp.stereoize(t_sat_bypass);
-
@toxonic do you have experience with faust and hardware modeled saturation like from analog gear? Decapitator from soundtoys does a great job, wondering how i would approch something like this ins HISE. :) PS: it is a tape saturation
-
@Straticah oh, i'm afraid, i'm not! ;-) This here is just a simple hyperbolic tangent saturation, which is most of the time enough for my needs. I tried some other saturation stuff in the past, but that was just tinkering around....
Edit: you can find several saturation algorithms in the internet, but it's not always trivial to adapt them to Faust or other environments. -
@Straticah Ahhh... DSP... Unfortunately, we're all on the same boat, which is gathering information on DSP... But I'm afraid you'll never really find a consistent source of information that can explain an algorithm from start to finish. Yes, the secret is well kept, and the reason is that DSP guys are making their own algos which are the heart and strength of their revenues, and this after years (decades) of work, experiences and lab research...
Yes, I have a quite dark vision on this but it is easy to understand why isn't it?
Now, that been said, you can have a look at some books, they will give you the principles of the most famous effects, saturations included of course. The problem is that they often only scratch the surface, so don't expect to get a complete recipe, especially when considering analog emulation, trust me... The other problem with books is that they often tackle a specific environment, so you have to transpose those principles to your environment of choice (SNEX, FAUST, etc...)
And when you find most advanced books, a great part of them is spent to explain the C++ programming more than the DSP principles themselves...
There are communities too that are a great starting point to understand algos, but often again, they are scratching the surface of simple designs.
Decapitator? Yeah! Definitely a great processor in there that I'd love to get inspiration from! But my guess is that it is a very advanced algorithm for my level.
If you have an electronic background, this can definitely help since a DSP is generally derived from an analog circuit (be it real or not). The main difficulty with reproducing analog equipment is how components are interacting with eachother. A saturation is easy approchable using filter and shapers of all kind and combinations. This will give you something that works, but definitely not a good one (chances are it'll sound like old DSPs from decades ago) That is because in an electronic circuit, the saturation component have a backward effect onto the filter that precedes, and the filter on the rest too, and again, without talking about frequency and gain dependent impedances... This is very hard to derive and program. But FAUSt is made to deal with this and that's amazing. But still, that's just a part of the job and just replicating a circuit in FAUST will not make it sound as the original (I don't have the experience, but I'm confident in this...) because you need to adapt "by ear" and lab measures. Also, getting active component in FAUST might not be trivial, I don't know where we are with this now regarding OpAmps, transistors, etc...?
Another thing I'd like to approach is that a lot of content about DSP are approaching the problem from a math point, so it is even harder to understand what to do with this, of course depending on your background!
At least for me, understanding the math, FFT, how to code all this along with DSP algorithm, measure and give birth to a final and advanced project seems to be a long, very long journey I count inyearsdecades. No, my version of Decapitator is not yet ready to make me famous :)This was just my two cents about how to get in the DSP world. In short, there is no ready made formula to make your own. You (and I) have to start at the beginning, read books, understand concepts, apply tiny things in minimal projects, compare, learn more here and there. It's a lifetime job!
-
@ustk I wouldn't be so pessimistic and it's a bit gate-keepy to expect plugin developers to be DSP wizards in order to make good products. Sure in order to create a truly remarkable new DSP algorithm that stands out on its own you will need to get into nerd town and do these things, but it is not the only option.
If you combine a reasonably well sounding algorithm with a good UI and a use case that solves a real problem for some people it has a reason of existence and can be successful too. You just need to be creative and have a good sensor for what people actually need.
And if you really want to go down the route of making "the best sounding plugin" you can team up with DSP developers who despise making UIs.
-
@Christoph-Hart Good point!
-
@Christoph-Hart my intent is not to be pessimistic so I'm sorry if that's such the feeling in my post. I understand that small but powerful DSP (powerful in terms of answering a customer problem) can be developed without years of learning. And thanks to Hise and now Faust this will be more easily accessible than it ever was with any plateform or framework. Although (but you now better what products are created from Hise), synths (with DSP or no) and samplers are more accessible to create, while DSP effects in my opinion requires much more to learn in essence. And we can't hide that material about DSP development is either poor or too technical, intentionally or not…
But still I have good hope for me and others to see new nice releases shortly! :)
-
@orange @Christoph-Hart
Completely unrelated to wet/dry... in a formula like @orange posted:input = 9.5 * (1.0 - 1.0/Math.exp(input));
It only affects the positive side waveform. Do you have any quick tricks to process +/- evenly with an equation like that?
-
input = Math.sign(input) * 9.5 * (1.0 - 1.0/Math.exp(Math.abs(input)))
It's just a random shot, but if you take the absolute value so that every input is positive and then use the
sign
function to invert negative inputs, it might work. -
@Dan-Korneff said in dry/wet mix on whole Effect Rack?:
It only affects the positive side waveform.
Sorry it was just an example. This is a Logistic Sigmoid function, for both 2 sides you can process positive / negative portions separately like this:
if (input > 0.0) input = 9.5 * TrshPos * (1.0 - 1.0/Math.exp(input)); else if (input <= 0.0) input = -1.0 * 9.5 * TrshNeg * (1.0 - Math.exp(input));
TrshPos
&TrshNeg
parameters are the Threshold values for + / - portions (0 - 1 range)So if you also adjust the Threshold values, it should give this:
-
@Christoph-Hart Impressive! You're hired.
-
@orange said in dry/wet mix on whole Effect Rack?:
Sorry it was just an example.
No worries! I had a very convoluted equation going on and got lazy.