Scripnode 101
-
@christoph-hart Thank you!
-
Okay some beginner scriptnode questions for you all.
What's with the beaker glass?
What is the best way to access scriptnode parameters? Create a midi script above the scriptnodeFX like this? If I have logic for callbacks having to do with the scriptnodeFX is the midi script controller script where I should put it?
HiseSnippet 1431.3oc6X0saaTDEdW6LkF2RoEUgf6VEwENsgTanTPpTkebrqrZchUV2.2UMY2w1ixryrL6XmXgxi.OE7hvK.R7HviPeCfyL6tdWm5X4ZVJbA9BKOyYNm467+YbWoviDEIjV1q2aRHwx91H2Ib0vFCwTtU6CrruEhQvRNkOnt09SBwQQDeKa6xOWe.60Wyx74M6rOlg4djrsrrNQP8HujFPUY61c2WPYrVXeROZPtS+3ca6I3MDLwH.LkQ0rBwdmgGPNDqOVIjk8MZ5SUBoqBqHQV1qsuveh6Pw473yeBMhdJinWT2xEDT71sDLeMh06Z0XHk42MUoirrrQcyLAkiMA2G0g5Smtelo3tFBNYbj2dXWZV3UdF3UOO7pkCdyARkxAo0hgz8PtdRZnJiRrqoMWQj8wfYOOThOqk8uhZHfCvUaGfOizRBKlxP0mTq1VNvWa9z9i3dJpf6H3GJTji3U2rxOUY8JWVw4pj52etzzWiTvXD4bIq8zxEwXU9nfSIxsbFiYiHSOHn9yZSQWuMMuK2KVqycPAuMmpNJjvut.AqDSE7qW09.rBCNB6j8fyERjJpFB1GPFCQ0wtk0QGPhNSIBg35kzm8QHBebGgehlOO+VoetDpBnCQJvdHchOeLMtvm37LGSJ51CHJfvHFFrPU23pGaiMeZkJo9eru+K3hSqtQWrDxmfXf5arkSss.uetaJiHbGorB2RCQPnfCKlges7qP4LJmj2klchTmqWJ648uWEtaGQT6oTR5oiTjpuE0i3jTtgq8xbp10iOsHSvPCLicJTOo5bvmVfO5AU5KjNUoOq1ScneW7E2jOlv.O+Tibc8kc3nfo3Lp5lvwe3CMZDHtHAircnjBHYQhXJ+s8qR2Dt+Kq7fG8+YgyjEFm7oyPrKqL4S2IIexkQ8IRKputYUl2zxf5jFJ+wuD9a6rRIx5ylDMAJ9xcyW.1DacSrIo+XNkCflGoAA46nnailP.bFyTNPWqlGQUSx2l8psYVa4Zyr3tfKKbuGpKU4Mb93szbvqta1+v3Moo8GhZ1uOwSkA10Ps9gE1gtvgxchgxsPtPMQSMZCP9DyZmuGOl37bBmHMEBVvvT+9xNLU3ROL0QdJ356Iw7nPQzLB1kDP6AA7Q427UQv7Bje7XsWN+9MDX4bI8lcZAJ4b4wEqFIMgK6EHFwUyDdTdo8IuCC0s1+4Fp68WAgUetS6tu0qAtKD5FDxHo8wLX7ighk8wiXS6tMarbGAWDNTvod4czGSfddCFPj4w9bUHn6HzoNam6u6wD3IH4CZ+7ceIDrgkfchrh1h5KusXQ9qOEECWGcBny+J9sBo3c4kp3cwDacyXP9YnqYFojfrqNC3pFjsOMTvvxqsCU5qk1B8tLSDpfhzx8tiCIpyExyLlqjeCdz3pBtbZXHQ07BrNczZOFSbdWAaRpMPeMlM0SuPS7ufcJdIAhB3bBKs9Kxtjw6dnI+4FsvdfpLoKFZXAgI5A2ffFhbaub0ktBBxbFFeOn4SGHJJFNZgm1BJdpH.LAl4pzulurltI7MiOn24zUIpNBAi9a0gxOId7NDp110r5fuX555v5YHZF2iSLdxYtfohr24hkWj0WBQ9AndCkDRwJzafZoMdEsLoiKXbhflDWTz1SWxX3YBErPaRGLTUzFzCo7B2f1qn08ahZxJ.KZ16mhKoqWAESKouhaiZGchlpGlkJFnNy9BwYAXSYs+1+yJq9r9qd20iEiTT9fNXn0h9gdv6+cgzRuzZpQokSSVWKsZmKg6aV7mvmDh00qsSHVOk36k6H.6IEu1Ktsl1+cSyNfdyM+Cqqi5nW6L8gzwwGAvvwu1ySah+BXV64yyWtB77Uq.OOdE34qWAddxJvy2rB77sKjG86R1ajRDD2MG1naSS9iscSNFhdMQ5V+kZam2d
Also if possible we should rename this thread "Scriptnode 101" rather than Scripnode 101 so it comes up in a search.
-
No tips on how to best access script node parameter's from midi processors?
-
Okay more basic scriptnode questions, what is the difference between creating a embedded dsp network and creating a new DSP network file? (The 3d square vs. the page with a corner turned graphic on the scriptnode front page.)
-
@crd The embedded one is part of your project XML, the network one is a separate XML that can be compiled to C++ or shared with other projects.
-
@d-healey What would the advantage of ever using the embed one? Is that for smaller scripts?
-
@crd Useful for prototyping and for small scripts that you don't plan to use in other project and that don't need compiling.
-
Has anyone successfully exported a plugin with a script node network/dll?
I was able to export for a while without compiling a dll but now I am getting an error:
and the script node workbench crashes whenever I try to compile wrapped dsp nodes into a dll.
-
@crd I'm successfully exporting scriptnode plugins with compiled dll.
-
What's the best way to access L/R inputs to process them separately in SNEX?
Can we use arrays in SNEX?@Christoph-Hart is there an example showing how to use block?
block - a wrapper around a preallocated buffer of float numbers
When I try to initialize an index of a block with a number, I get an error saying statement cant be parsed.
-
@dustbro got it to work for the left channel only, it might be obvious why
data[1]
isn't working but I can't find...// Process the signal here template <typename ProcessDataType> void process(ProcessDataType& data) { for (auto& s: data[0]) s *= 0.5f; }
-
@dustbro oh I finally found a solution
// Process the signal here template <typename ProcessDataType> void process(ProcessDataType& data) { auto frame = data.toFrameData(); while(frame.next()) { frame[0] *= levelLeft; frame[1] *= levelRight; } }
-
@ustk Thanks! What about the function to process the input?
For instance, the SNEX shaper has:
float getSample(float input) { return input; }
Anything other than float input returns a parse error.
-
@Christoph-Hart is there a simple example that shows how to do this with an SNEX node?
-
@dustbro
getSample
is just a way to make an external function from theprocess
one, nothing prevents you to remove it and make your algorithm directly in theprocess
function, or make onegetLeftSample
and onegetRightSample
like below:float getLeftSample(float input) { return Math.tanh(input); } float getRightSample(float input) { return Math.tanh(input); } template <typename T> void process(T& data) { auto frame = data.toFrameData(); while(frame.next()) { frame[0] = getLeftSample(frame[0]); frame[1] = getRightSample(frame[1]); } }
The only thing is that this way of using
process
to separate the channels actually transforms it in a frame processing. So if you want block processing of separated channels, I don't know the trick. -
@ustk said in Scripnode 101:
if you want block processing of separated channels, I don't know the trick
Thanks again for this!
That's what I was doing, but got unexpected results. Now that I look a little closer, it appears that placing an SNEX node into a frame2_block returns a mono signal. -
@dustbro Strange indeed...
-
@ustk Looks like it's my code in processFrame. Lemme see if I can figure out the magic potion.
-
@dustbro That's what I'm doing, as you can see the output is stereo:
-
@ustk The framex_block gets it's stream from processFrame. If you leave that blank, the output will be unprocessed.
Here's the same example using an oscilloscope to see the results of placing the SNEX node into the frame block. I'm inverting one channel for easier viewing.