Scripnode 101
-
@dustbro No but you can use the
prepare
function to store it to a member variable:void prepare(PrepareSpecs ps) { sr = ps.sampleRate; } double sr = 0.0;
-
@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: