SNEX nodes - Waveshaping / Saturation / Distortion?
-
@dustbro You might consider moving your formula to SNEX as is might be easier to handle there. Although you lose the waveform, so having a better code area in the Math.expr is a good idea!
-
@dustbro And what happens when you try to compile the network?
-
@ustk said in SNEX nodes - Waveshaping / Saturation / Distortion?:
You might consider moving your formula to SNEX
I'm so confused... isn't SNEX where all of these nodes exist? Between Scriptnode, SNEX, New Layout, Chains, Nodes, Workbench, workbench plugin, Playground... I really don't know WTF is going on anymore.
I really need some completed docs and a proper tutorial on how all of these things are supposed to work together. -
-
@matt_sf said in SNEX nodes - Waveshaping / Saturation / Distortion?:
but actually requires floats
How did you figure that one out???
-
@d-healey and I use this in the playground? or workbench? Or can it be done directly in HISE?
-
@dustbro said in SNEX nodes - Waveshaping / Saturation / Distortion?:
I've not used SNEX but the docs say to use the Playground.
-
@dustbro said in SNEX nodes - Waveshaping / Saturation / Distortion?:
@matt_sf said in SNEX nodes - Waveshaping / Saturation / Distortion?:
but actually requires floats
How did you figure that one out???
Just an idea : seem odd that the node said it can't resolve the math. Tried it. Worked
But actually it also works if you write : Math.pow(int, float) ot Math.pow(float, int).... Guess the result of the Math.pow() have to be float...
(I really like nodes but I'm really not a DSP expert) -
Woah, system error ... information overload...
I really need some completed docs and a proper tutorial on how all of these things are supposed to work together.
Soon. I just want to finalize the workflow before writing the docs because I've already written it twice.
So a short glossary:
- Scriptnode is the entire visual graph DSP environment that is based on a script processor but replaces the
process(channel)
andprepare()
callbacks with the processing of the graph you specify. - SNEX is a language that is a subset of C++ and HISE (not the compiled plugins) has a JIT compiler that is used in various places.
- SNEX nodes are nodes inside scriptnode that dynamically compile SNEX code and run it. There are different nodes for different applications (eg. a node for oscillators, a node for timers, a node for wave shapers). The logic for these nodes is defined in a class that is loaded from a separate file.
- if you have a very simple expression that fits into one line, you can use the
math.expr
node (or thecontrol.expression
nodes). They will also use the SNEX JIT compiler but without the overhead of the class syntax required by all other nodes.
Now for your use case I would suggest the
snex.shaper
node, which gives you a full class and some callbacks to perform the wave shaping. You'll still get the shape display and you can add multiple custom parameters.There are in total 3 different applications which use SNEX:
- HISE itself.
- The SNEX workbench, which is a trimmed down version of HISE and focusses on scriptnode development. The only exclusive feature of the SNEX workbench is the ability to compile SNEX code into a C++ library which can be loaded by HISE (as a .dll plugin). This step is required to get anything that uses SNEX in a compiled plugin (we are compiling the plugin with a real compiler anyway so there's almost no benefit of dragging the JIT compiler around in exported projects).
- The SNEX playground. This is nothing more than a code editor with the JIT compiler attached to it and some facilities to load and run tests. I use this primarily for implementing & testing JIT compiler features but it's also a low overhead option to dive into SNEX (the language). If you click on the SNEX icon on the top left you'll get a drop down where you can load different test files and inspect what they do (they cover most of the language features).
- Scriptnode is the entire visual graph DSP environment that is based on a script processor but replaces the
-
@christoph-hart Thank you for this! I'm gonna tinker and come back with more questions
-
@christoph-hart noticed that the workbench app is missing it's icon after you build.
I have an icon suggestion: :grinning_face_with_sweat: -
Does anyone have some wisdom to share on the delay nodes?
Is there one that can be modulated in real time without artifacts?
How do you sync them to Host BPM?
Is there a node that has a longer delay time than 1000ms? or do I need to mod the source code? -
@dustbro sending you here :
Snex_node Needs to be wrapped into a compileable DSP Network
We discussed the matter, but long story short :
jdsp.delay
andfix8.container
.For the sync there is a
control.tempo_sync
node availableIs there a node that has a longer delay time than 1000ms
jdsp.delay
>> right-click on the 'DelayTime' parameter and adjust the maxValue:)
-
@matt_sf My hero!
-
@christoph-hart said in SNEX nodes - Waveshaping / Saturation / Distortion?:
I would suggest the snex.shaper node
Has anyone use the snex.shaper and could give me some basic guidance on usage?
I've added the snex.shaper node to my network, and selected "create new file".
How do I begin to add expression to the node?
-
Ok... got a little bit further. Clicking on the SNEX logo opens up the node in the Snex script editor:
how would I implement this simple equation?
output = (1.0 + value) * input / (1.0 + value * Math.abs(input));
-
@dustbro following... I would be interested to know more about SNEX too... I'm still trying to de-cypher everything
-
@dustbro try putting this in the getSample function (which in fact can be any other function you call from this one)
Just don't forget the SNEX language rules (i.e. the float numbers) -
@ustk said in SNEX nodes - Waveshaping / Saturation / Distortion?:
getSample function
Looks like this is the spot.
float getSample(float input) { input = (1.0 + 0.5) * input / (1.0 + 0.5 * Math.abs(input)); return input; }
I've added a parameter to the snex module. How do i reference it in the script?
-
@dustbro
float gain = 0.0f; float getSample(float input) { return (1.0f + gain) * input / (1.0f + gain * Math.abs(input)); } /* . . . */ template <int P> void setParameter(double v) { gain = (float)v; }
This works if you have only one parameter, although if you have more then you'll need an enum to find which one is moved so you set the right variable