Scripnode 101
-
You can read everything in the documentation here : https://docs.hise.audio/scriptnode/101/gain_example.html
Graph Shortcuts :
Shift + Click : Enter value
Ctrl + Click : Fine-tune value
Double click (on target) : Disconnect source
Alt/Option + Click : Show range editor on Hover
N : create node
C : Show/Hide cables
P : Open Properties
Q : Bypass node
F : Fold/Unfold nodeRange Editor Shortcuts
Shift + Click : Enter value
Ctrl + Click : Change value by increments
Double click : Exit range editorI thought about starting a thread for Scriptnode newcommers. I didn't find time to dig into how to contribute to the documentation yet, so this topic would be a "Get started with scriptnode" starting point. I'm not an expert, so please correct me if I'm saying dumb things.
Feel free to contribute to this thread !HISE version : latest develop branch.
First thing first : create a DSP network :
Create a scriptFx moduleThis popup will show :
Create a DSP networkCongrats ! You've finally created a DSP network and entered the scriptnode graph editor :
-
Let's build a "Hello world" Gain Knob :
Once the DSP network created, click into the graph. You'll get this popup showing :
Here you have access to all available nodesType in the search bar : "gain" and click on the gain node to add it to the graph :
Here we go :
Done. But let's make this gain knob available in the script editor so you can manipulate it.
Open the parameter control bar by clicking on the little upper knob, then click the "plus" icon to add a control, and name it "Gain" :
Note : When you add a parameter like this, its range is always 0...1.
Although it's possible to leave the knob's range as it is, the logical thing to do here it to modify the range of the knob.
Right-click on it to access its setup :And change the min/max values like this, and click outside the box to close it.:
NOTE : You can access the setup of every node and parameters by right-clicking on it.Now click on the target icon to acces the "connect" mode...
... and click'n'drag a cable from the control to the parameter you want to manipulate (here the gain parameter) :
Then click again on the target icon to exit the "connect" mode.
Now, how to manipulate the gain via script ? :
In the script editor, create a generic script reference of the ScriptFX module :
const var ScriptFX1 = Synth.getEffect("Script FX1");
Create a slider in the interface editor, and don't forget to make its min/max values the same as the network's parameter (here : -100...0, since it's a gain knob) :
And create a custom callback for this slider.Now you can access the network's parameter like any other in HISE :
inline function onknobGainControl(component, value) { ScriptFX1.setAttribute(ScriptFX1.Gain, value); }; Content.getComponent("knobGain").setControlCallback(onknobGainControl);
Here I did it by script to show how it works but you can also do it within the Interface editor.
Voila ! You got yourself a nice little gain knob made with scriptnode. You can now start noodling around. :D
HiseSnippet 1567.3oc2X8zbaTCEWqc1PiaggBsCbbmLbvclRFaSKvLcXhSbhKdnNwSbHs8TQYW4XMVqzN6JmDCSuyMNCm3NW3J2xGAlgu.7QfuAvSR6lUqiapw8OLTex58O8SO8zO8z1KV3SRRDwHmU1eRDA4bM29S3xgsFhobTmsPNuiaWbhjD6YDs4jHbRBI.43T99JANqrDR+6uVeSLCy8I4hPnCDTexCngTYtzdM+JJi0FGP1mFZY8cZ1wWvaIXhw.dJ6VCEg8GgOhrCVYVIWjyxaGPkh39RrjjfbVZSQvj9CEmvM1e.MgdHinFTG0GBjQbaAKPgX0+QsFRYA8xV2IHjiau7rPYSV3FtcoAzykmmMdWsBubOryGNkJBuxEfW8mE7lAjbrfzRFHcc299wzHYtFEdtpaGNr4L.CocanXrEU5WbbaI.K3x0BwiHsigAm6Q0F2s1s8pe2Z25dUp.o9Do2w3XOiuseTcuuvSWLr1QD41CFP7kUW0nzCztpxqJTNixIdCFy8kTA2SvGwEGppLTyarfU0WDFI3.BtMDc1Xxsp7cUV474XsDhbCoLld3XIoZtXUDxb3dUdJLUYqC.LsxBY0UylsUukJRoyYKLicHT6T8BnAhkET2QHI6xqpQTkmVwaZUCFLScowhQhmoZUUc7k4XU93vCIw14CkgvVcw5mkmu5GeShwxPAuCmJ2MhjNN+.P8YTsgRyrp5tTDBlJ0UcuSZUWeFMfDinPPp3lkSQZ7aebG80c1BKwYQBBJLQQjXIUsdb1hbLPGXpmWwcKRxHoHRaa59ID84YdOMeN2s4j7AcZFJBRisO8PBCEZyP83yBwmZCWfWKpO8a0Kge5GU+9s0SFOX.Erx00KXSv+f.FomHgp1By8swYnKdDEHGDAiYXYQFCEjSUnhg8wT0QQND6I1znSSirzytLn1LY4l4l7bB2q61iJ8GNa7VZF3E1qeUi2TR4210PBkC1kba+nKkAdo46Dzy4BhYvFWwMipRCjq4lyKNKdXmu2MmGHJlDgiI6K5wvSplfCiXj8.7dauCYB+QpBxKRdDYfvlJKp5ODy4DVxhvwr7Ko6nP6IFKo7i5hAxa04kcFG1Gt41mzJEcfLmRJ5Ey3Zpwp5k9DdfdveC+RUVWM1IUY8Lk4LSncHxSDwizaGo+G1LL49DcR9ICNsNZCFSbhhNglV8B6AZY8DrIQCEbpuRjwhLjtQnXrh6w.WmR6nIQVtM1GRTS5gkCUmKTzrPgGIdM+yK.uh6QveaeJR4RVmKlUILEgZFMnukBUDPttGNFZoAtEVQJVxorEIooZSMBNiUxr95jbfRqOlgNvv3B.UMilrgFstJSWVCGTAfeU.3wj0zJleT5TxFSHK.C0CmOB47Vco7CJdKviOqK9zCl9lg9VTsvveVQ01eD4DCVSkd1Q+5MaZVHZd9KDkMFKEgPgqlLBYgikuHNPnKfil+Py4BGey6u0erto8p9gBgbHTmOMXtSymy7+xHObM28HPaMlnbgXUbawwFNVIwEDYFYSiL8ETS4Jbik51dNQSAkjd4e5PnDQU00I37pyygoQ1KBFujr21mBzrIIZD.01nMEhQgXMAxB0jh88Q2zn7ptODeLQ2grlL3l5wCDwgd2m.7DpKVqeIOX52m2GLEM2OXZWeI.g8iw7jHQBotcjmRWCacaQji4EM2HpfUpkWaX4YY2UZlIrgsvdXdgfAiKDotTq9v9y02lig6b5SfUSvtI9vhEOUIWuwrDxCoAxg0scLWbCaweINN.1W7KzkR4Ep0fhMuYY+L5SX4WUOj70ZGfu3MrVd9f6yoSqUxvXeppCos4GSXvwTMFeO3b4.7XlLSZwyYcEbQ1k84U.6QfNUN5HRgBqYtffGjBudLWxMZtGgQvIVm89nlO.5E.G207fiEIW7u+a.Ly8qOz0.WOE4f2aFOzn7aPOz3UwITf+7+O6zefKvo2vSuc68e+98qi2s75XNBw9whm3adtmhv3JZIv5lq+doq31UM1qd1mow0s1Z0TeQC5S78U0zeLjelsOMV.e9jEvm6r.9b2EvmOcA74yV.e97K0G0M9oufQU+CB5sstSTGGSGP5iBn+A.tUO2.
To be continued...
-
Let's go a bit further and create a L/R balance knob. This example is only here to demonstrate the L/R signal manipulation. Althoug it will be usable, a proper L/R balance control would need a bit more work than that :) .
How to split the L/R channels ?
Let's start a new network and add a
container.multi
node and rename it "ChanneSplit" :(Reminder : to rename nodes : right click on the title bar)
Now, add a gain node and duplicate it with Ctrl/Cmd + D :
See the cables which connect every nodes ? this is your signal flow. Follow it and you'll never be lost :D
Now we'll add aparameter control, and set its range to -1...1 :
Connect the Balance control to the 2 gain parameters :
But in order for this to work, we have to modify the range of one of the gain parameters since we want the Balance control to handle both the L/R levels.
Lets give the gain nodes a proper name and invert the rightChannel's gain values - node values AND connection values - from (-100...0) to (0...-100) :And voila again. Now you know how to split the left and right channels.
HiseSnippet 1611.3oc6X8zbaTCEWqc1Pi6eFJzNvwcxvA2YJYhCo.yzgIN+s3g5DOwgT3TQYWYaMVqzN6JmDWldiCbiy8FeD3BG3T6GAlgu.v2f9M.dRZsWs1tAGSZZOfOY8jz68Su+7SuUMhE9jjDQLxYgC5GQPNWysYetrylcvTNp1VHma3VGmHIwdFQazOBmjPBPNNEefRfyBygz+d4ZafYXtOISDBcnf5SdHMjJyj1n5WQYrcvAjCngVqd0p07E7MELQO.OEcWFEg86haS1EqVVAWjy7aGPkh3lRrjjfblaCQP+lcDmvMq+PZB8HFQMnBpInHi3cDr.EhURQa1gxBZL3bmfPNtMx7BEMdga4VmFPGJOya7t5I7x1gs+voPd3ULG7pXCuksf2DfjiEjly.oa51zOlFIylQgmq5ViCAmVXvsaCEyZQE9UG2MEvJ3xkBwcI6DCCFtixqbukuqWk6s7cteoRfqOQ5cLN1KMLtyodegmNYXo1D41sZQ7kkWb3jKp1DkynbhWqdbeIUv8D7tbwQoqQY3XAqruHLRvAHbWP8rdj6T56KsvP8rTBQttTFSOpmjTNSb5+Frm6W5of8FbV..s4.sVdQKat3cT5K0xahYrifTnxSBVfFsf8tBIYOdYMzJ8zRdiNUqVSbtTcwHwSbZU9c7Yswx7dgGQhscLpEBA87YRtu5LI6Dcei6wZgBdMNUtWDg+pR+Qo9TUVWJpfkJ04b2HMmqIiFPhQTH055tVtRjF1oUvU+qm7COG8001BKwCTFnWvVQjXIUcLb1hbLvGXRnWvcKRRWoHRu1zfIThOkl9zLhicq1OaPspg4XkddHMHfQZHRnJeuM4DZ7pLn9VDzigk4K5ULcoSnzgcklpZhC5tuMS3nLAyMcLAmMQ0zB2a51fJ86LY7VXB3EhVutwaJu50cM7HYfcN2c9lyjD8bCkokPsTZFFXeCS5PtmIwj57itY0uQwjHbL4.QCFte4DbXDirO.265cDS32sI8IjwK5iLHXC0JJ62Ay4DVxrvML+TeKSky7VFz9hdRJuccLv9BkSt61KrIb2KPQlhNPlSAEEgY7xpwpzklDdfdveC+RmrhZrS5jUFLYF6BZWh7DQbWczH8+PrP45ulah1I+3VmVAsNiINQwGPSSdgXfVVCAqeTGAm5qDYVw.jtdnnmh7v.WmB6JB.Gv76f8AGU+FXYGUYghdDx6HwK4OL+yNrq10f1OLGTvJgZVIn4ibIEf6tANF5KAtJUQrUvonEQmIeSMBpxJXNh0RNTMqOlgNzvZBXUYQiCQCXW0Rutq4P0LhAcM8JOBg8XR54.x4A3PKWHmkYjVxTWZdKeUvxwjkZqbamCaVHmMs7XPN4vQHm2oNken0UIvuu8E0wmNhLH2RRhTUWox94m8reaslcImXvZpzWz9WtcU04YdMuMZLsrdOoHDJdz7gHKbL+33.gFCGU+opSEN9t2eq+XMSNVyPgP1Ap0FELqV8ew9WD9gq4tOA5JxnkwzExJC3Ftwz1cdKIEXBtdvc7+o.uFRArCK4iQN1XSooEFPXhFGou74iizWt1HH0f9QQpdkiALcWjbh9lQMaU1PHkQkEVKXTdqg.VMUZ7+h2ot8oPS.IIZf.o7nIBrQJmlNj8eMseTjsgPzMDqu3cl5N2tMtaal7ptOBeLQ+sg5KQusdbKQbn2CHvkSp9QqbFOUvuOsOUPzT+TA64KAHbPLlmDIRHUr07Hysh8baQj834WtQTtUoNd6.GOq0ckpCDthsvFXdNkAiyoo5TqOb4OWaaNF5UqIANMA6k3CGV7H0DM5wRHOhFH6TwdiYhWwV7WhiCf3hethnhScG0miWMY925d0jKuOm6h4gcVX.FaRUe.w17iILnZTiw2CJ+ZggV7FHMe4TcAWLnW3r.89DnQ91sI4xel3AZcoD62MSxsptOgQvIVkXeT0GB8Yhiqq6NXl7EUN2Ox0DiWenqAtdJN.u2HwsKjO8t3T8o2WHXb1+b6KgpOfB7s6n3G3BTwq3oCkduYhkWFeZ9kgMBw9whG6adQCUQ+UzRfyMW+n9K3VWM1qxfmRz0c4kVFEBWW7XeeU95GC29L48rxLrmOYF1ypyvdt2LrmOcF1ymMC64yOy8ntoN8qiT47ffFaqaZzwwzrhN8G8O.e9J+E
-
@matt_sf Thanks for doing this - I think it's exactly the level of complexity which most people are getting stuck, so this might be useful to a lot of people.
Just a few remarks about the examples:
Use the Parameter Range Editor
Editing the parameters using the right-click context menu is just the fallback and there is this range editor that allows you to change the parameter range more quickly:
Apart from the ability to drag the min and max value as well as the skew factor with the mouse, there's a handy context menu which allows you to quickly set it to different presets, or in this case, simple copy the target range to the source range (so that you don't have to edit the range of the main parameter).
Use XFADE instead of parameter ranges
the panner is better implemented using a
control.xfade
node - then you don't have to fiddle with the parameter ranges and can change the pan laws by selecting different xfade algorithms.HiseSnippet 1477.3oc6X8zbaTCEWqsWm+zRoEJLLbxG5gzYJAanTXFNXm3D2wC0IdxlFJmJpqks03ckVzJ6DCC24Fm6s9QfqbKeDXFNyLv2f9M.dRZs2cc1j53ZZN.9Plnmzae+z6868zSpsf6RBC4Bj0ZGNNffrttsyXlre89XJC0bGj0MragCkDQIinsGGfCCIcPVV4enRf0ZEP5eur51XOLykDKBgNhScIOh5SkwRaW6qnddMvcHGR8Sr56WqoKmUm6wGB3IucYT.1c.tGYOrZY4rQVE2sCUxENRrjDhrJrMuyXm97iYl0eDMj9LOhZPEjC7gLh2eDQLhRNtA2qiB4JYn58odcZOY+GhPV1si8F4Mdiaa2h1gNUdrW4l5IJEqQR+hUtzvLeJXV47fYFPxJAjJXfzsrcbEz.Y7LJ7bM6lLHH0ECt+jPwrVj0o104vBXxM8wCHMDvfoJrwCJW9dkf+b2ur6PlqjxYk3r83Rx9rMt65+v5qs9OtdoYmpa2LmSYFA2yiHxbZUDWbQJtAan+yHh6UZD1aHY5BgseZeZw4ym5Z10IVHm0jQk6GPhFGSJpjQD.E41f+6wM2AKwpfRjLXcADgjpfi0NjQ.S2DhVydGR3.IO.35mI9ALGdmgdXYZ5jJWJZBvejJFpBTrPpbbxbsY4XENe+Q4D9iWwtcNg6sraSkt8yFu4x.ufW6ea7Fkw9V161sKwUFC1B1MdxhldV9RmdtdT5IXSkwudzvRMdRkLSL+I63jf.AI.KHGxa6gGuQH1Ovib.fw6U5Ydb2ANzumb1Lm.CD1VshMb6iYLhW3hjfUbIUzBc.enjx50BKEzSfxp6Mz2AJo6RpGgNPlUNUtkYbY0XEGwgv5nG72vunIqnFaEMYkISlHsbOh7XtXfNbD8+Pvv36C0N4m18jJns773GWm6GPiXrPLPKqM2abPeNi5pDYVwDjtkOeHXjH3ZkaOdGvATrA1EbTiaik8U4BpZL.YiH1zcJoKksUpM4XMyNELiuB9pC0RwJ.+car.NuCpMqJqjyJehxLFFmZDjakyXmlgGol0E6gNREQUJosXXLhsUKcU6S5Bm4JPof+M0vG3EaFM67CVqBofVtYf1aqB7I1LQny3KQyr3hpxLjIqYU6GA9Sr.ghKwbHVziHU7KmiUEelN1JWRAQ0mYDMsOL8Pj0JpsWyNJC1SEqlhOiLcGMsnrHbLo702bZK7IyHCvgjDnxIij8hm+7espy.nMCs+MR5o89k2q1tm.o1ggZD.NQzh.3Uz.txUDhSDGUjvIi.XcVaCQsyX6WVcFaavyr1VuREeXEayGXlOyeVcqgRtOTgpyTddD8dEa+gdRJ5bSNMSeIn2ox7xLkJhDkxjWCLofrodhKgwxkxXob24uX28qan1rQz7ny7UR6sSfihyUXu1OWatvw29t676UMsw53y4x9vwGyBl6W6UX+kge351GPBIxL4dQbfozMS53+G6+ORrOYX47KGVT8kV2tMG5+UU7b4Wcbppu3C+3+3NE+qpy2wGSO8O04GSJyt7g4rGfrMmOvGq6S609lT2vLIPXfB65mqP2y06qGW5qwiHkdHAJ4qtzRkK3EK9s48EKBl6WrXeWIX9CEXVX.OLseh3SOjyT6wXgONDtLN46NP0hSR404XQlS8xpMfMYl53fkCE5dklz2Zhqeketu9Uxt6SeqzDqOiKCU3J34St36m8l612KmqPt1DL5PUW8aW1HhGjXnw36.YBcwPKLSjllX2hy3StESbT+.BbErd8HoauJqMzVRI1cPrjaW6.hGAmjAemZllx0MpuX9hK+qckY75CrMvsjJarzURbao7RI4mqWJYofwqfWG4Mx6.7lvF9XWA+oQWSVwSWUKA12L8CSulcK03RUPihthqc4MKi7gJbO00U4h+HnfY157IKfNe5Bny8W.c9rEPmGr.574KfNewEpi5vkn1WUobff16pa4vxZWFFXuZlN5e.SLLjjA
-
Ok now, let's take a look at the
container.split
node which creates parallel signal chains.Let's build a little reverb wit a Dry/Wet control :
Add a
container.split
node to the graph and add 2container.chain
nodes. These will contain our stuff :See the signal cables ? You can see that the whole signal is send to both the DRY and WET containers and not split into left and right as in the previous example.
Now add the required nodes like this : 1 gainNode for the DRY channel and a reverbNode + a gainNode fot the WET channel (type "reverb" in the serach bar to find it) :
Now will be a good time to introduce you to another type of containers : the
container.modchain
. This one is here for you to put all your modulation nodes in. It can contain oscillators for LFO purposes, envelopes and more.
Here we'll just use it to handle the Dry and Wet levels and for this, we'll use a nice and handy node that Christoph's provided : the Xfader node.Add a DryWet control at the top, a
container.modchain
+ acontrol.xfader
to the graph :In the Xfader menu, select "RMS" and connect everything like this :
Done ! How simple is that ? Now if you want to build you own reverb and manipulate it via your interface, just create parameter controls and connect everything :
Keep in mind though to take care of the control's ranges, depending on whether you're controlling linear values, levels, frequencies, etc...
That's all for today, have fun !
-
@christoph-hart said in Scripnode 101:
Thanks for doing this
My pleasure, I wanted to do this for quite some time... Thanks for jumping in :)
Use the Parameter Range Editor
Editing the parameters using the right-click context menu is just the fallback and there is this range editor that allows you to change the parameter range more quickly:
You're right to point it out, I was aware of the range editor but I'm used to the right-click... I must change my habits !
the panner is better implemented using a
control.xfade
node - then you don't have to fiddle with the parameter ranges and can change the pan laws by selecting different xfade algorithms.Done in the last part, of course it so much simpler :man_facepalming:
-
@matt_sf I've added this to the "official" hise_documentation repo (it was basically just some file reorganisation and copy pasting of your "raw" post content.
https://github.com/christophhart/hise_documentation/tree/master/scriptnode/101
The "compiled" version looks like this:
https://docs.hise.audio/scriptnode/101/gain_example.html
I would suggest that we keep this thread for discussion but put up a link on top of your first post to the docs so that people who just want to read it get a concise and bloat-free version.
You should be able to fork and create pull requests from the markdown file whenever you want to edit / add new files there, but let me know if you need more information. Just two things about the general markdown style (the forum is a bit less strict):
- if you use
inplace code
like this, just use one backtick (you've used three backticks which usually indicate a code block). And if you prependjavascript
after the first three ticks of a code block, you'll get the nice syntax highlighting - I'm using the
>
quote character whenever there's a background / additional information that does not follow the normal text flow. I've replaced all occurences of "Note: ..." with this format to make it more concise with the rest of the docs style.
Now back to the actual content:
Now will be a good time to introduce you to another type of containers : the container.modchain. This one is here for you to put all your modulation nodes in.
That's not 100% precise (and for this use case you don't need the modchain container, just add the xfade node directly. What the modchain actually does is creating a monophonic and downsampled signal which will not be fed into the original audio signal and thus is suitable for modulation if you put a
core.peak
at the end of its nodes. - if you use
-
@christoph-hart said in Scripnode 101:
You should be able to fork and create pull requests from the markdown file
No problem, I'll correct everything and make a pull request this evening :thumbs_up:
@christoph-hart said in Scripnode 101:
That's not 100% precise (and for this use case you don't need the modchain container, just add the xfade node directly. What the modchain actually does is creating a monophonic and downsampled signal which will not be fed into the original audio signal and thus is suitable for modulation if you put a core.peak at the end of its nodes.
Oh ok thanks, I usually do this to make things clear in my graph but it makes sense.
-
@matt_sf There's a
container.offline
node which will not pass the audio signal to its children, which is better suited for "hosting"control.xxx
nodes as the mod chain has a little bit more overhead. -
With the new development version, do we have to compile scriptnode same as with the master? What is the procedure here?
-
Is there a vibrato or pitch shift node?
-
@dejans for "small" scriptnode effects HISE will include them directly while compiling your plugin, so you should be able to use SN effects in your projects whithout burning too much CPU (I didn't try it with SN synth though).
The scriptnode workbench is still under development but it allows you to create DSP networks and compile them (and thus optimize them) before integrating them into your HISE projects.Something to read : Snex_node Needs to be wrapped into a compileable DSP Network
-
@dustbro A pitch-shifter example is available int Christoph's repo here : HISE tutorial.
I didn't try it but with this example project it would be simple to add a LFO to modulate the pitch. -
@dustbro PitchShifter is here
A vibrato should be pretty easy to do: just modulate a
jdsp.delay
node with a LFO inside aframe
block.HiseSnippet 1810.3oc6Z07aaTDEeV6LIwIokTnf5QefCoRgH6RofDGhyWtxh5TqrgPqTkBSWO1dq2cmkcGmDCBDG6sdfS8FbhqbEINDweAHwI9m.kKbgKk2rytd2wdiqsqSp.QNT44Myru2626yYlVyiYP88YdHsb620khzVBq20g2ZqVDSGTksQZWEWk3yod4kj1rqKw2mVGook8tBBZ4lAE72YquIwh3XPiIgPGvLMn2yz1jGSsVoOwzxpLoNceS6Dq91kpXvb1hYw5.xSVbAjKwnMoIcWhXYYvHsY2otIm4oyIbpOrlMY06p2hcrib8GX5a9XKpXPQjN7gjjQa0xzpdsHc0Ggzv0h07rRM+53pl0M6QOFAVNXh7w6HIFnkYXhTwwPjzRHRyHEoqg0M7Lc4wyHjmEwUb.CRCB.0IEE4ZQZmh2hAKvgulMoMsrGLn2FV4NEJrZd3et4G2niiA2j4jm4rKiSuuyJ2bguZgbK70Kju+oZzH04DrwiYYQ8RcZg00aXabEmN1Ol5sZ9iHVcn8VHn9pX5riFlZH05DKj4TwwjeeWZ33xLq5BrR76As.nPXC90mVYaBmHLJgzf04R83lBwQaa5QfWszDkCuM0uMm4B90CX+.OGV8NVDtp6jHtIbB.OTrgBCkiuIuax3pwvGqvP8wFUQ7Z3ZlbiVoKiYRQFAj5hPFCiLuBdmFMnF7XAbFb4GLoggEF6vvEBCCAdJX9RgCyW9AESM.7o3XmcWOpKwitOqlEo6J9DaWK5dfLtZ9GawLZqa9kzAiPbkhvlhUrhQKhiC0xeRBjlcJkbBsGqC2zoYUB2y7DH84tcr0gzzFzsBkNflVFQLjbbAwXgegN0odvfW.+ENYQwXsvIKFMYhvuco7iYdsCLGg+FLFRr2O.jOrwIEQaXYwNdKlsqYnWJXCBnUiY00sEywzPPRthHIcCaVGfIghqVlcY0A.X1xDC.n5VivaI7+E4R.mMp2ZF8b5T3sXaQkpjZJvFag3KJTo3U.3cMhGTCCxAKRejQKahzIRONwHHdJijOU7OPLqAwBcfvhJ1T.GkHRfDikEmaH9v25v.mIjhRbiDJgxpFcQ+USPyjPPW.aypKgREg75IDxdq3xR.wIDvkvLeCnsDQhPz.NCdz0RL8jJehkAg+mDUaYaSeWHqvlcfraxbOJTDJgSc5IQAH6.w30g5WAaOJnIgmE3E2aD76plNgpbbV5pjS5i1xkz4TWQZnjUbzaSOVBBIoJvoYE0KnnA9xnDrdtQi0uaJrFxIbtrdQbYO5Wzg5XzMl+O5Y+5esxidw5azgyrgrbAUnPCGGNa8AElBiINrTfvjeOQhGz.eez3aH.lMlFh6Bp6EFqGlgXNbsVD+WhSvEDumMn6oTT6Dwx4v9lMuEjNQMP9pXvAo0ZQyMFQwYThhUB4ztLfa4Gn2m4u+lm7K7u6oJ57r3lCjbcQYlqliYN0gnsYGdT9COcPsEzLUs86e9y+4A8qOs4O81kNeC7COcbBvSA0K8rRijb74u01+dX1FcaFi2B55Iovr7O77+nZoWB+mF3vR38n9Tdel9dQZJldWJocpl9fIFCS+LJl939+2m30jxC726mHRadACp.ef4wmz.NUuWL5HnF49tiCA50Lv7M8iS14DnQae+fl.Ak5htRaR3umVqX.VNnwFn270BmcRsB8BGiZp4MDMemPXBQMY+rn9VrZ454w2C5zh3kpoEoer3Pewl5LIIDdVXGZvQO7UGBF4XefmTmB.qpOvhvojAhA22ynY7qTZxM9ShbmKTtK95TvO2JKycIUYIZKmSx1977mCa2whahN2yNImdhaWNsCRzy+RgoWAn56tV3TSmZcYlB0XRG+6UiYNr7pQG3yLAcSWYr6lN1yNwm5aqs5OdVecSqzZUTXx+i+WZ3uR724NPEvjwJgW1wzO6QusBMhdiYN3OWezxxF1kpRJ1vF9l9cQctYWCgm4v5tT.hu.Qmd2N5HgNJ2AQekghO56z+v08CTaxXssIA2+1q7MgeU4jP2zPEgfmVJ3tzdmfw4+LxQz72kB0JD5bwg75R+1n95Rti7qKceCNv988HN9tLeUbhZatOyQniwD+TepvJHOxeB5awHdoN0YqWFTxT2iNg2wKn+qn6iLgyRV0asclQ6VaUeUgDqOkK4dlWCO+0z4oIdM95IJOMPtHYT2TbRicbNhZAAFAx3aBQBMHPuOQTUcrqxbXQ2NcrUeOJ2yrYSpZghzTnM3bhQ6XJWuzdTKJwWI5W1nePy+SFVL9uVYp1qafkhadQzX9+89pWY+O8qdco79NWF7vlX3wNL7n2B+z4Cn.5sSv+IBxgqJFmuH5nviMiKrVAjMjg6PCCAD+dPByz2yslf879Svdt8DrmOXB1yclf87gSvd9ngtGQwkv1cEgb.gZ6Hu2Es3aLJK5e.xKD7r.
Be aware that this is another contender for worst CPU usage for a simple effect (if you compile it the CPU usage will drop significantly).
-
@christoph-hart I'm trying to test out the Pitch Shift example. Getting some errors when compiling the DSP from workbench
Severity Code Description Project File Line Suppression State Error C2662 'void scriptnode::container::container_base<ParameterClass,scriptnode::wrap::fix<2,scriptnode::wrap::fix<2,scriptnode::wrap::frame_x<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::wrap::control_rate<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<1,scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>>,scriptnode::math::OpNode<scriptnode::math::Operations::sig2mod,1>,scriptnode::control::resetter<scriptnode::parameter::chain<scriptnode::ranges::Identity,scriptnode::parameter::plain<scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>,3>,scriptnode::parameter::plain<scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>,3>,scriptnode::parameter::plain<scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>,3>>>,scriptnode::wrap::mod<scriptnode::parameter::plain<scriptnode::control::xfader<scriptnode::parameter::list<scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>,scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>>,scriptnode::faders::linear>,0>,scriptnode::wrap::no_data<scriptnode::dynamics::envelope_follower>>,scriptnode::control::xfader<scriptnode::parameter::list<scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>,scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>>,scriptnode::faders::linear>,scriptnode::wrap::mod<scriptnode::parameter::chain<scriptnode::ranges::Identity,scriptnode::parameter::from0To1<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,1,PitchShifter_impl::smoothed_parameter_mod_0Range>,scriptnode::parameter::from0To1<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,1,PitchShifter_impl::smoothed_parameter_mod_0Range>>,scriptnode::control::smoothed_parameter<scriptnode::smoothers::linear_ramp>>>>>,scriptnode::container::split<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::wrap::control_rate<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<1,scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>>,scriptnode::math::OpNode<scriptnode::math::Operations::sig2mod,1>,scriptnode::wrap::mod<scriptnode::parameter::plain<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,0>,scriptnode::wrap::no_data<scriptnode::core::peak>>,scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>>>>,scriptnode::jdsp::jdelay,scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>>>,scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::wrap::control_rate<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<1,scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>>,scriptnode::math::OpNode<scriptnode::math::Operations::sig2mod,1>,scriptnode::wrap::mod<scriptnode::parameter::plain<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,0>,scriptnode::wrap::no_data<scriptnode::core::peak>>,scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>>>>,scriptnode::jdsp::jdelay,scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>>>>>>>>::setParameter<2>(double)': cannot convert 'this' pointer from 'scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>' to 'scriptnode::container::container_base<ParameterClass,scriptnode::wrap::fix<2,scriptnode::wrap::fix<2,scriptnode::wrap::frame_x<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::wrap::control_rate<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<1,scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>>,scriptnode::math::OpNode<scriptnode::math::Operations::sig2mod,1>,scriptnode::control::resetter<scriptnode::parameter::chain<scriptnode::ranges::Identity,scriptnode::parameter::plain<scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>,3>,scriptnode::parameter::plain<scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>,3>,scriptnode::parameter::plain<scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>,3>>>,scriptnode::wrap::mod<scriptnode::parameter::plain<scriptnode::control::xfader<scriptnode::parameter::list<scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>,scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>>,scriptnode::faders::linear>,0>,scriptnode::wrap::no_data<scriptnode::dynamics::envelope_follower>>,scriptnode::control::xfader<scriptnode::parameter::list<scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>,scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>>,scriptnode::faders::linear>,scriptnode::wrap::mod<scriptnode::parameter::chain<scriptnode::ranges::Identity,scriptnode::parameter::from0To1<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,1,PitchShifter_impl::smoothed_parameter_mod_0Range>,scriptnode::parameter::from0To1<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,1,PitchShifter_impl::smoothed_parameter_mod_0Range>>,scriptnode::control::smoothed_parameter<scriptnode::smoothers::linear_ramp>>>>>,scriptnode::container::split<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::wrap::control_rate<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<1,scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>>,scriptnode::math::OpNode<scriptnode::math::Operations::sig2mod,1>,scriptnode::wrap::mod<scriptnode::parameter::plain<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,0>,scriptnode::wrap::no_data<scriptnode::core::peak>>,scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>>>>,scriptnode::jdsp::jdelay,scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>>>,scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::wrap::control_rate<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<1,scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>>,scriptnode::math::OpNode<scriptnode::math::Operations::sig2mod,1>,scriptnode::wrap::mod<scriptnode::parameter::plain<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,0>,scriptnode::wrap::no_data<scriptnode::core::peak>>,scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>>>>,scriptnode::jdsp::jdelay,scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>>>>>>>> &' PitchShifting_DynamicLibrary C:\Users\Dan\Documents\GitHub\hise_tutorial\PitchShifting\DspNetworks\Binaries\Source\PitchShifter.h 290
and
Severity Code Description Project File Line Suppression State Error C2662 'void scriptnode::container::container_base<ParameterClass,scriptnode::wrap::fix<2,scriptnode::wrap::fix<2,scriptnode::wrap::frame_x<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::wrap::control_rate<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<1,scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>>,scriptnode::math::OpNode<scriptnode::math::Operations::sig2mod,1>,scriptnode::control::resetter<scriptnode::parameter::chain<scriptnode::ranges::Identity,scriptnode::parameter::plain<scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>,3>,scriptnode::parameter::plain<scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>,3>,scriptnode::parameter::plain<scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>,3>>>,scriptnode::wrap::mod<scriptnode::parameter::plain<scriptnode::control::xfader<scriptnode::parameter::list<scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>,scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>>,scriptnode::faders::linear>,0>,scriptnode::wrap::no_data<scriptnode::dynamics::envelope_follower>>,scriptnode::control::xfader<scriptnode::parameter::list<scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>,scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>>,scriptnode::faders::linear>,scriptnode::wrap::mod<scriptnode::parameter::chain<scriptnode::ranges::Identity,scriptnode::parameter::from0To1<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,1,PitchShifter_impl::smoothed_parameter_mod_0Range>,scriptnode::parameter::from0To1<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,1,PitchShifter_impl::smoothed_parameter_mod_0Range>>,scriptnode::control::smoothed_parameter<scriptnode::smoothers::linear_ramp>>>>>,scriptnode::container::split<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::wrap::control_rate<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<1,scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>>,scriptnode::math::OpNode<scriptnode::math::Operations::sig2mod,1>,scriptnode::wrap::mod<scriptnode::parameter::plain<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,0>,scriptnode::wrap::no_data<scriptnode::core::peak>>,scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>>>>,scriptnode::jdsp::jdelay,scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>>>,scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::wrap::control_rate<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<1,scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>>,scriptnode::math::OpNode<scriptnode::math::Operations::sig2mod,1>,scriptnode::wrap::mod<scriptnode::parameter::plain<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,0>,scriptnode::wrap::no_data<scriptnode::core::peak>>,scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>>>>,scriptnode::jdsp::jdelay,scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>>>>>>>>::setParameter<2>(double)': cannot convert 'this' pointer from 'scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>' to 'scriptnode::container::container_base<ParameterClass,scriptnode::wrap::fix<2,scriptnode::wrap::fix<2,scriptnode::wrap::frame_x<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::wrap::control_rate<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<1,scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>>,scriptnode::math::OpNode<scriptnode::math::Operations::sig2mod,1>,scriptnode::control::resetter<scriptnode::parameter::chain<scriptnode::ranges::Identity,scriptnode::parameter::plain<scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>,3>,scriptnode::parameter::plain<scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>,3>,scriptnode::parameter::plain<scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>,3>>>,scriptnode::wrap::mod<scriptnode::parameter::plain<scriptnode::control::xfader<scriptnode::parameter::list<scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>,scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>>,scriptnode::faders::linear>,0>,scriptnode::wrap::no_data<scriptnode::dynamics::envelope_follower>>,scriptnode::control::xfader<scriptnode::parameter::list<scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>,scriptnode::parameter::plain<scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>,0>>,scriptnode::faders::linear>,scriptnode::wrap::mod<scriptnode::parameter::chain<scriptnode::ranges::Identity,scriptnode::parameter::from0To1<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,1,PitchShifter_impl::smoothed_parameter_mod_0Range>,scriptnode::parameter::from0To1<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,1,PitchShifter_impl::smoothed_parameter_mod_0Range>>,scriptnode::control::smoothed_parameter<scriptnode::smoothers::linear_ramp>>>>>,scriptnode::container::split<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::wrap::control_rate<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<1,scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>>,scriptnode::math::OpNode<scriptnode::math::Operations::sig2mod,1>,scriptnode::wrap::mod<scriptnode::parameter::plain<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,0>,scriptnode::wrap::no_data<scriptnode::core::peak>>,scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>>>>,scriptnode::jdsp::jdelay,scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>>>,scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<2,scriptnode::wrap::control_rate<scriptnode::container::chain<scriptnode::parameter::empty,scriptnode::wrap::fix<1,scriptnode::wrap::no_data<scriptnode::core::oscillator<1>>>,scriptnode::math::OpNode<scriptnode::math::Operations::sig2mod,1>,scriptnode::wrap::mod<scriptnode::parameter::plain<scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>,0>,scriptnode::wrap::no_data<scriptnode::core::peak>>,scriptnode::control::multi_parameter<1,PitchShifter_impl::bipolar1_mod,scriptnode::control::multilogic::bipolar>>>>,scriptnode::jdsp::jdelay,scriptnode::math::OpNode<scriptnode::math::Operations::mul,1>>>>>>>> &' PitchShifting_DynamicLibrary C:\Users\Dan\Documents\GitHub\hise_tutorial\PitchShifting\DspNetworks\Binaries\Source\PitchShifter.h 308
Has anyone tested this successfully yet?
-
@dustbro I'm trying... So you can't load a snippet into the workbench? What's the best way to get the ScriptFX into the workbench for compilation?
-
@dustbro ok, managed to compile the scriptfx. I have a file called 'project.dylib' in the dll folder. Opened up the project and everything looks the same as before - The project doesn't use the new dll I don't think. What am I missing?! :face_with_tears_of_joy:
-
@danh Same here. Managed to compile the network but not to use the "frozen" dll version... Works with expr.node networks though
-
@matt_sf did you get a .dll file after compilation? And do you get one when you compile an expr.node?
-
@matt_sf I get this message at the end of compilation, doesn't look quite right to me!